【问题标题】:PHP PDO bindParam() and MySQL BITPHP PDO bindParam() 和 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();

【问题讨论】:

标签: php mysql pdo


【解决方案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);
  • 谢谢,这个答案做到了!我添加了源代码供其他人查看。
猜你喜欢
  • 1970-01-01
  • 2018-02-18
  • 1970-01-01
  • 1970-01-01
  • 2011-04-13
  • 2015-03-14
  • 2012-05-03
  • 2016-04-14
  • 2013-02-15
相关资源
最近更新 更多