PHP PDO SELECT语句:将VARCHAR与INT进行比较

时间:2015-11-02 10:12:03

标签: php mysql pdo

我有一张具有通用结构的表格 在名为myvalue的列中,我存储的信息可以是整数,字符串或日期 为了使其通用,列myvalueVARCHAR。这意味着,当我保存一个整数时,它仍然存储为字符串。

现在,我正在桌面上执行SELECT。例如。

SELECT * FROM mytable WHERE myvalue > 10 AND username = 'foo'

想象一下,我们为用户foo设置了2行:520
直接执行此查询将为我提供正确的结果(返回20)。

现在,我通过PDO执行查询:

$sql = "SELECT * FROM mytable WHERE myvalue > ? AND username = ?";
$params = array(10, 'foo');
$adapter->fetchAll($sql, $params);

结果返回[5, 20],就像PDO比较字符串一样。

如何告诉PDO进行数字比较?

1 个答案:

答案 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);