Php MySQL将位插入到1而不是0
我有以下查询,该查询应插入0,但应插入1。 它使用PHP中准备好的语句执行: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
$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通常无法识别您正在反复运行相同的查询。