2011-09-22 31 views
6

Tôi đang nhận dữ liệu vào cơ sở dữ liệu của mình mà không gặp bất kỳ sự cố nào khi sử dụng mysql_real_escape_string.Trong PHP, làm cách nào để thực hiện truy vấn chọn mySQL chứa cả dấu ngoặc kép và dấu nháy đơn?

Vì vậy, một mục trong cơ sở dữ liệu có thể là:

1/4" Steve's lugnuts 

Vì vậy, đó là một cách hoàn hảo trong cơ sở dữ liệu.
Bây giờ tôi muốn tìm kiếm chính xác điều đó. Nhưng, nó sẽ gây rối tại một trong hai "hoặc" (tôi đã thử một số thứ, và nó luôn luôn lộn xộn ở đâu đó).

Đây là những gì tôi có bây giờ: (user_input xuất phát từ một biểu mẫu trên trang trước)

$user_input=mysql_real_escape_string($_REQUEST['user_input']); 
$search_row=mysql_query("SELECT * FROM some_table WHERE some_column LIKE '%$user_input%' "); 
while($search = mysql_fetch_array($search_row)) 
      {stuff happens} 

echo "<form action='search_results.php' method='post'>"; 
echo "<input name='user_input' type='text' size='50' value='" . $user_input. "'>"; 
echo "<input type='submit' value='Lookup Parts' />"; 
echo "</form>"; 

nhưng vấn đề là, tôi dường như không thể có được bất cứ điều gì nhưng lỗi
các lĩnh vực tìm kiếm (trong đó có nghĩa vụ phải cư với những gì họ đã đưa vào) chỉ có:.

1/4\" Steve\ 

Tôi đang làm gì? g sai?

Trả lời

5

Các lĩnh vực tìm kiếm (trong đó có nghĩa vụ phải cư với những gì họ đã đưa vào) chỉ có 1/4\" Steve\

tất nhiên là có!
Bạn đã đặt sai chỗ trốn thoát. mysql_real_escape_string chỉ dành cho SQL! nhưng bạn đang sử dụng kết quả cho html. Trong khi cho HTML bạn phải sử dụng cách thoát hoàn toàn khác nhau.

Vì vậy, làm cho nó

$user_input=mysql_real_escape_string($_REQUEST['user_input']); 
$search_row=mysql_query("SELECT * FROM some_table WHERE some_column LIKE '%$user_input%' "); 
while($search = mysql_fetch_array($search_row)) 
      {stuff happens} 


$user_input =htmlspecialchars($_REQUEST['user_input'],ENT_QUOTES); // here it goes 

echo "<form action='search_results.php' method='post'>"; 
echo "<input name='user_input' type='text' size='50' value='$user_input'>"; 
echo "<input type='submit' value='Lookup Parts' />"; 
echo "</form>"; 

cũng lưu ý rằng không có sử dụng trong vang vọng khối lớn như vậy về HTML. Chỉ cần đóng thẻ PHP và sau đó viết HTML tinh khiết:

?> 
<form action='search_results.php' method='post'> 
<input name='user_input' type='text' size='50' value='<?=$user_input?>'> 
<input type='submit' value='Lookup Parts' /> 
</form> 

Trông CÁCH hơn rõ ràng, dễ đọc và thuận tiện

+0

Đây chính là vấn đề tôi gặp phải. Tôi ước tôi có thể chọn hai câu trả lời, bởi vì mặc dù điều này hoàn toàn giải quyết vấn đề cụ thể của tôi, câu trả lời của Tomas T. rất thông tin, và có khả năng những gì mọi người cũng sẽ tìm kiếm khi họ đến đây. Cảm ơn một tấn! –

+0

Ngoài ra ... về nó tất cả được echo'd PHP ... Đây là tất cả bên trong một điều lặp đi lặp lại trong PHP anyway - Tôi không nghĩ rằng tôi có thể thoát khỏi PHP mà không gây rối mà loại điều lên. –

+0

hoàn toàn không có gì để gây rối. Mọi thứ sẽ ổn trong vòng lặp. –

-1

In của bạn sentece "SELECT * FROM some_table WHERE some_column LIKE '% $ user_input%'" để xem những gì nó đang làm (và thoát).

