[英]PHP MYSQL Boolean Full-text search
我发现 Boolean 全文搜索很有帮助,但由于某种原因,我无法弄清楚为什么我的查询没有得到结果。
我的查询如下:
if(isset($_REQUEST['fname']) and $_REQUEST['fname']!=""){
$condition .= ' AND MATCH (fname, lname, mname) AGAINST('.(+$_REQUEST['fname']).' IN BOOLEAN MODE) ' ;
}
由这个 function 支持;
public function get($tableName, $whereAnd = array(), $whereOr = array(), $whereLike = array())
{
$cond = '';
$s=1;
$params = array();
foreach($whereAnd as $key => $val)
{
$cond .= " And ".$key." = :a".$s;
$params['a'.$s] = $val;
$s++;
}
foreach($whereOr as $key => $val)
{
$cond .= " OR ".$key." = :a".$s;
$params['a'.$s] = $val;
$s++;
}
foreach($whereLike as $key => $val)
{
$cond .= " OR ".$key." like '% :a".$s."%'";
$params['a'.$s] = $val;
$s++;
}
$stmt = $this->pdo->prepare("SELECT $tableName.* FROM $tableName WHERE 1 ".$cond);
try {
$stmt->execute($params);
$res = $stmt->fetchAll();
if (! $res || count($res) != 1) {
return $res;
}
return $res;
} catch (\PDOException $e) {
throw new \RuntimeException("[".$e->getCode()."] : ". $e->getMessage());
}
}
public function getAllRecords($tableName, $fields='*', $cond='', $orderBy='', $limit='')
{
//echo "SELECT $tableName.$fields FROM $tableName WHERE 1 ".$cond." ".$orderBy." ".$limit;
//print "<br>SELECT $fields FROM $tableName WHERE 1 ".$cond." ".$orderBy." ".$limit;
$stmt = $this->pdo->prepare("SELECT $fields FROM $tableName WHERE 1 ".$cond." ".$orderBy." ".$limit);
//print "SELECT $fields FROM $tableName WHERE 1 ".$cond." ".$orderBy." " ;
$stmt->execute();
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
return $rows;
}
然后是搜索栏:
<input type="text" name="fname" id="fname" class="form-control" value="" placeholder="Search By Name">
但是,当我搜索时,无论是单独搜索fname
还是fname+lname
,我都没有得到任何结果。
您的问题出在表达式的这一部分:
(+$_REQUEST['fname'])
当您在值前面添加+
时,PHP 会尝试将其转换为数值并(因为它可能是一个单词)给出非数值警告并返回 0。我认为您的意思是将+
放入整体表达即
$condition .= " AND MATCH (fname, lname, mname) AGAINST('+{$_REQUEST['fname']}' IN BOOLEAN MODE) ";
一个准备好的陈述会帮助你避免这些问题,写作
$condition .= " AND MATCH (fname, lname, mname) AGAINST(? IN BOOLEAN MODE) ";
然后将参数绑定到"+{$_REQUEST['fname']}"
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.