PDO PHP & MYSQL SELECT FOUND_ROWS () всегда возвращает 0 - PullRequest
3 голосов
/ 03 апреля 2012

Добрый день, я пытался выяснить проблему в моем коде. Я использую 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" }

Если у вас есть идеи, дайте мне знать, потому что я готов попробовать что угодно прямо сейчас:)
Надеюсь, этот вопрос не слишком нуб! Как я уже сказал, я думаю, что мне здесь чего-то не хватает.

1020 * редактировать *
функция execute () верна и т. д. при использовании в операторе if () она все еще продолжает выполнять код

Также; Я на 90% уверен, что это связано с частью кода FOUND_ROWS ().

редактировать 2, включая класс БД и класс Берихта ()
Берихт класс:

<?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;
    }
}

дБ класс:

<?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 ]

3 голосов
/ 03 апреля 2012

Не совсем уверен, что происходит внутри вашего класса БД, поэтому несколько предположений об этом ответе.

Я предполагаю, что работал на одном этапе на вашем компьютере с аналогичным кодом, поэтому trace_mode не является ответом.

Я предполагаю

$this->db->DBH() 

- это функция, которая собирается получить новый обработчик базы данных для использования в запросе к базе данных.

Во второй раз, когда вы вызываете функцию подготовки к DBH, он создает новый обработчик базы данных, который не хранит информацию из другого вызова DBH ранее.

Исправить можно было бы сделать что-то вроде

$dbh = $this->db->DBH(); 

в начале функции, затем заменить подготовительные вызовы на

$dbh->prepare("(SQL)");

Редактировать: Похоже, по крайней мере мое предположение DB-> DBH () было верным!

2 голосов
/ 03 апреля 2012

Вы пытались установить режим трассировки MySQL в PHP?

В 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.Вы пытались объединить их в один запрос и получить несколько наборов записей?Это очень легко сделать

0 голосов
/ 03 апреля 2012

Вам не хватает запятой в SQL_CALC_FOUND_ROWS в вашем SQL

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...