繁体   English   中英

当字符串包含“&”时,SQLite中的字符串比较不起作用

[英]String comparison in SQLite not working when string contains '&'

我迷失了方向。 在SQLite Manager(FF插件)中执行时,此查询工作正常(查找一条匹配记录):

SELECT * FROM VendorDB WHERE lower(CompanyName) = 'b&b'

但是这个杂乱无章的SELECT语句(在回显时与上面完全相同)找不到任何东西。

SELECT * FROM VendorDB WHERE lower(CompanyName) = [vendor variable containing 'b&b]

当字符串不包含“&”时,两个查询的工作方式相同。 我到处搜寻Google,却找不到任何有关为何查询无法持续运作的信息。

顺便说一句,我正在使用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'而不是'b&b'

如我上面的评论中所述,请使用适当的参数化语句。 例如...

$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变量时出现问题。 后者可以通过我上面的答案解决。

我已经解决了这个问题。 就我而言,这是一个愚蠢的错误,但是在这里记住答案,以防它对其他人有用。

问题的确确实是将“&”符号转换为“&”。 (感谢@CBroe提供线索!)很难检测到,因为它没有出现在我正在查看的任何浏览器输出中(包括查看页面源代码)。

很久很久以前,我已经忘记了我已经建立了一个标准的表单处理功能来“清除”所有POST数据。 该函数中的一行接受每个发布的值,并将htmlspecialchars()函数应用于该值。 这将“ b&b”转换为“ b&b”。 非常适合HTML回显的输出,不适用于数据库比较字符串。

对于此特定应用程序,如果我不应用htmlspecialchars(),则无论PDO的实现方式如何,一切都会按预期工作。

重新学习了课程……永远不要忘记您建立的“默认值”!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM