PDO PHP& MYSQL SELECT FOUND_ROWS()始终返回0

时间:2012-04-03 11:05:35

标签: php mysql pdo

美好的一天,我一直试图找出代码中的问题。我正在使用SQL_CALC_FOUND_ROWS和FOUND_ROWS()来检索我的数据库中的记录总数(使用PDO)。我的问题是FOUND_ROWS()总是返回0。

事情是,我之前已经开始工作,但我在这里和那里做了一些调整,现在它停止了工作。我不能因为我的爱而记住我可以删除的内容,这些内容很重要,似乎无法找到任何使用PDO这些功能的好文档。

到目前为止,我已尝试将其置于不同的循环中,尝试使用不同模式的fetch(),尝试以不同的顺序放置命令(即在while之前和while循环之后等)。我想我在这里错过了一些非常简单的东西,但我现在已经盯着这件事大约1或2个小时了,这让我很生气。

所以这是我的代码:

public function findBerichten($args)
{       
    //$offset zorg ervoor dat pagina 1 als record 0 in de database zoekt
    $offset = ($args['huidigePagina'] - 1) * $args['itemsPerPagina'];

    $sth = $this->db->DBH()->prepare("SELECT    SQL_CALC_FOUND_ROWS
                                                berichten.berichtID, 
                                                berichten.bericht, 
                                                berichten.naam, 
                                                berichten.mail
                                        FROM    `berichten` 
                                        ORDER BY berichten.datumToegevoegd DESC 
                                        LIMIT   ?, ?");
    $sth->bindParam(1, $offset, PDO::PARAM_INT);
    $sth->bindParam(2, $args['itemsPerPagina'], PDO::PARAM_INT);
    $sth->execute();
    $sth->setFetchMode(PDO::FETCH_ASSOC);

    $berichten = array();

    while($row = $sth->fetch())
    {
        $bericht = new Bericht();
        $bericht->setBerichtID(htmlentities(strip_tags($row['berichtID'])));
        $bericht->setBericht(htmlentities(strip_tags($row['bericht'])));
        $bericht->setNaam(htmlentities(strip_tags($row['naam'])));
        $bericht->setMail(htmlentities(strip_tags($row['mail'])));  
        $berichten[] = $bericht; 
    }

    $sth = $this->db->DBH()->prepare("SELECT FOUND_ROWS() as aantalBerichten");
    $sth->execute();
    $sth->setFetchMode(PDO::FETCH_ASSOC);
    $this->aantalBerichten = $sth->fetch();

    var_dump($this->aantalBerichten);

    return $berichten;
}

的index.php

if($huidigePagina < 1)
{
    //$huidigePagina is 1
    $huidigePagina = 1;
}

//Als de huidige pagina groter is als het totaal aantal pagina's
if($huidigePagina > $totaalPaginas)
{
    //$huidigePagina is gelijk aan het totaal aantal pagina's
    $huidigePagina = $totaalPaginas;
}

$berichtDAO->findBerichten(array('huidigePagina'=>$huidigePagina, 'itemsPerPagina'=>10))

输出var_dump:array(1) { ["aantalBerichten"]=> string(1) "0" }

如果您有任何想法让我知道,因为我现在愿意尝试任何事情:) 这是希望这个问题不是太棒了!正如我所说,我认为我在这里很容易丢失一些东西。

修改
execute()函数是正确的等,当在if()语句中使用时,它仍然继续执行代码

也;我90%肯定这与代码的FOUND_ROWS()部分有关。

编辑2,包括db class和Bericht()类
Bericht班:

<?php 

Class Bericht
{
    private $db;
    private $berichtID;
    private $bericht;
    private $naam;
    private $mail;

    public function __construct(Db $db)
    {
        $this->db = $db;
    }

    public function setBerichtID($berichtID)
    {
        $this->berichtID = $berichtID;
    }

    public function getBerichtID()
    {
        return $this->berichtID;
    }

    public function setBericht($bericht)
    {
        $this->bericht = $bericht;
    }

    public function getBericht()
    {
        return $this->bericht;
    }

    public function setNaam($naam)
    {
        $this->naam = $naam;
    }

    public function getNaam()
    {
        return $this->naam;
    }

    public function setMail($mail)
    {
        $this->mail = $mail;
    }

    public function getMail()
    {
        return $this->mail;
    }
}

db class:

<?php
class Db
{
    //bij het laden van Db
    public function __construct()
    {
        //voer functie connect() uit
        $this->connect();
    }

    //functie voor het verbinding maken met en het selecteren van een database
    private function connect()
    {
        //$connection is connectie naar mysql database (met de opgegeven inlog waardes)
        $connection = mysql_connect('localhost', 'user', 'pw');

        //als er geen connectie gemaakt kan worden
        if(!$connection)
        {
            //die (voer overige code niet meer uit) en echo string + de mysql error
            die("Kan geen verbinding maken: " . mysql_error());
        }

        //selecteert de opgegeven database met de connectie ($connection)
        mysql_select_db("db", $connection);
    }

    public function DBH()
    {
        try 
        {
            $DBH = new PDO('mysql:host=localhost;dbname=db', 'user', 'pw');
            $DBH->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            return $DBH;
        }

        catch (PDOException $except)
        {
            echo $except->getMessage();
        }
    }

    //function to retrieve records -- not important
    public function getRecords($sth)
    {
        $rows = array();

        if($sth->execute() == true)
        {       
            $sth->setFetchMode(PDO::FETCH_OBJ);

            while($row = $sth->fetch())
            {
                $rows[] = $row;
            }

            return $rows;
        }

        else
        {
            return false;
        }
    }
}

3 个答案:

答案 0 :(得分:3)

不完全确定数据库类中发生了什么,所以对这个答案做了一些假设。

我认为这个 在你机器的一个阶段工作的代码类似,所以trace_mode不是答案。

我假设

$this->db->DBH() 

是一个函数,它将在数据库查询中使用新的数据库处理程序。

第二次调用DBH的prepare函数时,它正在创建一个新的数据库处理程序,它不会先存储来自其他DBH调用的信息。

修复就是做

之类的事情
$dbh = $this->db->DBH(); 

在函数的早期,然后用

替换prepare调用
$dbh->prepare("(SQL)");

编辑:看起来至少我的DB-&gt; DBH()假设是正确的!

答案 1 :(得分:2)

您是否尝试在PHP中设置MySQL跟踪模式?

在PHP 5.2.6中,默认为On,可能会导致FOUND_ROWS()

出错

您可以使用以下三种方法之一来完成此操作:

<强>的php.ini:

mysql.trace_mode = 0

<强> PHP:

ini_set("mysql.trace_mode", "0");

<强> htaccess的:

php_value mysql.trace_mode "0"

<强>可替换地:

我不确定SQL_CALC_FOUND_ROWS是否正在传递给第二个PDO会话。您是否尝试将它们组合成一个查询并检索多个记录集?这很容易做到

答案 2 :(得分:-1)

您在SQL

中缺少SQL_CALC_FOUND_ROWS背后的逗号