作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有以下数据:
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 变量将是字母数字,只是偶尔完全是数字,很少包含前导零,这只是一个今天偶然发现的侥幸。
谁能推荐一个简单的解决方案?
最佳答案
尝试将变量显式转换为字符串:
$db->quoteSmart((string)$stockcode);
// instead of:
// $db->quoteSmart($stockcode);
编辑:
如果这不起作用,我想 quoteSmart()
并不是真的那么聪明(或者它为了自己的利益而试图变得太聪明),所以你很可能需要停止使用它并坚持使用绑定(bind)参数(无论如何我建议使用此方法)。
关于php - MySQL 使用 int 从 char 列中选择 - 前导零导致意外结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8974220/
我是一名优秀的程序员,十分优秀!