2009-02-24 40 views

Trả lời

103

đặn nó ra ngay sau khi tôi đăng:

$query = $database->prepare('SELECT * FROM table WHERE column LIKE ?'); 
$query->execute(array('value%')); 

while ($results = $query->fetch()) 
{ 
    echo $results['column']; 
} 
+7

Đó không phải là luật Murphy;) –

+1

@ Andrew: những gì nếu nhiều 'like' Được sử dụng ? mảng thực hiện như thế nào sẽ thực hiện theo thứ tự? – logan

+0

cảm ơn. đã có vấn đề tương tự với csharp + Mysql + ODBC sử dụng như nó sẽ không trả về bất kỳ hàng nào bằng cách sử dụng "select * from table where column like '%?%';" nhưng nếu tôi làm như bạn đã làm "chọn * từ bảng nơi cột như thế nào?" và đặt chuỗi tham số như vậy: string frag = $ "% {searchFragment}%"; sau đó sử dụng frag cho giá trị tham số. Weird – sdjuan

52

Để sử dụng Giống như với% hợp phần bạn cũng có thể làm điều này: column like concat('%', :something, '%') (nói cách khác, sử dụng các dấu hiệu% không rõ ràng là không được người dùng nhập vào) với tham số có tên :something.

Edit: Một cú pháp thay thế mà tôi đã tìm thấy là sử dụng toán tử nối: ||, vì vậy nó sẽ trở nên đơn giản: where column like '%' || :something || '%' etc

@ bobince đề cập here rằng:

difficulty xuất hiện khi bạn muốn cho phép ký tự % hoặc _ theo nghĩa đen trong chuỗi tìm kiếm mà không cần nó hoạt động như một ký tự đại diện .

Vì vậy, đó là điều khác cần lưu ý khi kết hợp như và tham số hóa.

+5

+1 - điều này có vẻ như một cách tiếp cận tốt với tôi vì tất cả các kết nối xảy ra trong cơ sở dữ liệu sau khi trình giữ chỗ đã được thay thế, và nó có nghĩa là trình giữ chỗ được đặt tên có thể được sử dụng.Điều đáng nói đến là cú pháp trên là dành cho Oracle - trong MySQL cú pháp là 'LIKE CONCAT ('%',: something, '%')'. Tham khảo: http://stackoverflow.com/a/661207/201648 –

+1

Điều này đã không làm việc cho tôi chính xác, nhưng đã cho tôi đi đúng hướng. Tôi phải làm LIKE '%': cái gì đó '%' để nó hoạt động. –

+0

tôi biết đây là chủ đề không chính xác nhưng tôi đã có thể tạo dạng phun sql với thậm chí sử dụng statment này, tại sao? – NGTHM4R3

15
$query = $database->prepare('SELECT * FROM table WHERE column LIKE ?'); 
$query->bindValue(1, "%$value%", PDO::PARAM_STR); 
$query->execute(); 

if (!$query->rowCount() == 0) 
{ 
    while ($results = $query->fetch()) 
    { 
     echo $results['column'] . "<br />\n"; 
    }  
} 
else 
{ 
    echo 'Nothing found'; 
} 
+1

Có lợi thế nào khi sử dụng điều này qua câu trả lời được chấp nhận không? Việc sử dụng 'bindValue' có bảo vệ chống lại các cuộc tấn công bằng cách tiêm không? Câu trả lời được chấp nhận về cơ bản phủ nhận giá trị của việc sử dụng '?' Placeholders bằng cách nối chuỗi tìm kiếm thành '%' như trong các ngày của olde. – felwithe

+0

Điểm của việc sử dụng phủ định trước $ query-> rowCount() == 0 là gì? Điều này thực sự có ý nghĩa không? –

+0

bạn có thể chỉ cần khám phá mã của mình – rupesh

7

Bạn cũng có thể dùng thử tính năng này. Tôi phải đối mặt với vấn đề tương tự nhưng có kết quả sau khi nghiên cứu.

$query = $pdo_connection->prepare('SELECT * FROM table WHERE column LIKE :search'); 

$stmt= $pdo_connection->prepare($query); 

$stmt->execute(array(':search' => '%'.$search_term.'%')); 

$result = $stmt->fetchAll(PDO::FETCH_ASSOC); 

print_r($result); 
+0

Tôi đã chỉnh sửa bài đăng của bạn để đặt mã vào một khối mã - bạn có thể đọc thêm về định dạng bài đăng tại http://stackoverflow.com/help/formatting. Một số người dùng khác đã chọn để downvote câu trả lời của bạn mà không để lại một bình luận, vì vậy tôi không chắc chắn về nguyên nhân của downvote. – josliber

+2

Để lặp lại, tôi không bỏ phiếu cho câu hỏi của bạn; ai đó khác đã downvoted. – josliber

-1

PDO thoát "%" (Có thể dẫn đến sql injection): Việc sử dụng mã trước đó sẽ cho kết quả mong muốn khi tìm cách để phù hợp với chuỗi phần NHƯNG nếu một loại khách truy cập các nhân vật "% "bạn sẽ vẫn nhận được kết quả ngay cả khi bạn không có bất kỳ thứ gì được lưu trữ trong cơ sở dữ liệu (nó có thể dẫn tiêm sql)

Tôi đã thử rất nhiều biến thể với cùng một kết quả PDO đang thoát"% "hàng đầu kết quả tìm kiếm không mong muốn/không được phép.

tôi mặc dù nó là giá trị chia sẻ nếu có ai đã tìm thấy một từ xung quanh nó xin vui lòng chia sẻ nó

+1

Đây là hướng dẫn sử dụng: http://us3.php.net/manual/en/pdo.prepared-statements.php Đây là một bài đăng khác về chủ đề: http://stackoverflow.com/questions/22030451/php-pdo-like-escape-the-character-khi-kết hợp-với-wildcard Tôi nợ thực sự muốn biết ý kiến ​​của bạn về việc phát hành này. –

+0

Giải pháp có thể (Không được kiểm tra) Sử dụng ** CONCAT **, như: $ sql = “SELECT item_title FROM item WHERE item_title LIKE CONCAT (‘% ’,?,’% ’)”; Tham khảo: http://blog.mclaughlinsoftware.com/2010/02/21/php-binding-a-wildcard/ –

+0

PDO không thoát khỏi%. Đó là mã của bạn mà nó sai. Đối với các giải pháp bạn có nghĩa vụ phải ** đọc câu trả lời đã được cung cấp ở đây ** –

1

này hoạt động:

search `table` where `column` like concat('%', :column, '%') 
Các vấn đề liên quan