我正在嘗試使用PHP和PDO編寫一個簡單的全文搜索。我不太確定最好的方法是通過SQL和PDO搜索數據庫。我發現這個this腳本,但它是舊的MySQL擴展。我寫這個函數的女巫應計算搜索匹配,但SQL不起作用。傳入的搜索字符串看起來像這樣:23+more+people
使用PHP和PDO進行SQL全文搜索
function checkSearchResult ($searchterm) {
//globals
global $lang; global $dbh_pdo; global $db_prefix;
$searchterm = trim($searchterm);
$searchterm = explode('+', $searchterm);
foreach ($searchterm as $value) {
$sql = "SELECT COUNT(*), MATCH (article_title_".$lang.", article_text_".$lang.") AGINST (':queryString') AS score FROM ".$db_prefix."_base WHERE MATCH (article_title_".$lang.", article_text_".$lang.") AGAINST ('+:queryString')";
$sth = $dbh_pdo->prepare($sql);
$sql_data = array('queryString' => $value);
$sth->execute($sql_data);
echo $sth->queryString;
$row = $sth->fetchColumn();
if ($row < 1) {
$sql = "SELECT * FROM article_title_".$lang." LIKE :queryString OR aricle_text_".$lang." LIKE :queryString";
$sth = $dbh_pdo->prepare($sql);
$sql_data = array('queryString' => $value);
$sth->execute($sql_data);
$row = $sth->fetchColumn();
}
}
//$row stays empty - no idea what is wrong
if ($row > 1) {
return true;
}
else {
return false;
}
}
感謝您的詳細解答!我相應地更改了SQL,並刪除了MySQL特定的MATCH操作。我改變了對SQL SELECT'COUNT(*) \t \t \t FROM 「$ db_prefix。 」_基礎 \t \t \t WHERE article_content_title _「。$ LANG。」 \t \t \t LIKE '%:查詢字符串%' \t \t \t OR \t \t \t article_content_text _ 「$ LANG。」 \t \t \t LIKE'%:queryString%''但'queryString'沒有被替換。與上面的代碼相同,但修復了您指出的語法錯誤。任何想法爲什麼? – wowpatrick
@wowpatrick:當你說是不是被替換'queryString',你的意思是,當你呼應聲明中,參數(':queryString'部分)還沒有被替換爲您的用戶提供的字符串?如果是這樣,準備好的陳述就是如何工作的。該語句和參數分別發送給MySQL。客戶端(在這種情況下是PHP)不會將兩者結合起來。因爲它們是分開發送的,所以MySQL知道哪些位是語句,哪些位是參數,所以它不需要解析它來查明。這就是爲什麼它能很好地防禦SQL注入。 – Mike
@wowpatrick:如果你想看到的合併報表,您可以檢查[MySQL的通用查詢日誌(http://dev.mysql.com/doc/refman/5.5/en/query-log.html)。它在默認情況下是禁用的,因此請務必先閱讀文檔以瞭解如何啓用和使用它。另外,您是否在PHP代碼中添加了該行以顯示可能發生的任何錯誤? – Mike