【问题标题】:PDO - Search is querying terms as whole rather than each term separatelyPDO - 搜索是整体查询术语,而不是单独查询每个术语
【发布时间】:2012-09-09 04:29:32
【问题描述】:

我目前有一个简单的搜索引擎,它根据用户的输入在我的数据库中搜索列:

$search = $_GET['search'];
$terms = explode(" ", $search);

        $sql = "SELECT * FROM people WHERE lname LIKE :search";
    $q   = $conn->prepare($sql) or die("failed!");
    $q->bindValue(':search',"%".$search."%",PDO::PARAM_STR);
    $q->execute();

 if ($q){

 //
 do something

 }

目前它正在整体搜索术语,例如“red desk”返回结果但“desk red”不返回任何内容

有什么想法吗?非常感谢任何帮助!

编辑:

后来我把它改成了这个……

   $search = $_GET['search'];
   $terms = explode(" ", $search);

        $sql = "SELECT * FROM people WHERE MATCH (lname,fname) AGAINST  (:search IN BOOLEAN MODE)";
    $q   = $conn->prepare($sql) or die("failed!");
    $q->bindValue(':search',"%".$search."%",PDO::PARAM_STR);
    $q->execute(); 

目前看来一切正常,如果有人能提出更好的解决方案,我将非常感激!

【问题讨论】:

  • 结果red deskdesk red 应该有什么共同点?你期待什么?
  • 你应该查看 MySQL 的fulltext search
  • @dbf 感谢您的回复,我希望有时键入desk red 会产生与red desk 相同的结果?我想我的意思是,如果人们输入“desk red”而不是没有结果,它会显示带有单词desk in的所有结果?还是红色?

标签: php mysql search pdo prepared-statement


【解决方案1】:

这可能不是最好的方法,但我认为这样的事情可能会完成这项工作。我自己很想知道是否有更聪明的方法来做到这一点!

$search = $_GET['search'];
$terms = explode(" ", $search);

$sql = "SELECT * FROM people"
if(count($terms) > 0) {
  $sql .= " WHERE (lname LIKE '%:term_0%' OR fname LIKE '%:term_0%')";
  for($i = 1; $i < count($terms); $i++)
    $sql .= " AND (lname LIKE '%:term_" . $i . "%' OR fname LIKE '%:term_" . $i . "%')";
}

$q = $conn->prepare($sql) or die("failed!");

for($i = 0; $i < count($terms); $i++)
  $q->bindValue(':term_' . $i, $terms[$i]);
$q->execute(); 

【讨论】:

    猜你喜欢
    • 2021-07-25
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 2014-06-02
    • 2012-01-02
    • 1970-01-01
    • 2020-06-12
    相关资源
    最近更新 更多