PHP PDO bindParam() 和 MySQL BIT
Posted
技术标签:
【中文标题】PHP PDO bindParam() 和 MySQL BIT【英文标题】:PHP PDO bindParam() and MySQL BIT 【发布时间】:2014-08-11 03:40:51 【问题描述】:我正在尝试使用 BIT 类型值更新表中的数据,如下所示:
// $show_contact is either '1' or '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();
【问题讨论】:
也许你把它作为字符串发送'1'
PDOstatement (mysql): inserting value 0 into a bit(1) field results in 1 written in table 的可能重复项
顺便说一句。你应该使用 sha-256 而不是 md5 security.stackexchange.com/questions/19906/…
@RiggsFolly 谢谢,PDO::ATTR_EMULATE_PREPARES
完成了这项工作
【参考方案1】:
PDO 有一个错误,即任何参数传递给查询,即使特别指定为 PDO::PARAM_INT 也被视为字符串并用引号括起来。 READ THIS
解决它的唯一方法是尝试以下方法:
$show_contact = (int)$show_contact;
$query->bindValue(':scontact', $show_contact, PDO::PARAM_INT);
【讨论】:
我已经将它转换为整数,但结果是一样的。 我遇到了同样的问题,但是在绑定之前再次将变量转换为 INT,为我完成了这项工作。 它有效,但我必须$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
,正如另一篇文章中提到的那样,它导致该值被视为字符串。【参考方案2】:
我相信 BIT 类型映射到 PDO 的 PARAM_BOOL
。尝试使用严格的布尔输入。
$show_contact = (bool) $show_contact; // '0' => FALSE, '1' => TRUE
$query->bindValue(':scontact', $show_contact, PDO::PARAM_BOOL);
【讨论】:
您的意思是将输入值转换为布尔值? 是的,比如$query->bindValue(':scontact', (bool)$show_contact, PDO::PARAM_BOOL);
谢谢,这个答案做到了!我添加了源代码供其他人查看。以上是关于PHP PDO bindParam() 和 MySQL BIT的主要内容,如果未能解决你的问题,请参考以下文章
PHP PDO 与 bindParam 与 bindValue? [复制]
PHP扩展PDO MySQL之PDOStatement::bindParam vs bindValue