【发布时间】:2019-04-30 12:00:59
【问题描述】:
我正在尝试使用 php5 pdo 和 mysql 实现搜索。我要做的是在我的表“帖子”中搜索给定的一组关键字,并返回包含“标题”列中任何给定关键字的记录。但即使我给出我知道表中存在的关键字,它也不会返回任何结果集。我使用排序规则“utf8mb4_unicode_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>";
}
?>
它在控制台内工作。
SELECT * FROM posts WHERE title LIKE '%hit%' OR title LIKE '%fifa%';
返回两行。但是使用表单搜索“hit fifa”会返回零行。
【问题讨论】:
-
那个?因为 LIKE 模式无效...使用正确格式的 LIKE 模式。
-
您能指出我的模式中的错误吗?抱歉,我已经用谷歌搜索了好几次,但我找不到解决方案。
-
@Werner 我认为你混淆了?这是一个参数的占位符,它实际上是 LIKE 表达式的一部分。
-
@abhiramsanthosh 我的评论是针对维尔纳的,而不是你。我想你知道你在做什么?关于您的实际问题,我已经在下面写了一个答案。
-
@Werner 没问题。只是一个小点 - PDO 可以在有或没有参数化查询的情况下使用。和 mysqli 接受?作为占位符。您错过的不是一般 PDO 的使用……而是参数化查询的使用。
标签: php mysql sql pdo sql-like