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

时间:2014-03-28 00:19:26

标签: php sqlite pdo string-comparison

我正在失去理智。在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 }})

2 个答案:

答案 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的实现方式如何。

课程重新学习......永远不要忘记"默认"你建立了!