我有一张具有通用结构的表格
在名为myvalue
的列中,我存储的信息可以是整数,字符串或日期
为了使其通用,列myvalue
是VARCHAR
。这意味着,当我保存一个整数时,它仍然存储为字符串。
现在,我正在桌面上执行SELECT
。例如。
SELECT * FROM mytable WHERE myvalue > 10 AND username = 'foo'
想象一下,我们为用户foo
设置了2行:5
和20
。
直接执行此查询将为我提供正确的结果(返回20
)。
现在,我通过PDO执行查询:
$sql = "SELECT * FROM mytable WHERE myvalue > ? AND username = ?";
$params = array(10, 'foo');
$adapter->fetchAll($sql, $params);
结果返回[5, 20]
,就像PDO比较字符串一样。
如何告诉PDO进行数字比较?
答案 0 :(得分:1)
$adapter->fetchAll
对我们来说是一个黑色的大黑盒子,所以我推测你天真地做了这样的事情:
$stmt = $pdo->prepare($sql);
$stmt->execute($params);
这确实将所有参数都视为字符串。如果希望将参数显式地视为整数,则需要适当地绑定它们:
$stmt = $pdo->prepare('SELECT * FROM mutable WHERE myvalue > ? AND username = ?');
$stmt->bindValue(1, 10, PDO::PARAM_INT);
$stmt->bindValue(2, 'foo', PDO::PARAM_STR);
$stmt->execute();
这可能意味着你必须稍微重写或丢弃你的包装。
或者,你可以将这个强制转换操作卸载到MySQL(虽然它似乎错位了IMO):
$sql = "SELECT * FROM mutable WHERE myvalue > CAST(? AS SIGNED INTEGER) AND username = ?";
$params = array(10, 'foo');
$adapter->fetchAll($sql, $params);