首页 文章

使用PHP的MySQLi时,数据转换,函数查询和fetch_assoc

提问于
浏览
4

我正在为mysqli使用自定义PHP包装器 . 如果将绑定参数传递给fetchResultSet函数,则该类被设计为使用预准备语句,否则,根据我的理解,它保存对数据库的调用并使用查询函数(也许我错误地保存了一个调用,其余的这个问题可以通过简单地使用预处理语句来解决,即使没有参数也可以绑定 .

一旦执行了查询,fetchResult函数就会传回两个对象ResultSetObjectResult或ResultSetObjectStmt中的一个,这两个对象都实现了ResultSetObject接口 . (ResultSetObjectStmt对象在ResultSetObjectResult包装结果对象时包装stmt对象 . )

当通过在结果上调用fetch_assoc或在stmt对象上调用bind_result(基本上)时,两个类都会在请求行时返回关联数组 .

我注意到的是,如果执行一个预准备语句,那么返回的数据将被正确地转换为整数,实数和字符串,具体取决于它们在数据库中的类型;但是当返回结果并且在该结果上调用fetch_assoc时,所有数据都被转换为字符串 . 我意识到fetch_assoc的文档中提到了这一点 . 我很好奇是否有其他功能或我能做的事情让mysql正确地投射结果 .

[编辑]我应该提到这只是一个问题,因为json_encode根据数据类型将数据放在引号中 .

[再次编辑]我想知道是否有正确的方法来正确地转换从结果返回的数据,而不是使用像is_numeric这样的函数进行猜测工作,或者通过对表格的模式进行额外的数据库调用 . 在获取数据时专门使用预准备语句,但我真的很想保存对数据库的额外准备调用 .

2 回答

  • 2

    我不知道你使用什么包装,但你可以有一个像...的功能

    while ($row = $query->fetch_assoc()) {
        $row = auto_cast($row);
    }
    
    function auto_cast($row) {
        foreach ($row as $key => $value) {
            if (ctype_digit($value)) {
                $row[$key] = (int) $value;
            }
            elseif (is_numeric($value)) {
                $row[$key] = (float) $value;
            }
            else {
                $row[$key] = (string) $value;
            }
        }
        return $row;
    }
    
  • 1

    我会尽力帮助 . 当使用准备好的语句时,PHP知道什么是列类型,并且根据它存储不同类型的数据:字符串,整数,布尔等 . 使用fetch_assoc时它不知道这个信息 . 您可以创建一个函数,使用mysqli_fetch_fields获取字段/列MySQL数据并使用它们的类型 . 基于此,你可以对它们进行类型转换 . 希望会有所帮助 .

    关于不同列类型的Fior信息请参见http://www.php.net/manual/en/mysqli.constants.php

    MYSQLI_TYPE_LONG - 字段定义为INT,依此类推 .

相关问题