对结果进行循环将为NULL值返回空字符串


Looping through results returns empty string for NULL values?

如果我的数据库中有NULL值并将它们拉入数组,我会得到空字符串。例如:

$test = [];
while ($row = $sth->fetch(PDO::FETCH_ASSOC)) {
    $test[$row['id']]['field1'] = $row['field1'];
    $test[$row['id']]['field2'] = $row['field2']; // null in database
    $test[$row['id']]['field3'] = null; // explicitly set to null
}
return $test;

输出:

array(1) {
  [1]=>
  array(3) {
    ["field1"]=>
    string(4) "test"
    ["field2"]=>
    string(0) ""
    ["field3"]=>
    string(0) ""
  }
}

我只是想理解为什么我最终得到的是空字符串而不是NULL值?我是做错了什么,还是应该这样做?

PDO不会自动检索本机MySQL数据类型。为了做到这一点,您必须使用准备好的语句,并且必须运行PHP 5.3(前提是您的PHP 5.3版本是使用mysqlnd(而不是旧的libmysql)编译的)。

此外,您必须建立这样的连接:

$conn = new PDO($dsn, $user, $pass, array(
    PDO::ATTR_EMULATE_PREPARES => false
));

PDO::ATTR_EMULATE_REPREPARES启用或禁用已准备语句的模拟。

来源:http://php.net/manual/en/pdo.setattribute.php

为了查看实际的NULL值,您需要执行var_dump或使用is_null检查该值是否为NULL。

试试这个:

$db->setAttribute(PDO::ATTR_ORACLE_NULLS, PDO::NULL_NATURAL );

PDO::NULL_NATURAL:无转换。