我正在重写一个应用程序,以便它可以使用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)是否已经完成,它返回什么以及由哪些运营商提供?如果函数的名称将是相同的,并且它将返回如下所示的“name”列,那么我的代码 - 在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();
}
}
}
答案 0 :(得分:1)
现有代码中有许多查询需要给定查询的行数。
这就是实际错误在你的应用程序中,而不得不修复。
在使用返回rowcount的每个地方,都使用非故意来告诉行如何确切地返回行,但只是告诉是否已找到任何行。这使得这样的调用非常多余,因为你有数据本身来判断是否有任何数据被返回。
关于OP中的特定函数,一个从count(*)查询返回除1之外的任何函数的函数完全没有意义。这种模棱两可的功能非常危险,并且总是会导致令人遗憾的后果。不要混淆自己的代码。
function returnRowcount($result_object, $connection_type){
if ($connection_type == 'mysqli') {
return mysqli_num_rows($result_object);
} elseif ($connection_type == 'pdo') {
return $result_object->rowcount();
}
}
是唯一允许存在的形式。
请注意rowCount()
方法没有任何问题。不要成为旧迷信的容易猎物。
尽管如此,正如我之前提到的,在网络开发中使用这种功能的用处极少。您可以选择数据(可以用PHP计算)或计数(您只需提取)但不能同时选择。