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

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

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

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

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

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

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

解决方法:

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

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;
}

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...