【问题标题】:How to force mysqli results to strings to support legacy code如何强制 mysqli 结果为字符串以支持遗留代码
【发布时间】:2021-10-22 17:50:01
【问题描述】:

mysqli 中的准备查询将数字数据库列作为 PHP 数字返回,mysqlnd 驱动程序使用 MYSQLI_OPT_INT_AND_FLOAT_NATIVE 选项也是如此。

我正在对旧代码库进行现代化改造以使用参数化查询。代码的其他区域依赖于具有字符串数据类型的查询结果,例如:

if ($object->isTrue() === '1') { }

为了使输出符合现有代码的预期,我想出的最佳解决方案是将每个结果手动转换回字符串:

$data = [];
while ($row = $result->fetch_assoc()) {
  array_walk($row, function(&$field) { $field = (string) $field; });
  $data[] = $row;
}

有没有更有效/更有效的方法来做到这一点?

【问题讨论】:

  • 这个问题的变体已被标记为重复并关闭了几次。请注意,我不是试图让查询返回数字数据类型。我有数字数据类型。我需要字符串。

标签: php mysqli


【解决方案1】:

没有办法强制 mysqli 准备好的语句将所有值转换为字符串。二进制协议使用本机类型传输数据,mysqli 中没有将值转换为字符串的选项。

如果您在遗留项目中有这样的需求,您可以通过将每一行中的每个值映射为字符串来自行转换。

$arr = [];
foreach ($stmt->get_result() as $row) {
    $arr[] = array_map(strval::class, $row);
    // or if you support only PHP 8.1
    // $arr[] = array_map(strval(...), $row);
}

【讨论】:

    猜你喜欢
    • 2011-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多