2012-04-03 14 views
3

こんにちは、私は自分のコードで問題を見つけようとしています。私はSQL_CALC_FOUND_ROWSとFOUND_ROWS()を使用してデータベースの全レコード量を取得します(PDOを使用)。私の問題は、FOUND_ROWS()が常に0を返すことです。PDO PHP&MYSQL SELECT 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" }

私はに喜んだので、あなたがのは、私に知らせて任意のアイデアを持っていれば今すぐ何でも試してみてください:)
この質問はあまりにもnoobではないことを望んでいる!私が言ったように、私はここで非常に簡単な何かを逃していると思う。

編集
実行()関数は、それが依然としてコードをまた

を実行するように進む()if文で使用される正しい等です。これはコードのFOUND_ROWS()部分と関係していると思いますあなたのSQLにSQL_CALC_FOUND_ROWSの後ろにカンマが欠落している

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

お困りですか?Berichtクラスの構文は、任意のSQLクエリを行いますか? – ChrisK

+0

@ChrisKいいえ、Berichtクラスにはセッターとゲッターが含まれています。 – Bono

+0

エラーが発生しましたか?それともちょうど0ですか? 'nextRowset()'を使ってレコードセットをループしてみましたか? –

答えて

3

あなたのDBクラス内で何が起こっているのか完全にはわからないので、この答えにはいくつかの前提があります。

私はこのであったと仮定して、あなたのマシンの1つの段階で同様のコードを扱っているので、trace_modeは答えではありません。

私は

$this->db->DBH() 

を前提とは、データベースクエリで使用するための新しいデータベースハンドラを取得するためにオフに起こっている機能です。

もう一度DBHの準備関数を呼び出すと、以前の他のDBH呼び出しの情報を格納していない新しいデータベースハンドラが作成されます。 (少なくとも私のDB-> DBHのようになります。

修正が早く機能で

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

のような何かをするだろう、そして

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

編集して準備呼び出しを置き換えます)仮定は正しかった!

+1

私はこれが答えかもしれないと思います! –

+0

サービスの喜んで – ChrisK

+0

よく行われた@ChrisK。+1 –

-1

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

デシベルクラス:

編集2は、DBクラスとBericht()クラス
Berichtクラスが含まれて

+0

いいえ、それは問題ではありません。コンマがあるはずはありません(すべて自分自身もチェックしています)) – Bono

+0

明らかに、mysqlトレースモードで問題が発生する可能性があります:http://stackoverflow.com/questions/ 674061/sql-calc-found-rows-found-rows-does-not-work-in-php – jornare

+0

もう一度、これは当てはまりません;(助けてくれてありがとう、非常に感謝します) – Bono

2

PHPでMySQLトレースモードを設定しようとしましたか?

PHP 5.2.6では

、オンにこのデフォルトと次の3つのいずれかの方法でこれを行うことができます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セッションに渡されているかどうかわかりません。それらを1つのクエリに結合して複数のレコードセットを取得しようとしましたか?非常に簡単です

+0

いいえ、trace_mode isあなたはini_setで何を提案して何も変更していません。私は後でそれらを1つのクエリに組み合わせようとします!歓声 – Bono

関連する問題