使用LIKE子句的MySQL搜索不起作用

时间:2018-11-28 14:33:24

标签: php mysql sql pdo sql-like

我正在尝试使用php5 pdo和mysql进行搜索。我想做的是在表“职位”中搜索给定的一组关键字,并返回包含“标题”列中任何给定关键字的记录。但是,即使我提供表中存在的关键字,也不会返回结果集。我使用排序规则'utf8mb4_unicode_ci'。这是我的代码:

SELECT * FROM posts WHERE title LIKE '%hit%' OR title LIKE '%fifa%';

它在控制台内部工作。

-DosgiConsole

返回两行。但是使用表单使用“ hit fifa”搜索将返回零行。

1 个答案:

答案 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 ?";
}

将引号视为参数内值的一部分。因此,您最终将获得类似

的SQL
SELECT * FROM posts WHERE title LIKE '\'%Something%\''

显然这是不匹配的,因为在大多数情况下,数据库中的值在开头和结尾都没有单引号。

随着更改,它应该像这样转换为SQL

SELECT * FROM posts WHERE title LIKE '%Something%'

这是因为参数化过程会自动为您处理引号和转义作业-这是防止SQL注入攻击(以及偶然地防止由错误/未转义的引号引起的语法错误)的一种方式。


P.S。如果向此代码提交的请求中根本没有提供关键字,则该代码将崩溃,因为它假定$keywordArray[0]中始终有一个值。考虑修改它以验证是否提供了关键字,或者只是循环整个数组,如果没有提交关键字,则根本不向查询添加WHERE子句。