我正在尝试使用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