Php 参数为false时插入的空值

Php 参数为false时插入的空值,php,mysql,pdo,Php,Mysql,Pdo,我试图在数据库中插入假值,但运气不好——它插入了一个空字符串。该列为varchar。如果我插入真值,它将插入1 我正在使用mysql、PDO和php 我还使用了一个DB类,它除了使用PDO准备的语句准备和执行查询之外,对查询没有任何作用 这是一个非常基本的问题: $sql = 'INSERT INTO api_logs_values (value) VALUES (?)'; 然后: $this->_db->query($sql, array(FALSE)); 知道发生了什么吗 编

我试图在数据库中插入假值,但运气不好——它插入了一个空字符串。该列为varchar。如果我插入真值,它将插入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:

我在这里发现了一个关于这个的bug报告,但是似乎没有一个合适的、好的解决方案。除了可能设置PDO_PARAM_BOOL属性

EDIT3:


我发现我使用的DB类没有单独绑定参数,而是执行($param),看这里,它将所有参数都视为PDO::param_STR,这是不正确的。

如果您想插入字符串“false”,那么
$this->\u DB->query($sql,array(“false”)

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


如果希望
TRUE
1
,而
FALSE
0
,请将列的数据类型设置为
tinyint

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


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

MySQL实现了如下布尔值:

布尔 这些类型是TINYINT(1)的同义词。零的值被认为是错误的。非零值被认为是真的

(from:)

这可能是mysql的“严格模式”问题。我知道命令行客户机提供了优雅的帮助,以帮助将字符串'false'转换为数据类型TINYINT(1)的0。它会发出警告,但会进入。JDBC不是这样的。PDO可能表现得很古怪

请参阅JDBC错误报告:


请参阅MySQL SQLMode Strict:

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

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

所以我找到了解决办法。问题在于在我使用的数据库类中绑定值的方式。它是这样做的:

$sql = 'INSERT INTO api_logs_values (value) VALUES (?)';
$value = false;
$value = ($value === false? '0':'1');
$this->_db->query($sql, array($value));
$stmt = $this->pdo->prepare($query);
$stmt->execute($param);
但声明来自: 它接受一个参数:

input_parameters包含与正在执行的SQL语句中的绑定参数数量相同的元素的值数组。全部的 值被视为PDO::PARAM_STR


数据库类必须做的是首先使用适当的数据类型参数(PDO常量)调用。这个评论很好地概括了这一点:

您试图将
FALSE
插入
VARCHAR
列中?或
“FALSE”
?尝试插入准确的字符串值,例如“FALSE”或“0”。我插入的是布尔值FALSE,而不是字符串“FALSE”。我希望它的工作方式与通过控制台手动将查询插入到某物(列)值(FALSE)中时的工作方式相同。在本例中,它将插入0,而不是通过脚本插入的空字符串。我知道这一点。我希望它将0插入到列中,而不是空字符串。不,我希望将bool值插入FALSE并在数据库中看到0。如果从控制台执行,为什么它将0插入到同一列中?如果使用准备好的语句,为什么它将空字符串插入到同一列中?不知道。如果你的意思是将相同的值放入不同的列中,那么存储的内容取决于列的数据类型。不,我说的是同一列,同一个查询。其中一个是用PDO准备的语句从PHP查询的,比如so INSERT-INTO-something(column)value(?),另一个是so INSERT-INTO-something(column)value(FALSE)。第一个插入一个空字符串,即使我将FALSE作为参数传递给query()函数,第二个插入0。您的注释“PDO可能表现得很古怪”让我找到了答案。非常感谢。