2014-10-30 77 views
0

我在MySQL中有一個用戶表,並希望按名稱搜索。現在我有以下代碼:PHP PDO MySQL查詢LIKE - >多個關鍵字

<?php 
$search = @$_GET['q']; 
$search = strtoupper($search); 
$search = strip_tags($search); 
$search = trim($search); 

$query = $con->prepare('SELECT * FROM `users` WHERE name LIKE ?'); 
$query->execute(array('%'.$search.'%')); 

$result = $query->rowCount(); 
echo $result; 
?> 

問題是我想擁有多個關鍵字。假設有人輸入「這應該是一個人的好名字」,那麼它會搜索「這裏」,「應該」,「是」等,並顯示單詞在「名稱」列中的每一行的結果。我在網上搜索並且讀到可以做「OR name like?」儘可能多的關鍵字,但我不能真正得到它的工作,我不知道它是否足夠優化約20字(以防萬一他們搜索這麼多的話)。如果它應該被使用,你能幫我改變我的代碼,所以它會獨立搜索每個單詞嗎?

謝謝!

編輯:

我能夠通過一個傢伙誰張貼在這個線程來解決這個問題。下面的解決方案對我的作品:

<?php 
$search = isset($_POST['q']) ? $_POST['q'] : ''; 
$search = strtoupper($search); 
$search = strip_tags($search); 
$search = trim($search); 

$split_words = explode(" ", $search); 

if(count($split_words) > 0) { 

    $sql = "SELECT * FROM `users` WHERE "; 

    for($i=0 ; $i < count($split_words); $i++){ 
     $sql .= " name LIKE ? OR"; 
    } 

    $sql = substr($sql , 0, -3); //Remove last 3 characters OR with space 
    array_walk($split_words, "addPercentage"); 


    $query = $con->prepare($sql); 
    $query->execute($split_words); 
} 

function addPercentage(&$value, $key) { 
    $value = '%'.$value.'%'; 
} 
?> 
+1

我會說你的關鍵字放在一個數組中,並在循環內爲每個關鍵字添加一個OR語句。有一點他們不再是真正的關鍵字 – 2014-10-30 18:48:47

回答

0
$words = explode(" ", $search); 

$i = 0; 
while($words[i] != null) 
{ 
    //Query where name LIKE words[i] 
} 
+0

請編輯你的答案,添加一個解釋你的代碼如何工作,以及*它如何解決OP的問題*。許多SO海報是新手,不會理解你發佈的代碼。 – 2014-10-30 20:47:00

3

你不應該使用@沉默的錯誤這是一個不好的做法,檢查值設置。下面的例子應該可以工作,但結果可能並不完全相關。

$search = isset($_GET['q']) ? $_GET['q'] : ''; 
$search = strtoupper($search); 
$search = strip_tags($search); 
$search = trim($search); 
$words = explode(' ', $search); 
$words_condition = array(); 
$arguments = array(); 
foreach ($words as $word) { 
    $words_condition[] = 'name LIKE ?'; 
    $arguments[] = '%'.$word.'%'; 
} 

$query = $con->prepare('SELECT * FROM `users` WHERE '.implode(' OR ', $words_condition)); 
$query->execute($arguments); 

$result = $query->rowCount(); 
echo $result; 
+0

嘿!感謝你的協助。我收到以下錯誤:注意:數組轉換爲字符串。我知道它是什麼意思,但我不知道如何解決這個代碼。你能幫助我嗎?謝謝! – user3476448 2014-10-31 18:55:37

+0

錯誤發生在哪一行? – nebulousGirl 2014-10-31 19:09:50

+0

$ query-> execute(array($ arguments)); – user3476448 2014-10-31 20:07:39

0

請檢查以下代碼。

<?php 
$search = isset($_GET['q']) ? $_GET['q'] : ''; 
$search = strtoupper($search); 
$search = strip_tags($search); 
$search = trim($search); 

$split_words = explode(" ", $search); 

$query = "SELECT * FROM `users`"; 

if(count($split_words) > 0){ 
$query .= " WHERE " 
for($i=0 ; $i < $split_words; $i++){ 
    $query .= " name LIKE ? OR "; 
} 
$query = substr($query , 0, -3); //Remove last 3 characters OR with space 


array_walk($split_words,"addPercentage"); 

$query->execute($split_words); 
}else{ 
$query->execute(); 
} 

$result = $query->rowCount(); 
echo $result; 

function addPercentage(&$value,$key) 
{ 
    $value = "%".$value."%" ; 
} 
?>