Rowcount解决方案,带有fetch_field_direct(),getColumnMeta(); PHP 7的可移植性?

时间:2015-08-27 15:04:29

标签: php mysqli pdo rowcount php-7

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

1 个答案:

答案 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计算)或计数(您只需提取)但不能同时选择。

相关问题