参数为false时插入的空值

时间:2012-01-17 08:25:09

标签: php mysql pdo

我正在尝试在数据库中插入FALSE值,没有任何运气 - 它插入一个空字符串。该列是varchar。如果我插入TRUE值,则会插入1。

我正在使用mysql,PDO和php。

我也在使用一个DB类,它不会对查询做任何事情,而是使用PDO预处理语句准备和执行它。

这个问题是一个非常基本的问题:

$sql = 'INSERT INTO api_logs_values (value) VALUES (?)';

然后:

$this->_db->query($sql, array(FALSE));

任何想法发生了什么?

修改

添加了表格结构:

api_logs_values | CREATE TABLE `api_logs_values` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`log_id` int(10) unsigned NOT NULL,
`name` varchar(255) DEFAULT NULL,
`value` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `log_id` (`log_id`,`name`)
ENGINE=MyISAM AUTO_INCREMENT=26 DEFAULT CHARSET=utf8

EDIT2:

我在这里https://bugs.php.net/bug.php?id=33876找到了一个关于此问题的错误报告,但似乎没有一个适当的,好的解决方案。除了可能设置PDO_PARAM_BOOL属性。

EDIT3:

我发现我使用的DB类没有单独绑定params,但是执行($ param),并且在这里查看http://php.net/manual/en/pdostatement.execute.php,它将所有参数视为PDO :: PARAM_STR,这是不正确的。

6 个答案:

答案 0 :(得分:3)

如果要插入字符串“false”,则$this->_db->query($sql, array("FALSE"));

对于数据类型varchar,php值为false被视为空字符串。

如果您希望TRUE1FALSE0,请将列的数据类型设置为tinyint

答案 1 :(得分:3)

MySQL会将评估为false的值插入到列中。根据数据类型,实际值会有所不同。对于基于字符的数据类型,将插入空字符串。对于数字类型,它将插入0.您应该使用适当的数据类型。 (仅供参考,当MySQL识别数据类型定义的关键字BOOL时,该列实际上将创建为TINYINT。在这种情况下,它将存储1表示true,0表示为false)

如果你想要字符串存储字符串“false”,那么你需要使用字符串文字而不是布尔值false。

答案 2 :(得分:2)

MySQL按如下方式实现布尔值:

BOOL,BOOLEAN 这些类型是TINYINT(1)的同义词。值为零被视为false。非零值被认为是真实的。

(来自:http://dev.mysql.com/doc/refman/5.0/en/numeric-type-overview.html

答案 3 :(得分:1)

这可能是mysql的“严格模式”问题。我知道命令行客户端优雅地帮助将字符串'false'“转换”为0,数据类型为TINYINT(1)。它会产生一个警告,但它会进入。但事实并非如此。 PDO可能表现得很时髦......

请参阅JDBC错误报告:http://bugs.mysql.com/bug.php?id=24526

请参阅MySQL SQLMode Strict:http://dev.mysql.com/doc/refman/5.1/en/server-sql-mode.html#sqlmode_strict_all_tables

答案 4 :(得分:0)

您应该尝试匹配数据类型。 一个简单的如果足以实现这一点。 代码如下所示:

$sql = 'INSERT INTO api_logs_values (value) VALUES (?)';
$value = false;
$value = ($value === false? '0':'1');
$this->_db->query($sql, array($value));

答案 5 :(得分:0)

所以我找到了解决方案。问题在于我在使用的数据库类中完成了值绑定的方式。它做了这样的事情:

$stmt = $this->pdo->prepare($query);
$stmt->execute($param);

但是从http://lt.php.net/manual/en/pdostatement.execute.php说明: 它需要一个参数:

  

input_parameters 一个值数组,其元素与正在执行的SQL语句中的绑定参数一样多。所有   值被视为PDO :: PARAM_STR。

数据库类必须首先使用适当的data_type参数(PDO常量)调用bindValue()。这个评论总结得很好:http://lt.php.net/manual/en/pdostatement.bindvalue.php#104939