Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/235.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用LIKE子句进行MySql搜索不起作用_Php_Mysql_Sql_Pdo_Sql Like - Fatal编程技术网

Php 使用LIKE子句进行MySql搜索不起作用

Php 使用LIKE子句进行MySql搜索不起作用,php,mysql,sql,pdo,sql-like,Php,Mysql,Sql,Pdo,Sql Like,我正在尝试使用php5 pdo和mysql实现搜索。我试图做的是在我的表“posts”中搜索一组给定的关键字,并返回包含“title”列中任何给定关键字的记录。但即使我给出了我知道存在于表中的关键字,它也不会返回结果集。我使用排序规则“utf8mb4\u unicode\u ci”。这是我的密码: <?php if($_SERVER['REQUEST_METHOD']=='POST'){ $charset="utf8mb4"; $dsn="mysql:host=$host;dbname=

我正在尝试使用php5 pdo和mysql实现搜索。我试图做的是在我的表“posts”中搜索一组给定的关键字,并返回包含“title”列中任何给定关键字的记录。但即使我给出了我知道存在于表中的关键字,它也不会返回结果集。我使用排序规则“utf8mb4\u unicode\u ci”。这是我的密码:

 <?php
if($_SERVER['REQUEST_METHOD']=='POST'){
$charset="utf8mb4";
$dsn="mysql:host=$host;dbname=$db;charset=$charset";
$opt=[  PDO::ATTR_DEFAULT_FETCH_MODE=>PDO::FETCH_ASSOC,
      PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION];
$pdo=new PDO($dsn,$user,$pass,$opt);
$keywords=$_POST['keywords'];
$keywordArray=explode(' ',$keywords);
$n=count($keywordArray);
$query="SELECT * FROM posts WHERE title LIKE ?";
$keywordArray[0]="'%".$keywordArray[0]."%'";
for($i=1;$i<$n;$i++){
  $keywordArray[$i]="'%".$keywordArray[$i]."%'";
  $query=$query." OR title LIKE ?";
}
$query=$query." LIMIT 50;";
     echo $query;
$stmt=$pdo->prepare($query);
$stmt->execute($keywordArray);
$res=$stmt->fetchAll();
echo "<br><h1>SEARCH RESULTS:</h1><br><ul>";
if($res){
foreach($res as $row){
  echo "<li>".$row['date']."<a href=\"viewpost.php?postid=".$row['id']."\">".$row['title']."</a></li><br>";
}
}
else{
echo "<h2 style=\"color:red;\">No results!</h2>";
}
echo "</ul></div>";
}
?>

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

因为您使用的是准备好的语句,所以表达式周围不需要单引号。将代码(删除这些引号)更改为

$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注入攻击的一种方式(顺便说一句,也是防止错误/未转义的引号引起的语法错误)



注意:如果向该代码提交请求时没有提供任何关键字,则该代码将崩溃,因为它假定在
$keywordArray[0]
中始终存在一个值。考虑修改这一点,以验证是否提供了关键字,或者只是循环整个数组,如果没有提交关键字,就根本不要向查询添加WHERE子句。因为相似的模式是无效的。。。使用正确格式的相似模式。你能指出我模式中的错误吗?对不起,我已经在谷歌上搜索过好几次了,但我找不到解决办法。@Werner我想你把问题弄糊涂了吧?它是参数的占位符,实际上是LIKE表达式的一部分。@abhiramsanthosh我的评论是针对Werner的,不是针对你的。我想你知道你在做什么吗?。关于你的实际问题,我已经在下面写了一个答案。@Werner没问题。不过,这只是一个小问题——PDO可以与参数化查询一起使用,也可以不与参数化查询一起使用。mysqli接受了吗?也作为占位符。你没有注意到的不是PDO的使用,而是参数化查询的使用。它很有效,谢谢你的详细回答。关于无关键字的情况,我在html输入标记中写了'required',这会有帮助吗?只要没有人弄乱客户端代码(简单,如果你知道怎么做的话),或者决定使用其他工具,如PostMan,直接向你的服务器发送HTTP请求。客户端验证对于用户体验很好,但您不能依靠它来始终检查您的输入。服务器端的检查也必须始终进行(事实上,它们应该是您编写的第一个检查,然后您可以在以后有时间添加客户端的内容)。真遗憾,我没有注意到这一点,因为即使我使用Burpuit处理post变量和请求。我会的。
SELECT * FROM posts WHERE title LIKE '\'%Something%\''
SELECT * FROM posts WHERE title LIKE '%Something%'