2017-04-21 228 views
0

我試過了很多不同的變化,我找不出爲什麼這不會返回我的預期結果。這是我現在的代碼。我已經在LIKE之後的SQL語句中嘗試了許多變量,並且沒有按預期返回數組。我還驗證了$ search變量的確有正確的字符串。Mysql沒有返回預期的結果

的index.php動開關(此工作正常):

case 'search_result': 
    $search = filter_input(INPUT_POST, 'searchBar'); 
    $results = search_books($search); 
    if($results == NULL){ 
     include('/view/search_null.php'); 
    }else { 
     include('/view/search_results.php'); 
    } 
    break; 

我的數據庫搜索功能:

function search_books($search_word){ 
global $db; 
$query = ' SELECT * FROM books 
      WHERE bookTitle LIKE :search_word '; 
$statement = $db->prepare($query); 
$statement->bindValue(":search_word", $search_word); 
$statement->execute(); 
$results_search = $statement->fetchAll(); 
$statement->closeCursor(); 
return ($results_search); 
} 

每次$結果爲NULL,並踢我到我的網頁,不返回任何結果,即使它應該返回結果。在該頁面上,我確認$ search中有正確的單詞,而$ results和$ results_search的數組大小爲0.

(是的,我知道我應該清理$ search,這不會上線它只是一個分配)

+1

嘗試從查詢中刪除'''(引號),並用':search_word'替換'$ search_word'。看看[帶佔位符的示例](http://php.net/manual/en/pdostatement.bindvalue.php#refsect1-pdostatement.bindvalue-examples) – FirstOne

+0

沒有通配符的'Like'與an =相同。你需要添加/連接通配符到你的搜索字符串嗎? – xQbert

+0

是的,我發現後,我發現。這是很多迭代(:search_word)之一,沒有奏效。改變了它,我仍然有同樣的問題。 – Alex

回答

1

你在找什麼是加入%到搜索詞包圍帶通配符搜索詞,例如:

$search_word = '%' . $search_word . '%'; 

然後只要準備/綁定/執行你已經是。這是更改後的代碼:

function search_books($search_word){ 
    global $db; 
    $search_word = '%' . $search_word . '%'; // added 
    $query = ' SELECT * FROM books 
      WHERE bookTitle LIKE :search_word '; 
    $statement = $db->prepare($query); 
    $statement->bindValue(":search_word", $search_word); 
    $statement->execute(); 
    $results_search = $statement->fetchAll(); 
    $statement->closeCursor(); 
    return ($results_search); 
} 


查詢會是這個樣子 後的參數得到它的地方:

SELECT * FROM books WHERE bookTitle LIKE '%something here%' 

這將尋找任何包含$search_word 。例如:

對於$search_word作爲Rings
The Lord of the Rings: The Return of the King將是一個匹配。

你可以在這裏閱讀更多關於:Pattern Matching

+0

@JayBlanchard這與準備好的陳述無關!操作系統已經使用準備好的語句,這隻會在語句使用之前添加'%'**。我的答案甚至沒有與數據庫相關的php代碼,只是字符串連接。 – FirstOne

+0

@JayBlanchard這裏沒有_sloppy_和_dangerous編碼慣例。我從來沒有建議這樣做。再次閱讀我的答案,我剛剛展示了查詢**如何看起來像**。查看變量名稱:'$ search_word',將在準備語句中使用一個參數。我從來沒有提出任何你暗示的東西。順便說一句,我從來沒有在查詢中直接使用輸入。 – FirstOne

+0

@JayBlanchard我建議您再次閱讀這個問題並回答,密切關注變量名稱和用法...... – FirstOne

0

更新:

您綁定查詢變量,但並沒有把查詢綁定值,因此使用下面的代碼:(希望你的作品)

function search_books($search_word){ 
    global $db; 
    $query = " SELECT * FROM books 
      WHERE bookTitle LIKE % :search_word %"; 
    $statement = $db->prepare($query); 
    $statement->bindValue(":search_word", $search_word); 
    $statement->execute(); 
    $results_search = $statement->fetchAll(); 
    $statement->closeCursor(); 
    return ($results_search); 
} 
+0

讓我們不要傳授/宣傳草率和危險的編碼習慣。如果您發佈的答案沒有準備好的陳述[您可能想在發佈之前考慮這一點](http://meta.stackoverflow.com/q/344703/)。另外[一個更有價值的答案來自於顯示OP的正確方法](https://meta.stackoverflow.com/a/290789/1011527)。 –

+0

是的,我發現後,我發現。這是許多沒有奏效的迭代之一。改變了它,我仍然有同樣的問題。 – Alex

+0

周杰倫,對不起,我只是在課堂上,在作業的框架內工作。一旦我完成了任務,我會研究mysqli,但是因爲我只是在處理我分配的內容。 – Alex

0
$query = " SELECT * FROM books 
     WHERE bookTitle LIKE :search_word "; 

That`s你需要的所有東西

+0

是的,我發現後,我發現。這是許多沒有奏效的迭代之一。改變了它,我仍然有同樣的問題。 – Alex