我正在尝试在数据库中插入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,这是不正确的。
答案 0 :(得分:3)
如果要插入字符串“false”,则$this->_db->query($sql, array("FALSE"));
对于数据类型varchar
,php值为false被视为空字符串。
如果您希望TRUE
为1
,FALSE
为0
,请将列的数据类型设置为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