我应该输入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));
所有插入进行精细,除1插入column6代替0第6列的具有数据类型BIT。
在执行时查询工作正常,但是,
INSERT INTO table1 (column6) VALUE (0);
直接在phpMyAdmin的“MySQL的”标签。
我在想什么?
编辑:使用
$insertstmt->execute(array($var1, $var2, $var3, $var4, $var5, false));
按预期工作。为什么是0直接工作的SQL查询中,但使用时PDO不执行呢?
你需要将它传递给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);
最后:如果此布尔值永远是假的,那么你可以直接通过它来查询,如:
$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') )