2012-04-03 14 views
3

Guten Tag, ich habe versucht, ein Problem in meinem Code zu finden. Ich verwende SQL_CALC_FOUND_ROWS und FOUND_ROWS(), um die Gesamtmenge der Datensätze in meiner Datenbank (mit PDO) abzurufen. Mein Problem ist, dass FOUND_ROWS() immer 0 zurückgibt.PDO PHP & MySQL FOUND_ROWS() gibt immer 0

Die Sache ist, dass ich es vorher funktionierte, aber ich machte einige Anpassungen hier und dort und jetzt hörte es auf zu arbeiten. Ich kann nicht für die Liebe von mir erinnern, was ich hätte löschen können, das war wichtig und kann nicht scheinen, irgendeine gute Dokumentation zu finden, die diese Funktionen mit PDO verwendet.

Bis jetzt habe ich versucht, es in verschiedene Schleifen, versuchte fetch() mit verschiedenen Modi versucht, versucht, die Befehle in unterschiedlicher Reihenfolge (d. H. Vor der Weile und nach der While-Schleife usw.). Ich denke, ich verpasse hier einfach etwas sehr Einfaches, aber ich habe dieses Ding seit ungefähr 1 oder 2 Stunden angeguckt und es macht mich verrückt.

hier ist also mein Code:

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)) 

Ausgang Var_dump: array(1) { ["aantalBerichten"]=> string(1) "0" }

Wenn Sie schon eine Idee, die bekam lassen Sie mich wissen, weil ich bereit bin versuchen Sie gerade über alles gerade jetzt :)
Hier ist zu hoffen, dass diese Frage nicht zu noob ist! Wie gesagt, ich vermisse hier etwas sehr leichtes.

bearbeiten
die execute() Funktion korrekt usw. ist, wenn Code if() Aussage noch

auch zur Ausführung schreitet verwendet in; Im 90% sicher, dass dies mit dem FOUND_ROWS() Teil des Codes zu tun hat.

bearbeiten 2, enthalten db Klasse und Bericht() Klasse
Bericht Klasse:

<?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 Klasse:

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

Von Interesse - macht das Konstrukt für die Bericht-Klasse irgendwelche SQL-Abfragen? – ChrisK

+0

@ChrisK Nein, es enthält nicht alle Bericht-Klasse sind Setter & Getter – Bono

+0

Erhalten Sie irgendwelche Fehler? Oder ist es nur 0? Haben Sie versucht, die Recordsets mit 'nextRowset()' zu durchlaufen? –

Antwort

3

Nicht ganz sicher, was passiert in Ihrer DB-Klasse, so ein paar Annahmen zu dieser Antwort.

Ich nehme an, dass war arbeiten in einer Phase auf Ihrem Computer ähnlichen Code, so Trace_mode ist nicht die Antwort.

Ich gehe davon aus

$this->db->DBH() 

eine Funktion ist, die in der Datenbankabfrage eine neue Datenbank-Handler für die Verwendung zu erhalten, ist abgehend.

Beim zweiten Aufruf der Prepare-Funktion für DBH wird ein neuer Datenbankhandler erstellt, der die Informationen aus dem anderen DBH-Aufruf nicht früher speichert.

würde ein Update so etwas wie

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

früh in der Funktion zu tun, ersetzen dann die mit mit

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

bearbeiten Anrufe vorbereiten: Sieht aus wie zumindest meine DB-> DBH () Annahme war richtig!

+1

Ich denke, das ist vielleicht die Antwort! –

+0

Freut mich, Ihnen zu helfen – ChrisK

+0

Gut gemacht @ChrisK –

-1

Sie in Ihrem SQL ein Komma hinter SQL_CALC_FOUND_ROWS fehlt

+0

Nein, das ist nicht das Problem, es soll dort kein Komma haben (das habe ich auch selbst überprüft;)) – Bono

+0

Anscheinend hat der mysql Trace-Modus etwas mit Ihrem Problem zu tun: http://stackoverflow.com/questions/ 674061/sql-calc-found-rows-gefunden-rows-does-not-work-in-php – jornare

+0

Ja, aber auch das ist nicht der Fall; (Danke für die Hilfe aber, sehr geschätzt! – Bono

2

Haben Sie versucht, den MySQL-Trace-Modus in PHP zu setzen?

In PHP 5.2.6, wird standardmäßig auf und kann einige Fehler verursachen mit FOUND_ROWS()

Sie diese mit einem der drei Methoden tun:

php.ini:

mysql.trace_mode = 0 

PHP:

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

.htaccess:

php_value mysql.trace_mode "0" 

Alternativ:

Ich bin nicht sicher, ob die SQL_CALC_FOUND_ROWS auf die zweite PDO-Sitzung übergeben wird. Haben Sie versucht, diese zu einer Abfrage zusammenzufassen und mehrere Recordsets abzurufen? Es ist sehr einfach zu tun

+0

Nein, trace_mode ist nicht das Problem, habe ich auch schon angeschaut: P hat noch versucht, was du mit ini_set vorgeschlagen hast und nichts geändert .. Ich werde versuchen, sie später in eine Abfrage zu kombinieren! Prost – Bono