【发布时间】:2015-11-22 01:13:35
【问题描述】:
我正在重写一个应用程序,以便它可以使用 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();
}
}
}
【问题讨论】:
标签: php mysqli pdo rowcount php-7