Php MySQL将位插入到1而不是0

Php MySQL将位插入到1而不是0,php,mysql,sql,pdo,sql-insert,Php,Mysql,Sql,Pdo,Sql Insert,我有以下查询,该查询应插入0,但应插入1。 它使用PHP中准备好的语句执行: $insertsql= "INSERT INTO table1 (column1, column2, column3, column4, column5, column6) VALUES (?, ?, ?, ?, ?, ?)"; $insertstmt = $pdo->prepare($insertsql); $insertstmt->execute(array($var1, $var2

我有以下查询,该查询应插入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列具有数据类型位

但是,在执行时,查询工作正常

INSERT INTO table1 (column6) VALUE (0);
直接在phpmyadmin“MySQL”选项卡中

我错过了什么

编辑: 使用


一切正常。为什么0直接在SQL查询中工作,而不是在使用pdo执行查询时工作?

将此参数传递给pdo时,需要将其显式声明为布尔值

发件人:

输入参数

包含与正在执行的SQL语句中的绑定参数数量相同的元素的值数组。所有值都被视为
PDO::PARAM_STR

这不是你想要的

因此,您需要更改逻辑以避免使用
execute(array())
构造并使用
bindValue()
分别绑定每个参数。对于布尔值:

$insertstmt->bindValue(':col6', false, PDO::PARAM_BOOL);
由于boolean在MySQL中只是
TINYINT(1)
,因此
PDO::PARAM_INT
也应该可以正常工作:

$insertstmt->bindValue(':col6', 0, PDO::PARAM_INT);

最后:如果此布尔值始终为false,则可以直接将其传递给查询,如:

$insertstmt->execute(array($var1, $var2, $var3, $var4, $var5, false));

正如作者明智地评论的那样,另一个选项是从SQL内部执行类型转换。例如,可以使用以下命令将字符串转换为位值:

INSERT INTO table1 (column1, column2, column3, column4, column5, column6) 
VALUES (?, ?, ?, ?, ?, IF( ? ='0', b'0', b'1') )

在将此参数传递给PDO时,需要将其显式声明为布尔值

发件人:

输入参数

包含与正在执行的SQL语句中的绑定参数数量相同的元素的值数组。所有值都被视为
PDO::PARAM_STR

这不是你想要的

因此,您需要更改逻辑以避免使用
execute(array())
构造并使用
bindValue()
分别绑定每个参数。对于布尔值:

$insertstmt->bindValue(':col6', false, PDO::PARAM_BOOL);
由于boolean在MySQL中只是
TINYINT(1)
,因此
PDO::PARAM_INT
也应该可以正常工作:

$insertstmt->bindValue(':col6', 0, PDO::PARAM_INT);

最后:如果此布尔值始终为false,则可以直接将其传递给查询,如:

$insertstmt->execute(array($var1, $var2, $var3, $var4, $var5, false));

正如作者明智地评论的那样,另一个选项是从SQL内部执行类型转换。例如,可以使用以下命令将字符串转换为位值:

INSERT INTO table1 (column1, column2, column3, column4, column5, column6) 
VALUES (?, ?, ?, ?, ?, IF( ? ='0', b'0', b'1') )

当像那样传递绑定时,默认的绑定类型是string,这意味着0将变成
'0'
,如果以某种方式将其转换为布尔值,它将变成1。我建议您与第二个参数一起使用,以明确说明要绑定的类型。像这样传递绑定时的默认绑定类型是string,这意味着0将变成
'0'
,如果以某种方式将其转换为布尔值,它将变成1。我建议您与第二个参数一起使用,以明确说明要绑定的类型。另外值得注意的是,如果该值实际上是硬编码的,则不需要为其使用参数,因为参数主要用于清理来自不受信任来源的输入。@apokryfos:parameters还允许RDBM优化查询通过跳过执行计划的分析和准备来执行。没有绑定参数,RDBMS通常无法识别您正在一次又一次地运行同一个查询。另外值得注意的是,如果该值实际上是硬编码的,则不需要为其使用参数,因为参数主要用于清理来自不可信来源的输入。@apokryfos:parameters还允许RDBM优化查询通过跳过执行计划的分析和准备来执行。如果没有绑定参数,RDBMS通常无法识别您正在反复运行相同的查询。