我有以下数据:
stockcode (CHAR) | description (VARCHAR)
----------------------------------------------
1234 | some product
01234 | some other product
我运行以下代码:
$sql = "SELECT * FROM stock WHERE stockcode = " . $db->quoteSmart($stockcode)
$res = $db->query($sql);
如果我传入股票代码“01234”,我会按预期获得第二行。如果我传入“1234”,我会得到两行,当我希望只获得第一行时。
通过回显sql语句,似乎是因为只有01234股票代码获得了它周围的报价,1234股票代码没有(大概是quoteSmart认为它是一个整数,它不需要报价?)。
然后Mysql将int 1234与CHAR列进行比较,并确定它们都匹配(可能是它正在进行比较为int?)
代码中有很多地方构建这样的查询,99%的时候,stockcode变量将是字母数字,它只是偶然的完全数字,很少包含前导零,这只是一个侥幸发生我偶然发现了。
任何人都可以推荐一个简单的解决方案吗?
答案 0 :(得分:1)
尝试将变量显式地转换为字符串:
$db->quoteSmart((string)$stockcode);
// instead of:
// $db->quoteSmart($stockcode);
修改强>
如果这不起作用,我认为quoteSmart()
并不是那么聪明(或者它试图太聪明而不是它自己的好处),所以你很可能需要停止使用它并坚持下去绑定参数(无论如何我建议使用此方法)。
答案 1 :(得分:0)
添加引号,以便数据库中的char不会转换为比较数字
$sql = "SELECT * FROM stock
WHERE stockcode = '" . $db->quoteSmart($stockcode). "'"
第二版:
$stockcode_str = $db->quoteSmart($stockcode);
if (is_numeric($stockcode_str))
$stockcode_str = "'$stockcode_str'";
$sql = "SELECT * FROM stock
WHERE stockcode = $stockcode_str";