从PHP,我使用PDO查询MySQL数据库。查询是
$id = 5;
$stmt = $con >prepare("select name from employee where id= ? ");
$stmt ->bindValue(1, $id, PDO::PARAM_INT);
这是按预期工作的,并且获取了ID为5的员工的姓名。但是从日志中我可以看到实际执行的查询是
select name from employee where id= '5'
id是int类型,绑定是使用PDO :: PARAM_INT完成的。所以执行的查询应该是id= 5
而不是id= '5'
。由于这个原因,MySql可能会将字符串转换为int,
这是PDO的预期行为还是我理解错误?
答案 0 :(得分:2)
http://php.net/manual/en/pdostatement.bindvalue.php中的用户提供的说明指定了以下内容:
“Emulated准备工作在这种情况下更稳定,因为它们将所有内容转换为字符串,只是决定引用参数或引用参数。”
参考:http://php.net/manual/en/pdostatement.bindvalue.php#119956
答案 1 :(得分:1)
这可能是PHP中的一个错误,this ticket或与this one相关。已提交commit修复此错误(2016年10月11日星期二),其中说:
预准备语句模拟器(pdo_sql_parser。)计算出如何引用 每个查询参数。目标类型由PDO :: PARAM _ 指定 有争议,但这个方向并不总是遵循
你的PHP版本是什么?更新可能会解决它。