如何将 mysqli 结果强制转换为字符串以支持遗留代码
How to force mysqli results to strings to support legacy code
在 mysqli return 数字数据库列中准备查询作为 PHP 数字,使用 MYSQLI_OPT_INT_AND_FLOAT_NATIVE 选项的 mysqlnd 驱动程序也是如此。
我正在对遗留代码库进行现代化改造以使用参数化查询。代码的其他部分依赖于具有字符串数据类型的查询结果,例如:
if ($object->isTrue() === '1') { }
我想出的使输出符合现有代码预期的最佳解决方案是手动将每个结果转换回字符串:
$data = [];
while ($row = $result->fetch_assoc()) {
array_walk($row, function(&$field) { $field = (string) $field; });
$data[] = $row;
}
还有其他efficient/effective方法吗?
无法强制 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);
}
在 mysqli return 数字数据库列中准备查询作为 PHP 数字,使用 MYSQLI_OPT_INT_AND_FLOAT_NATIVE 选项的 mysqlnd 驱动程序也是如此。
我正在对遗留代码库进行现代化改造以使用参数化查询。代码的其他部分依赖于具有字符串数据类型的查询结果,例如:
if ($object->isTrue() === '1') { }
我想出的使输出符合现有代码预期的最佳解决方案是手动将每个结果转换回字符串:
$data = [];
while ($row = $result->fetch_assoc()) {
array_walk($row, function(&$field) { $field = (string) $field; });
$data[] = $row;
}
还有其他efficient/effective方法吗?
无法强制 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);
}