【问题标题】:PHP PDO MySQL query LIKE -> multiple keywordsPHP PDO MySQL 查询 LIKE -> 多个关键字
【发布时间】:2017-08-13 04:48:27
【问题描述】:

我在 MySQL 中有一个 users 表,想按名称搜索。现在我有以下代码:

<?php
$search = @$_GET['q'];
$search = strtoupper($search);
$search = strip_tags($search);
$search = trim($search);

$query = $con->prepare('SELECT * FROM `users` WHERE name LIKE ?');
$query->execute(array('%'.$search.'%'));

$result = $query->rowCount();
echo $result;
?>

问题是我想要多个关键字。假设有人键入“这里应该是一个好听的人名”,然后它会搜索“这里”、“应该”、“是”等,并显示“姓名”列中有单词的每一行的结果。我在网上搜索并读到可以做“OR name LIKE?”与关键字一样多,但我无法真正让它工作,我不确定它是否已经优化到大约 20 个单词(以防他们用那么多单词搜索)。如果应该使用它,您能帮我更改我的代码,以便它可以独立搜索每个单词吗?

谢谢!

编辑:

我能够通过在此线程中发布的一个人解决此问题。以下解决方案适用于我:

<?php
$search = isset($_POST['q']) ? $_POST['q'] : '';
$search = strtoupper($search);
$search = strip_tags($search);
$search = trim($search);

$split_words = explode(" ", $search);

if(count($split_words) > 0) {

    $sql = "SELECT * FROM `users` WHERE ";

    for($i=0 ; $i < count($split_words); $i++){
        $sql .= " name LIKE ? OR";
    }

    $sql = substr($sql , 0, -3); //Remove last 3 characters OR with space
    array_walk($split_words, "addPercentage");


    $query = $con->prepare($sql);
    $query->execute($split_words);
}

function addPercentage(&$value, $key) {
    $value = '%'.$value.'%';
}
?>

【问题讨论】:

  • 我会说将您的关键字放在一个数组中,并在循环内为每个关键字添加一个 OR 语句。有一点他们不再是真正的关键字了

标签: php mysql search sql-like


【解决方案1】:
$words = explode(" ", $search);

$i = 0;
while($words[i] != null)
{
    //Query where name LIKE words[i]
}

【讨论】:

  • 请编辑您的答案以添加对您的代码如何工作以及它如何解决 OP 的问题的解释。很多 SO 发帖人都是新手,看不懂你贴的代码。
【解决方案2】:

您不应该使用 @ 来消除错误,这是一种不好的做法,请检查该值是否已设置。下面的示例应该可以工作,但结果可能并不那么相关。

$search = isset($_GET['q']) ? $_GET['q'] : ''; 
$search = strtoupper($search);
$search = strip_tags($search); 
$search = trim($search);
$words = explode(' ', $search);
$words_condition = array();
$arguments = array();
foreach ($words as $word) {
    $words_condition[] = 'name LIKE ?';
    $arguments[] = '%'.$word.'%';
}

$query = $con->prepare('SELECT * FROM `users` WHERE '.implode(' OR ', $words_condition));
$query->execute($arguments);

$result = $query->rowCount();
echo $result;

【讨论】:

  • 你好!谢谢你的协助。我收到以下错误:注意:数组到字符串的转换。我知道这意味着什么,但我不知道如何在这段代码中解决这个问题。你能帮我解决这个问题吗?谢谢!
  • $query->execute(array($arguments));
  • 不知道是不是太晚了,把$arguments周围的array()去掉。我编辑了我的答案。
【解决方案3】:

请检查以下代码。

<?php
$search = isset($_GET['q']) ? $_GET['q'] : '';
$search = strtoupper($search);
$search = strip_tags($search);
$search = trim($search);

$split_words = explode(" ", $search);

$query = "SELECT * FROM `users`";

if(count($split_words) > 0){
 $query .= " WHERE "
 for($i=0 ; $i < $split_words; $i++){
   $query .= " name LIKE ? OR ";
 }
 $query = substr($query , 0, -3); //Remove last 3 characters OR with space


 array_walk($split_words,"addPercentage");

 $query->execute($split_words);
}else{
 $query->execute();
}

$result = $query->rowCount();
echo $result;

function addPercentage(&$value,$key)
{
  $value = "%".$value."%" ;
}
?>

【讨论】:

    猜你喜欢
    • 2010-12-19
    • 2014-08-30
    • 2012-08-04
    • 2023-03-26
    • 2012-04-28
    • 2014-03-02
    相关资源
    最近更新 更多