我正在重写一个应用程序,以便它可以使用 MYSQLI 或 PDO 查询,这些查询可由 $connection_type 变量控制,该变量将“mysqli”或“pdo”作为正在使用的标志。
现有代码中有许多查询需要给定查询的行数。获取查询返回的实际行数已在 Stackoverflow 的其他地方以不同的方式受到质疑和回答,但我认为我已经找到了一种适用于 MYSQLI 或 PDO 的铁定方法,然后当结果对象来自对这些形式中的任何一种进行变体的查询(注意第三个示例;无论在查询中是否使用 COUNT(),我都设计了该函数):
select count(*) from table
select count(distinct column) from table
select column1, column2, column3 from table
对于 MYSQLI,我的解决方案依赖于 fetch_field_direct(),这显然是一成不变且可靠的。然而,对于 PDO,我的解决方案依赖于相应的函数 getColumnMeta(),它在 PHP.NET 文档中以这种方式标记:
警告 此功能是实验性的。在 PHP 的未来版本中,此函数的行为、其名称和相关文档可能会更改,恕不另行通知。使用此功能应由您自担风险。
所以,我有两个问题:
1)任何人都可以看到我在这种方法中忽略的东西吗?
2) 有谁知道 getColumnMeta() 是否 (a) 出现在即将到来的 PHP 7 中,然后 (b) 它是否已经完成以及它返回什么以及由哪些运营商提供?如果函数的名称是相同的并且如果它将返回如下的“名称”列,那么我的代码——在 PHP 5.6.12 上运行良好——因此应该在 PHP 7 上运行释放。
所以,这是我的函数的当前状态,对于上面列出的 MYSQLI 和 PDO 查询类型都可以正常工作(但我是否忽略了一些事情?):
function returnRowcount($result_object, $connection_type){
if ($connection_type == 'mysqli') {
$name_field = strtoupper($result_object->fetch_field_direct(0)->name);
if (substr($name_field, 0, 6) == "COUNT(") {
$row = $result_object->fetch_row();
return $row[0];
} else {
return mysqli_num_rows($result_object);
}
} elseif ($connection_type == 'pdo') {
// WARNING: THE PHP DOCUMENTATION STATES THAT getColumnMeta MAY CHANGE IN FUTURE:
$name_field = strtoupper($result_object->getColumnMeta(0)["name"]);
if (substr($name_field, 0, 6) == "COUNT(") {
return $result_object->fetchColumn();
} else {
return $result_object->rowcount();
}
}
}