使用PDO

时间:2016-01-14 10:39:48

标签: 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个查询而不是单个查询:

$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语句同时获取计数和行?

1 个答案:

答案 0 :(得分:1)

如果您有一个单独的查询计数,那么您可以完全按照从任何查询中读取值的方式检索其值,没有区别。

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

SELECT FOUND_ROWS();

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

您可以通过在查询中添加count(*)字段来技术上检索查询本身中的记录计数:

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行,则可能是可接受的负担。

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