我正在尝试使用php5 pdo和mysql进行搜索。我想做的是在表“职位”中搜索给定的一组关键字,并返回包含“标题”列中任何给定关键字的记录。但是,即使我提供表中存在的关键字,也不会返回结果集。我使用排序规则'utf8mb4_unicode_ci'。这是我的代码:
SELECT * FROM posts WHERE title LIKE '%hit%' OR title LIKE '%fifa%';
它在控制台内部工作。
-DosgiConsole
返回两行。但是使用表单使用“ hit fifa”搜索将返回零行。
答案 0 :(得分:1)
由于使用的是预备语句,因此表达式中不需要单引号。将您的代码更改为删除这些引号
$query="SELECT * FROM posts WHERE title LIKE ?";
$keywordArray[0]="%".$keywordArray[0]."%";
for($i=1;$i<$n;$i++){
$keywordArray[$i]="%".$keywordArray[$i]."%";
$query.=" OR title LIKE ?";
}
将引号视为参数内值的一部分。因此,您最终将获得类似
的SQLSELECT * FROM posts WHERE title LIKE '\'%Something%\''
显然这是不匹配的,因为在大多数情况下,数据库中的值在开头和结尾都没有单引号。
随着更改,它应该像这样转换为SQL
SELECT * FROM posts WHERE title LIKE '%Something%'
这是因为参数化过程会自动为您处理引号和转义作业-这是防止SQL注入攻击(以及偶然地防止由错误/未转义的引号引起的语法错误)的一种方式。
P.S。如果向此代码提交的请求中根本没有提供关键字,则该代码将崩溃,因为它假定$keywordArray[0]
中始终有一个值。考虑修改它以验证是否提供了关键字,或者只是循环整个数组,如果没有提交关键字,则根本不向查询添加WHERE子句。