MySQL的INSERT插入位为1而不是0

问题描述 投票:0回答:1

我应该输入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不执行呢?

php mysql sql pdo
1个回答
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);

最后:如果此布尔值永远是假的,那么你可以直接通过它来查询,如:

$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') )
© www.soinside.com 2019 - 2024. All rights reserved.