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 显示 bindParam 的值

使用 PHP PDO 显示 bindParam 的值

PHP扩展PDO MySQL之PDOStatement::bindParam vs bindValue

用于“IN”语句的变量/字符串的 PHP PDO bindParam...? [复制]

pdo中bindParam()与bindValue的区别