在 MySQLi 中使用 fetch_array 时检测数据类型

Posted

技术标签:

【中文标题】在 MySQLi 中使用 fetch_array 时检测数据类型【英文标题】:Detect data type while using fetch_array with MySQLi 【发布时间】:2013-05-04 17:07:55 【问题描述】:

同时使用 mysqlI 获取数组时

$sql = <<<SQL
    SELECT *
    FROM `users`
    WHERE `live` = 1 
SQL;

if(!$result = $db->query($sql))
    die('There was an error running the query [' . $db->error . ']');


while($row = $result->fetch_assoc())
    echo var_dump($row);

我获得了所有值都是string 类型的关联数组。

检测列类型(VARCHAR、DATETIME、INT、FLOAT)并使用正确的类型(字符串、整数、空值)填充关联数组(或创建唯一关联数组)的最优雅方法是什么?

这在返回结果json_encoded 以供进一步的客户端处理时非常有用。

非常感谢您的帮助

【问题讨论】:

只是好奇,为什么要使用 heredoc 来定义查询? &lt;&lt;&lt;SQL" 大 5 个符号。有什么好处? 我只是在玩这个例子,codular.com/php-mysqli我没有什么特别的好处 【参考方案1】:

首先,你问错了问题。 您实际上并不需要列类型。事实上,您已经可以通过简单的 PHP 条件从数字中分辨出字符串。但是这两种方法都不会告诉你NULL

试试这个

$sql = "SELECT * FROM users WHERE live = 1";
$stm = $db->prepare($sql) or trigger_error($db->error);
$stm->execute() or trigger_error($db->error);
$res = $stm->get_result();
$row = mysqli_fetch_assoc($res);

如果你幸运的话,你会得到所有类型的设置。 如果没有 - 你需要在 PHP 中启用 mysqlnd

【讨论】:

完美,谢谢。我编辑了一点代码以使用面向对象的形式!【参考方案2】:

查询information_schema.columns表如下:

SELECT DATA_TYPE FROM information_schema.COLUMNS WHERE TABLE_NAME = 'tbl1' AND COLUMN_NAME = 'keycol'

假设您的表是 tbl1 并且有问题的列是 keycol。然而,json_encode 可能会让你的生活更轻松,而且可能无限地让我感到震惊。

【讨论】:

这是丑陋的技术,但它为您提供了架构定义。

以上是关于在 MySQLi 中使用 fetch_array 时检测数据类型的主要内容,如果未能解决你的问题,请参考以下文章

mysqli - 对非对象 mysqli 上的成员函数 fetch_array() 的 fetch_Array 错误调用 [重复]

MySQLI fetch_array()

PHP - 选择然后插入时是不是需要 fetch_array

MySQL 性能再次 MySQLi

php中mysqli 处理查询结果集的几个方法

在数据库中获取结果的推荐方法 [OOP-PHP & MySQLi]