【问题标题】:Rowcount solution with fetch_field_direct(), getColumnMeta(); portability to PHP 7?使用 fetch_field_direct()、getColumnMeta() 的行计数解决方案; PHP 7 的可移植性?
【发布时间】: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


    【解决方案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 开发中几乎没有用处。您可以选择 data(您可以在 PHP 中计数)或 count(您只需获取),但不能同时选择两者。

    【讨论】:

    • 您在mysqli_num_rows 之前有一个$。另外,您或许应该解释一下 rowCount() 是错误的使用方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多