【发布时间】:2025-12-09 13:20:08
【问题描述】:
我正在尝试通过 php 的 PDO 类(mysql 驱动程序)进行搜索。我有以下查询与 MySQL 客户端一起使用(更改表名以保护无辜者):
SELECT hs.hs_pk,
hs.hs_text,
hs.hs_did,
hd.hd_did,
hd.hd_text,
hv.hv_text,
hc.hc_text
FROM hs
LEFT JOIN hd
ON hs.hs_did = hd.hd_did
LEFT JOIN hd
ON hd.hd_vid = hv.hv_id
LEFT JOIN hc
ON hd.hd_pclass = hc.hc_id
WHERE hs.hs_text LIKE "%searchTerm%"
LIMIT 25;
无论我使用什么搜索词,这都像一个魅力。但是,当我转向 php 时,我无法让它返回任何东西。我尝试了几种看起来合乎逻辑的不同语法,但我没有尝试过。这是我现有的代码:
$handle = fopen('/foo/bar/test.log', 'w+');
fwrite($handle, "doSearch, with search term: $searchTerm\n");
$sql =
'SELECT hs.hs_pk,
hs.hs_text,
hs.hs_did,
hd.hd_did,
hd.hd_text,
hv.hv_text,
hc.hc_text
FROM hs
LEFT JOIN hd
ON hs.hs_did = hd.hd_did
LEFT JOIN hd
ON hd.hd_vid = hv.hv_id
LEFT JOIN hc
ON hd.hd_pclass = hc.hc_id
WHERE hs.hs_text LIKE :searchTerm
LIMIT 25';
try {
$dbh = new PDO('mysql:host=localhost;dbname=awdb', "user", "password");
fwrite($handle, "connected to DB\n");
$prep = $dbh->prepare($sql);
$ret = $prep->execute(array(':searchTerm' => '"%'.$searchTerm.'%"'));
while ($row = $prep->fetch(PDO::FETCH_ASSOC)) {
$i++;
$result[$i]['subText'] = $row['hs_pk'];
$result[$i]['subText'] = $row['hs_text'];
$result[$i]['subDid'] = $row['hs_did'];
$result[$i]['devDid'] = $row['hd_did'];
$result[$i]['devText'] = $row['hd_text'];
$result[$i]['vendorText'] = $row['hv_text'];
$result[$i]['classText'] = $row['hc_text'];
}
$dbh = null;
}
catch (PDOException $e) {
print "Error!: " . $e->getMessage() . "<br/>";
die();
}
我也尝试了以下方法(SQL WHERE 子句和 prep->执行行都发生了变化):
WHERE hs.hs_text LIKE CONCAT(\'%\', ?, \'%\')
$ret = $prep->execute(array($searchTerm));
WHERE hs.hs_text LIKE "%:searchTerm%"
$ret = $prep->execute(array(':searchTerm' => $searchTerm));
WHERE hs.hs_text LIKE ":searchTerm"
$ret = $prep->execute(array(':searchTerm' => '%'.$searchTerm.'%'));
等等……
【问题讨论】:
-
这可能只是一个转置问题,但你没有附上你的 sql 语句 - 你需要在它的末尾加上一个撇号 (')。
-
这是一个换位问题。如果我忘记了 ' 我相信 PHP 会完全吓坏的,哈哈。不过,感谢您非常快速的回复。
-
var_dump() $dbh、$prep 和 $ret 会得到什么?它们是您期望的值吗?您是否尝试过使用 mysql_* 系列函数运行相同的查询进行比较?
-
这里是每个(以及脚本的输出)的 var 转储:doSearch,搜索词:com connected to DB object(PDO)#32 (0) { } object(PDOStatement) #33 (1) { ["queryString"]=> string(586) "SELECT ...语句太大,但与脚本中的 $sql 变量匹配... } bool(false) ret: Array ( ) 结果:应该添加行我没有尝试过 mysql_* 系列函数。我需要查找文档,因为我不熟悉这些。