PHP PDO bindParam() and MySQL BIT PHP PDO bindParam()函数是一种用于绑定参数的方法,它可以将参数值绑定到预定义的SQL语句中。在与MySQL BIT数据类型一起使用时,可以使用该函数来绑定BIT值。 MySQL BIT数据类型是一种用于存储位值的数据类型。它可以存储0和1,也可以存储NULL。 使用PHP PDO bindParam()函数来绑定MySQL BIT值非常简单。您只需将参数值绑定到SQL语句中的相应位置即可。例如,如果您有一个名为"b
PHP PDO bindParam() and MySQL BIT PHP PDO bindParam()函数是一种用于绑定参数的方法,它可以将参数值绑定到预定义的SQL语句中。在与MySQL BIT数据类型一起使用时,可以使用该函数来绑定BIT值。 MySQL BIT数据类型是一种用于存储位值的数据类型。它可以存储0和1,也可以存储NULL。 使用PHP PDO bindParam()函数来绑定MySQL BIT值非常简单。您只需将参数值绑定到SQL语句中的相应位置即可。例如,如果您有一个名为"b
我正在尝试更新一个包含BIT类型值的表中的数据,如下所示:
// $show_contact 可以是 '1' 或 '0' $query->bindValue(':scontact', $show_contact, PDO::PARAM_INT);
问题是,它从不改变该值,它仍然保持在PHPMyAdmin上设置的'1'。我尝试了不同的PDO::PARAM_
类型,但都没有成功,其他一切正常。
编辑 完整脚本
$sql = "UPDATE users SET password = :password, address = :address, postal = :postal, city = :city, contact = :contact, show_contact = :scontact WHERE id = :id"; $query = $dbh->prepare($sql); $query->bindValue(':id', $user->id, PDO::PARAM_INT); $query->bindValue(':password', md5($password), PDO::PARAM_STR); $query->bindValue(':address', $address, PDO::PARAM_STR); $query->bindValue(':postal', $postal, PDO::PARAM_STR); $query->bindValue(':city', $city, PDO::PARAM_STR); $query->bindValue(':contact', $contact, PDO::PARAM_STR); $query->bindValue(':scontact', $show_contact, PDO::PARAM_INT); $query->execute();
PHP PDO的bindParam()函数与MySQL的BIT类型之间存在一些问题。如果尝试使用PDO的PARAM_BOOL
参数绑定BIT类型,可能会出现问题。解决方法是将输入值严格转换为布尔值,并使用PDO::PARAM_BOOL
参数进行绑定。
具体代码如下:
$show_contact = (bool) $show_contact; // '0' => FALSE, '1' => TRUE $query->bindValue(':scontact', $show_contact, PDO::PARAM_BOOL);
在这里,我们将$show_contact
的值转换为布尔值,并使用PDO::PARAM_BOOL
参数将其绑定到查询语句中的:scontact
占位符。
另外,还可以使用强制类型转换来将输入值转换为布尔值,如下所示:
$query->bindValue(':scontact', (bool)$show_contact, PDO::PARAM_BOOL);
这样做可以确保将$show_contact
的值正确地转换为布尔值,并将其绑定到查询语句中。
最后,感谢问题的提出者将源代码添加到问题中,让其他人也能够看到解决方法。
PHP PDO的一个小bug是,即使参数被明确指定为PDO::PARAM_INT,它仍然被当作字符串并用引号括起来。为了解决这个问题,可以尝试以下方法:
$show_contact = (int)$show_contact; $query->bindValue(':scontact', $show_contact, PDO::PARAM_INT);
即使我已经将其转换为整数,结果仍然相同。
我遇到了同样的问题,但是在绑定之前再次将变量转换为INT,可以解决问题。
这种解决方法有效,但是我不得不像另一篇帖子中提到的那样将$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
,否则该值将被视为字符串。