PHP PDO - bindValue PARAM_BOOL为字符串

时间:2012-04-01 23:24:18

标签: php mysql pdo

我在这里吓坏了,无法弄清楚出了什么问题。我是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

正如你所看到的,发布的是一个整数 - 所以总是如此,这是不行的。如果我将它声明为布尔值,那为什么呢?

使用:

WAMP SERVER PHP版本:5.3.9 Mysql:5.5.20

非常感谢你的帮助..

2 个答案:

答案 0 :(得分:2)

MySQL实际上没有布尔数据类型,BOOLEAN关键字只是TINYINT(1)的别名。
你必须工作它有一个数字,其中1 =真,0 =假。 查看MySQL Data Types

答案 1 :(得分:0)

对于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);