我有以下查询,该查询应插入0但插入1。 它是用PHP中的准备好的语句执行的:
$insertsql=
"INSERT INTO table1 (column1, column2, column3, column4, column5, column6)
VALUES (?, ?, ?, ?, ?, ?)";
$insertstmt = $pdo->prepare($insertsql);
$insertstmt->execute(array($var1, $var2, $var3, $var4, $var5, 0));
除在列6中插入1而不是0之外,所有插入操作均正常进行。 列6的数据类型为BIT。
查询在执行时工作正常
INSERT INTO table1 (column6) VALUE (0);
直接在phpmyadmin的“ MySQL”标签中。
我想念什么?
编辑: 使用
$insertstmt->execute(array($var1, $var2, $var3, $var4, $var5, false));
按预期工作。为什么0在SQL查询中直接起作用,而在使用pdo执行时却不起作用?
答案 0 :(得分:3)
在将该参数传递给PDO时,需要将该参数明确声明为布尔值。
来自the PDO execute
documentation:
input_parameters
一个值数组,其中元素的数量与正在执行的SQL语句中绑定的参数一样多。所有值均视为
PDO::PARAM_STR
。
这不是您想要的。
因此,您需要更改逻辑以避免使用execute(array())
构造,而是使用bindValue()
分别绑定每个参数。对于布尔值:
$insertstmt->bindValue(':col6', false, PDO::PARAM_BOOL);
由于布尔值在MySQL中只是TINYINT(1)
,因此PDO::PARAM_INT
也应该可以正常工作:
$insertstmt->bindValue(':col6', 0, PDO::PARAM_INT);
最后:如果此布尔值始终为false,则可以将其直接传递给查询,例如:
$insertstmt->execute(array($var1, $var2, $var3, $var4, $var5, false));
spencer7593明智地指出,另一种选择是从SQL内部进行类型转换。例如,可以使用:
将字符串转换为位值INSERT INTO table1 (column1, column2, column3, column4, column5, column6)
VALUES (?, ?, ?, ?, ?, IF( ? ='0', b'0', b'1') )