php - 使用 PDO 检索匹配行的总数以及行本身

标签 php mysql pdo count

我有一个 PDO 片段,它从 MySQL 表中检索一堆行并将字段值(每行返回 2 个字段)分配给两个数组,如下所示:

$connect = dbconn(PROJHOST,'dbcontext', PROJDBUSER, PROJDBPWD);
$sql= "SELECT contextleft, contextright FROM tblcontext WHERE contextleft REGEXP :word LIMIT 0, 25";
$xleft = array();
$xright = array();
$countrows = 0;
$word = "[[:<:]]".$term."[[:>:]]";
$query = $connect->prepare($sql);
$query->bindParam(":word", $word, PDO::PARAM_STR);
if($query->execute()) {
    $rows = $query->fetchAll(PDO::FETCH_ASSOC);
    foreach($rows as $row){
        $pattern = '/\b'. $term .'\b/ui';
        $replacer = function($matches) { return '<span class="highlight">' . $matches[0] . '</span>'; };
        $xleft[$countrows] = preg_replace_callback($pattern, $replacer, $row['contextleft']);
        $xright[$countrows] = $row['contextright'];
        $countrows++;
    }
    $notfound = null;
}
$connect = null;

这很完美。如您所见,我使用 LIMIT 子句来确保最多只提取 25 行。但是,表中实际上可以有更多的匹配记录,我还需要检索所有 匹配记录的总数以及返回的行。最终目标是分页,例如:返回 100 个条目中的 25 个...

我知道我在这里有 2 个选项,都涉及 2 个查询而不是一个查询:

$sql= "SELECT COUNT(*) FROM tblcontext WHERE contextleft REGEXP :word;
SELECT contextleft, contextright FROM tblcontext WHERE contextleft REGEXP :word LIMIT 0, 25";

或者...

$sql= "SELECT SQL_CALC_FOUND_ROWS contextleft, contextright FROM tblcontext WHERE contextleft REGEXP :word LIMIT 0, 25;
SELECT FOUND_ROWS();";

但我仍然对在 PHP 中检索返回的计数值感到困惑。就像我可以通过在查询上运行 fetchAll() 方法并引用字段名称来访问字段一样。如何访问 FOUND_ROWS()COUNT() 返回的计数值?另外,有什么方法可以使用单个 SQL 语句同时获取计数和行数吗?

最佳答案

如果您有一个单独的计数查询,那么您可以使用与从任何查询中读取值完全相同的方式检索它的值,没有区别。

如果您使用 SQL_CALC_FOUND_ROWS,那么您需要有一个单独的查询来调用 FOUND_ROWS()功能:

SELECT FOUND_ROWS();

由于这又是一个普通查询,您可以像现在一样读取它的输出。

从技术上讲,您可以通过向查询添加一个计数 (*) 字段来检索查询本身的记录数:

SELECT contextleft, contextright, (select count(*) from tblcontext) as totalrecords FROM tblcontext WHERE contextleft REGEXP :word LIMIT 0, 25

SELECT contextleft, contextright, totalrecords
FROM tblcontext WHERE contextleft, (select count(*) as totalrecords from tblcontext) t REGEXP :word LIMIT 0, 25

Limit 影响返回的记录数,但不影响 count() 函数统计的行数。唯一的缺点是每行都会有计数值,但在 25 行的情况下,这可能是可以接受的负担。

您需要测试哪种方法最适合您。

关于php - 使用 PDO 检索匹配行的总数以及行本身,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34787441/

相关文章:

php - 随机帖子的动态链接与帖子 ID 不符

php - 无法从我的网络服务器连接到 MySQL 服务器,在我的个人盒子上使用完全相同的文件可以正常工作

php - 创建随机 ip 并使用用户名存储在数据库中

javascript - XMLHTTPRequest 发送数据

javascript - 在 PHP 中的所有页面上包含 header

javascript - t.replace 不是一个函数(…)trim

php - PHP 是否优化数组类型的函数参数,而不是在未修改时通过引用显式传递?

mysql - 根据测试用例排除结果

php - 如何在 php 中逐段读取、存储和获取数据

mysql - 我如何联合并找到这个原始 SQL 调用的中位时间?