Không phải là giải pháp nhưng hãy xem mysqli hoặc pdo (http://stackoverflow.com/questions/548986/mysql-vs-mysqli-in-php), chúng có các tiện ích cho các câu lệnh đã chuẩn bị.

0

không biết liệu nó có giúp đảm bảo hay không, nhưng bạn không nên thoát khỏi truy vấn và một lần khác cho html?

$query = sprintf("SELECT * FROM some_table WHERE some_column LIKE '%s' ", mysql_real_escape_string($user_input)); 

echo "<input name='user_input' type='text' size='50' value='".htmlentities($user_input)."'>"; 

chỉnh sửa

bạn có thể không muốn thay đổi (thoát) đầu vào của bạn ($ user_input) mọi lúc bạn nộp ..although nếu duy nhất của nó "và" Thats ảnh hưởng nó có thể không có vấn đề nào

+0

vâng, nhưng tôi nghĩ OP cũng gặp sự cố với truy vấn. – roymustang86

+0

Thật không may, điều này không hoạt động chút nào. Tôi nhận được Cảnh báo: mysql_query() dự kiến ​​tham số 2 được tài nguyên, chuỗi được đưa ra trong search_results.php trên dòng 19 cũng như Cảnh báo: mysql_fetch_array() dự kiến ​​tham số 1 là tài nguyên, null được đưa ra trong search_results.php trên đường dây 20 Ngoài ra. ..và có lẽ hầu hết nói-ly ... Các đầu vào bạn đã cho tôi cung cấp cho chính xác cùng một điều tôi có, nơi mà hộp tìm kiếm chỉ chứa 1/4 "Steve thay vì 1/4" lugnuts Steve. –

+0

và bạn đã sử dụng phần đầu tiên tôi đã viết sau đó như: $ search_row = mysql_query ($ query); tiếp theo là bạn ...? –

4

Vâng, vấn đề của bạn là đúng đắn trích dẫn. Vấn đề của bạn là bạn cần trích dẫn khác nhau cho MySQL và cho HTML, và bạn có lẽ cũng có thể có magic_quotes_gpc thiết lập!Khi trích dẫn, bạn luôn trích dẫn văn bản cho một số lượng đặc biệt, như: giá trị chuỗi

  1. cho truy vấn mysql
  2. like biểu hiện cho truy vấn mysql
  3. mã html
  4. json
  5. mysql cụm từ thông dụng
  6. cụm từ thông dụng php

Đối với mỗi trường hợp, bạn cần phải khác nhau trích dẫn, bởi vì mỗi sử dụng hiện diện trong bối cảnh cú pháp khác nhau. Điều này cũng ngụ ý rằng việc trích dẫn không được thực hiện tại đầu vào vào PHP, nhưng ở đầu ra cụ thể! Đó là lý do tại sao các tính năng như magic_quotes_gpc bị hỏng (đảm bảo rằng nó bị tắt!).

Vì vậy, phương pháp nào sẽ được sử dụng để trích dẫn trong các trường hợp cụ thể này? (Hãy để chính xác cho tôi, có thể có các phương pháp hiện đại hơn, nhưng những đang làm việc cho tôi)

  1. mysql_real_escape_string($str)
  2. mysql_real_escape_string(addcslashes($str, "%_"))
  3. htmlspecialchars($str)
  4. json_encode() - chỉ dành cho utf8! Tôi sử dụng chức năng của tôi cho iso-8859-2
  5. mysql_real_escape_string(addcslashes($str, '^.[]$()|*+?{}')) - bạn không thể sử dụng preg_quote trong trường hợp này vì dấu chéo ngược sẽ được thoát hai lần!
  6. preg_quote()

EDIT: Về câu hỏi ban đầu của bạn - nếu bạn sửa trích dẫn của bạn, bạn có thể sau đó tất nhiên sử dụng bất kỳ ký tự trong chuỗi, bao gồm các dấu nháy đơn và đôi.

+1

Đây là một câu trả lời * thực sự * tốt! Đó là loại điều khiến mọi người muốn sử dụng StackOverflow, tôi nghĩ ---! Mặc dù Đại tá Shrapnel trả lời câu hỏi của tôi một cách cụ thể, nhưng điều này rất lớn trong phạm vi của nó, và tôi sẽ thường xuyên trả lời câu hỏi của bạn. Upvote cho bạn! –

Các vấn đề liên quan