【问题标题】:PHP PDO - bindValue PARAM_BOOL as stringPHP PDO - bindValue PARAM_BOOL 作为字符串
【发布时间】:2012-04-01 23:24:18
【问题描述】:

我吓坏了,不知道出了什么问题。我对 PDO 很陌生,但是除了作为字符串发送的布尔值之外,我的代码中的所有内容都可以正常工作。

我的代码(简化):

$sql = 'SELECT * FROM pages WHERE clean_url_slo = :clean_url_slo AND published = :published LIMIT 1';

$clean_url_slo = 'home';
$published = true;

然后我准备东西并像这样(简化)执行它:

$stmt = $db->prepare($sql);
$stmt->bindValue(':clean_url_slo',$clean_url_slo,PDO::PARAM_STR);
$stmt->bindValue(':published',$published,PDO::PARAM_BOOL);
$stmt->execute();

然后这是 mysql 的内容(来自 mysql 日志 - mysql 收到的查询):

91 Query    SELECT * FROM pages WHERE 1=1 AND clean_url_slo='domov' AND published='1' ORDER BY id desc LIMIT 1

如您所见,published 是一个整数 - 所以总是正确的,这是不对的。如果我将其声明为布尔值,为什么会这样?

使用:

WAMP 服务器 PHP版本:5.3.9 mysql:5.5.20

非常感谢您的帮助..

【问题讨论】:

  • 整数 1 即使引用为字符串也是 TRUE,整数 0 即使引用为字符串也是 FALSE。
  • SELECT '0'=TRUE; (0), SELECT '0'=FALSE; (1) 测试这个
  • 感谢您的回答,我已在数据库中将其设置为 TINYINT(1),但我认为 BOOL 应该是 1 或 0 而不是“1”和“0”。我现在已经测试过了,它确实有效。

标签: php mysql pdo


【解决方案1】:

MySQL 并没有真正的布尔数据类型,BOOLEAN 关键字只是 TINYINT(1) 的别名。
你必须工作它有一个数字,其中 1 = true 和 0 = false。 检查MySQL Data Types

【讨论】:

    【解决方案2】:

    对于 MySql,我会使用数据类型为 TINYINT(1) 并将数据类型设置为 PARAM_INT,

    我创建了一个小方法:

    public static function castBoolMysql($value):int
    {
        if($value !== 1 && $value !== 0 && !is_bool($value))
        {
            return false;//Incorrect value for bool
        }
        return intval($value);
    }
    
    $pdostmt->bindValue(':published', Test::castBoolMysql($published), PDO::PARAM_INT);
    

    【讨论】:

      猜你喜欢
      • 2013-01-03
      • 2011-02-11
      • 2012-05-01
      • 2014-01-26
      • 2016-01-28
      • 2013-11-12
      • 2012-07-31
      • 2014-06-12
      相关资源
      最近更新 更多