2010-09-01 11 views
7

Tôi có một chọn nơi như truy vấn cho một hình thức Kết đó là như sau:PHP SQL SELECT nơi như mục tìm kiếm với nhiều từ

<?php 
$bucketsearch = sanitizeone($_POST["bucketsearch"], "plain"); 
$bucketsearch = strip_word_html($bucketsearch); 
?> 

if(isset($_POST['search'])){ 
        $result=MYSQL_QUERY("SELECT * FROM buckets where bucketname like '%$bucketsearch%' order by bucketname"); 
       }else{ 
       $result=MYSQL_QUERY("SELECT * FROM buckets order by bucketname"); 
      } 

Vấn đề của tôi là nếu ai đó tìm kiếm ví dụ cho "quả táo và lê "Tôi không nhận được bất kỳ kết quả nào có chứa bất kỳ từ nào, tôi chỉ có thể làm cho nó trả về kết quả (cũng 1 kết quả) với tất cả các từ trong đó.

Có ai có thể giúp tôi thực hiện tìm kiếm này thêm một chút nữa không? Cảm ơn trước.

Trả lời

30

Vì vậy, bạn muốn tìm kiếm AND bằng cách sử dụng từng từ được nhập, thay vì chuỗi chính xác? Howabout something like this:

$searchTerms = explode(' ', $bucketsearch); 
$searchTermBits = array(); 
foreach ($searchTerms as $term) { 
    $term = trim($term); 
    if (!empty($term)) { 
     $searchTermBits[] = "bucketname LIKE '%$term%'"; 
    } 
} 

... 

$result = mysql_query("SELECT * FROM buckets WHERE ".implode(' AND ', $searchTermBits)."); 

này sẽ cung cấp cho bạn một truy vấn như:

SELECT * FROM buckets WHERE bucketname LIKE '%apple%' AND bucketname LIKE '%and%' AND bucketname LIKE '%pear%' 

thay đổi AND để OR nếu bạn muốn kết hợp bất kỳ của các thuật ngữ tìm kiếm chứ không phải là tất cả. Các cải tiến khác có thể liên quan đến việc xác định một số từ dừng như 'và' để cho kết quả tốt hơn.

+1

Tim, cảm ơn! Tôi mất khoảng 30 phút để chơi nó, tôi đã sao chép trang của mình để kiểm tra, không thể giải thích tại sao nó không hoạt động, kiểm tra mọi thứ, sau đó nhận ra dreamweaver đã thêm "2" vào cuối mục nhập của tôi Tên!!! grrr. Tôi đã đổi nó thành OR và nó hoạt động một giấc mơ! Cảm ơn bạn. Bây giờ chỉ cần tắt để tìm một hàm để loại bỏ các từ dừng. Cảm ơn sự giúp đỡ của bạn !! :) – Dan

+0

Đối với bất kỳ ppl laravel đọc này kiểm tra này ra: https://gist.github.com/clouddueling/4967617 –

+0

Tôi chỉ cần thêm rằng khi sử dụng chế độ OR bắt buộc phải bao gồm toàn bộ điều kiện truy vấn bên trong dấu ngoặc đơn() vì bất ngờ kết quả có thể xảy ra (mặc dù bạn sẽ không biết rằng bởi vì sẽ không có lỗi MySQL cho mỗi se). Tôi nhận được kết quả từ các danh mục không liên quan, ngay cả khi danh mục cụ thể được chỉ định trong điều kiện AND riêng biệt. Ví dụ, thay thế ở trên trong câu trả lời của Tim: implode ('OR', $ searchTermBits) một phần với '('. Implode ('OR', $ searchTermBits). ')' – dev101

1

Đối với trường hợp đơn giản của bạn ở đây, bạn có thể thay thế "và" bằng "%" (nhưng tôi đoán bạn đang tìm kiếm câu trả lời toàn diện hơn. đến trước lê)

0

bạn có thể chia "quả táo và quả lê" vào 2 chuỗi;.... "quả táo" và "quả lê" có lẽ, sau đó bạn có thể làm WHERE bucketname LIKE '%apple%' OR bucketname LIKE '%pear%' tôi không biết nếu điều này giúp

1

Er. Không phải là giải pháp tốt nhất tôi nghĩ nhưng bạn có thể chia nhỏ các từ thành một mảng và lặp lại chúng thành nhiều LIKES. Do một số thay thế để yank ra ANDs, ORs vv và sau đó chạy một phát nổ.

Sau đó, chỉ lặp lại.

$ sql = SELECT * từ Xô nơi ";.

Vòng mảng, $ sql =" bucketname LIKE '% "$ arrayEl [i]." % OR'. Chỉ cần chắc chắn về lần lặp cuối cùng không bao gồm OR cuối cùng hoặc nối thêm dòng cuối cùng của 0 = 1, v.v.

Không thanh lịch, không hiệu quả nhưng trong trường hợp này nó sẽ hoạt động. Bạn thành thật sẽ tốt hơn khi chạy một tìm kiếm văn bản đầy đủ nếu nó là một trường văn bản.

7

Tôi nghĩ rằng giải pháp tốt nhất là sử dụng Cụm từ thông dụng. Đó là sạch nhất và có lẽ là hiệu quả nhất. Cụm từ thông dụng được hỗ trợ trong tất cả các công cụ DB thường được sử dụng.

Trong MySQL có RLIKE điều hành để truy vấn của bạn sẽ là một cái gì đó như:

SELECT * FROM buckets WHERE bucketname RLIKE "(?=.*apple)(?=.*and)(?=.*pear)" 

did't thử nghiệm nó, hy vọng rằng biểu hiện của tôi là phù hợp với MySQL regexp "phương ngữ".

Thông tin thêm về hỗ trợ regexp MySql:
http://dev.mysql.com/doc/refman/5.1/en/regexp.html#operator_regexp

+1

điều này thật tuyệt vời! cảm ơn người đàn ông! – Dominik

1

tôi muốn một cái gì đó với SQL cơ bản cho tìm kiếm từ đa của tôi trong cơ sở dữ liệu MySQL. Vì vậy, tôi đưa ra những điều sau đây.

$terms=explode(" ",$search); 
$count=count($terms); 
$sql="SELECT * FROM product WHERE";      
for($i=0;$i<$count;$i++) 
{ 
    if($i!=$count-1) 
     $sql = $sql. 
     " (pname LIKE '%$terms[$i]%' OR category LIKE '%$terms[$i]%' OR  
      sub_category LIKE '%$terms[$i]%' OR 
      description LIKE '%$terms[$i]%') AND "; 
    else 
     $sql = $sql. 
     "(pname LIKE '%$terms[$i]%' OR category LIKE '%$terms[$i]%' OR 
     sub_category LIKE '%$terms[$i]%' OR 
     description LIKE '%$terms[$i]%')"; 
}  
Các vấn đề liên quan