0

我正在重写一个应用程序,以便它可以使用 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();
        }
    }
}
4

1 回答 1

1

现有代码中有许多查询需要给定查询的行数。

实际上是您的应用程序中的错误,必须加以修复。

在每个使用返回的行数的地方,它不是故意使用的,用来告诉究竟有多少行被返回,而只是告诉是否已经找到任何行。这使得这样的调用非常多余,因为您有数据本身来判断是否返回了任何数据。

关于 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()方法没有任何问题。不要轻易成为旧迷信的猎物。

然而,正如我之前提到的,这种功能在 Web 开发中几乎没有用处。您可以选择数据(您可以在 PHP 中计数)或计数(您只需获取),但不能同时选择两者。

于 2015-08-27T15:11:23.057 回答