PHP PDO MySQL查询类似->;多关键字
我在MySQL中有一个users表,希望按名称进行搜索。现在我有以下代码: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
<?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."%" ;
}
?>