我正在失去理智。在SQLite Manager(FF插件)中执行时,此查询正常工作(找到一个匹配的记录):
SELECT * FROM VendorDB WHERE lower(CompanyName) = 'b&b'
但是这个变化的SELECT语句(当echo'd出时与上面完全相同)没有找到任何东西。
SELECT * FROM VendorDB WHERE lower(CompanyName) = [vendor variable containing 'b&b]
当字符串不包含'&'时两个查询的工作方式相同。我已经搜索了所有内容,但无法找到有关查询为何不能始终如一地工作的任何内容。
BTW,我正在使用PHP:PDO来执行查询。
EDIT_1: 以下是查询的处理方式(在实现@Phil的建议之后),其中$ dbh是数据库连接:
$qry = "SELECT * FROM VendorDB WHERE lower(CompanyName) = ?";
//[$vendor is the variable containing 'b&b]
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$go_fetch = $dbh->prepare($qry);
$go_fetch->bindParam(1,$vendor);
$go_fetch->execute();
,结果检索为:
$go_fetch->setFetchMode(PDO::FETCH_ASSOC);
$data = $go_fetch->fetchAll();
所有这些都会产生一个空数组,但应该只生成一个记录。
另请注意,在插入查询之前,我已经回显了变量$ vendor的值,它是正确的值(即'b& b'不是{{1 }})
答案 0 :(得分:1)
正如我在上面的评论中所提到的,使用适当的参数化语句。例如......
$qry = "SELECT * FROM VendorDB WHERE lower(CompanyName) = ?";
$go_fetch = $dbh->prepare($qry);
然后,将参数传递给execute
方法
$go_fetch->execute([$vendor]);
或先绑定它,然后执行
$go_fetch->bindParam(1, $vendor);
$go_fetch->execute();
我非常怀疑&符导致任何问题。我找不到任何对它的引用作为SQLite特殊字符。
我要说的问题是,该值实际上包含b&b
,或者它包含其他问题字符,例如'
。前者表示$vendor
变量的设置位置和方式存在问题。后者通过上面的回答解决了。
答案 1 :(得分:1)
我已经解决了这个问题。这对我来说是一个愚蠢的错误,但是如果对其他人有用的话,请记住这里的答案。
问题确实是'&'标志正被转换成''。 (感谢@CBroe提供线索!)很难检测到,因为它没有显示在我正在查看的任何浏览器输出中(包括查看页面源)。
很久以前,我忘记了我已经设置了一个标准的表格处理功能来清理"所有POST数据。该函数中的一行占用了每个发布的值,并将htmlspecialchars()函数应用于它。这转换了' b& b'进入' b& b'。非常适合HTML echo输出,对数据库比较字符串不太好。
对于这个特定的应用程序,如果我不应用htmlspecialchars(),一切都按预期工作,无论PDO的实现方式如何。
课程重新学习......永远不要忘记"默认"你建立了!