我在PDO中成功连接到我的MySQL数据库,我正在尝试让它查询数据库中的搜索查询。
<?php
include ('connection.php');
function doSearch() {
$output = '';
if(isset($_POST['search'])) {
$searchq = $_POST['search'];
$searchq = preg_replace ("#[^0-9a-z]#i","",$searchq);
$sql = "SELECT * FROM entries WHERE name LIKE :searchq or description LIKE :searchq or content LIKE :searchq";
global $conn;
$stmt = $conn->prepare($sql);
$stmt->bindParam(":searchq",$searchq,PDO::PARAM_STR);
$stmt->execute();
$count = $stmt->rowCount();
if($count == 0) {
$output = 'No results found, buddy.';
} else {
while($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
$eName = $row['name'];
$eDesc = $row['description'];
$eCont = $row['content'];
$id = $row['id'];
$elvl = $row['level'];
$ehp = $row['hp'];
$output .= '<tr><td><a href="http://ccc.aaaa.whatever/' .$eName. '" onclick="document.linkform.submit();">'.$eName.'</a></td><td>'.$eDesc.'</td><td>'.$elvl.'</td><td>'.$ehp.'</td></tr>';
}
}
return $output;
}
}
?>
我正在努力争取搜索。除非查询仅与名称完全匹配,否则它不会显示任何结果。
答案 0 :(得分:0)
除非特别指示,否则LIKE
运算符不会进行部分匹配。也许您的意思是在搜索字符串前加/附加%
通配符:
$searchq = '%' . $searchq . '%';
答案 1 :(得分:0)
我没有在查询的SQL文本中看到任何错误。
最简单的解释是,您希望发送到数据库的SQL不是发送的。
我建议你试一试:
在语句中使用唯一绑定变量名,只使用每个绑定变量一次。
PDO中曾经存在一个带有命名绑定变量的错误(不确定是否已修复)。在封面下,命名绑定参数转换为位置表示法,当相同绑定变量两次或多次时,发送给MySQL的查询不是我们所期望的。
例如:
$sql = "SELECT e.*
FROM entries e
WHERE e.name LIKE :searchq1
OR e.description LIKE :searchq2
OR e.content LIKE :searchq3";
$stmt = $conn->prepare($sql);
$stmt->bindParam(":searchq1",$searchq,PDO::PARAM_STR);
$stmt->bindParam(":searchq2",$searchq,PDO::PARAM_STR);
$stmt->bindParam(":searchq3",$searchq,PDO::PARAM_STR);
当我们遇到问题时,我们没有使用服务器端预处理语句,只是常规客户端准备;发送到服务器的SQL包括文字,而不是占位符。启用MySQL中的general_log允许我们查看发送到数据库的实际SQL语句。
您可能遇到同样的问题。但我建议将此作为调试问题的一个步骤,至少要验证它不是问题。