PHP PDO MySQL查询类似->;多关键字

PHP PDO MySQL查询类似->;多关键字,php,mysql,search,sql-like,Php,Mysql,Search,Sql Like,我在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(arr

我在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;
?>

问题是我想要有多个关键字。假设有人键入“Here should a nice name of a person”,然后它将搜索“Here”、“should”、“be”等,并显示“name”列中有单词的每一行的结果。我在网上搜索,读到有可能像关键词一样多次使用“或命名”,但我无法真正让它工作,而且我不确定它是否足够优化约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.'%';
}
?>

您不应该使用@来消除错误。这是一种不好的做法,请检查是否设置了该值。下面的例子应该是可行的,但结果可能并不完全相关

$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;

请检查下面的代码

<?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."%" ;
}
?>


我想说的是,将关键字放入数组,并在循环中为每个关键字添加OR语句。有一点是,它们不再是真正的关键字了。请编辑你的答案,添加一个解释,说明你的代码是如何工作的,以及它是如何解决OP的问题的。很多海报都是新手,不会理解你发布的代码。嘿!谢谢你的帮助。我得到以下错误:注意:数组到字符串的转换。我知道这意味着什么,但我不知道如何在这段代码中修复它。你能帮我吗?谢谢$查询->执行(数组($arguments));我不知道这是否太晚了,但是删除$arguments周围的数组()。我编辑了我的答案。
<?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."%" ;
}
?>