# [PDO] while Schleife für Fetch



## nchristoph (21. August 2012)

Hallo zusammen,

ich bin gerade am herumprobieren mit PDO und hab ein kleines Problem:

Es werden nicht alle Einträge in der Datenbank ausgegeben.

Ich glaube, das das Problem in der While schleife liegt.


```
<?php 
$sql = "SELECT post.b_id AS b_b_id, post.author_id AS b_author_id, post.kategorie_id AS b_cat_id, post.titel AS b_name, post.teaser AS b_teaser, post.content AS b_content, Date_Format( datum, '%d.%m.%Y' ) AS form_dat, kategorie.k_id AS k_k_id, kategorie.name AS k_name, autor.aut_id AS a_aut_id, autor.vorname AS a_name
                        FROM post
                        LEFT JOIN autor ON autor.aut_id = post.author_id
                        LEFT JOIN kategorie ON kategorie.k_id = post.kategorie_id
                        ORDER BY datum DESC";
$stmt = $db->prepare($sql); 
$stmt->execute();

   
while($fetch = $stmt->fetch()){
    $params[':b_b_id'] = $fetch['b_b_id'];
    
    
    $kommentar_qry = "SELECT COUNT(id) FROM kommentar WHERE `post_id` = :b_b_id ORDER BY datum ASC";
    $stmt = $db->prepare($kommentar_qry); 
    $stmt->execute($params);
    
    $kommentaranzahl = $stmt->fetchColumn();

    $b_b_id = $value->check_intval($fetch['b_b_id']);
    $b_name = $fetch['b_name'];
    $datum = $fetch['form_dat'];
    $userid = $value->check_intval($fetch['a_aut_id']);
    $username = $fetch['a_name'];
    $teaser = stripslashes(nl2br($fetch['b_teaser']));
    
     if($kommentaranzahl==1){ 
        $kommentartext =  ' Kommentar';  
    }
    else { 
        $kommentartext =  ' Kommentare';
        }
    $k_k_id = $value->check_intval($fetch['k_k_id']);
    $k_name = $fetch['k_name'];
    
    eval('?>' .$template->SetSystemTemplate('content'). '<?php ');
 } 
?>
```

mit MySQL würde ich das ja so aufrufen


```
while($row = mysql_fetch_assoc($qry)
```

Wie funktioniert das mit PDO?

Mit dem Aktuellen Code wird nur 1 Eintrag von 6 ausgegeben.


----------



## alxy (21. August 2012)

http://www.php.net/manual/de/pdostatement.fetch.php

Guck dir mal die Beispiele bzw Paramter an 

Allerdings gehts auch einfacher... wieder auf das beispiel achten: http://www.php.net/manual/de/pdo.query.php


----------



## nchristoph (21. August 2012)

Danke für die schnelle Antwort.

Entweder ich bin Blind oder ich seh den Fehler nicht.

In der Manual hab ich natürlich als erstes geschaut, hab ich aber auch keine Lösung gefunden.

Ich habe mir jetzt mal mal $fetch = $stmt->fetch() mit var_dump ausgeben lassen, es enthält nur einen Datensatz also muss der Fehler schon bei execute bzw. bei prepare liegen.

Sehe ich das falsch?

Vielleicht sollte ich auch noch meine DB Klasse posten:


```
<?php


class DB {
    const DB_HOST = 'localhost';
    const DB_NAME = 'nchristoph';
    const DB_USER = 'nchristoph';
    const DB_PASS = '';
    const DB_PORT = '';

    public static $instance;
    
    public static function getInstance(){
        if(!isset(self::$instance)){    
            self::$instance = new PDO( 'mysql:host='.self::DB_HOST.';dbname='.self::DB_NAME.';port='.self::DB_PORT,
                    self::DB_USER,
                    self::DB_PASS,
                    array(
                        PDO::ATTR_DRIVER_NAME => 'mysql',
                        PDO::ATTR_PERSISTENT => false,
                        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION ,
                        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
        ) );
        }
        return self::$instance;
    }
    
    private function __construct(){
        
    }
    
    private function __clone(){
    }
}

?>
```

Ich habe die Klasse nach allem, was ich gefunden hab im Netz zusammengebaut, kann es sein, das ich hier einen Fehler gemacht habe?


----------



## alxy (21. August 2012)

fetch erwartet einen Paramter, oder hast du da einen default Wert festgelegt:


```
function readDataForwards($dbh) {
  $sql = 'SELECT hand, won, bet FROM mynumbers ORDER BY BET';
  try {
    $stmt = $dbh->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL));
    $stmt->execute();
    while ($row = $stmt->fetch(PDO::FETCH_NUM, PDO::FETCH_ORI_NEXT)) {
      $data = $row[0] . "\t" . $row[1] . "\t" . $row[2] . "\n";
      print $data;
    }
    $stmt = null;
  }
  catch (PDOException $e) {
    print $e->getMessage();
  }
}
```

oder eben quick & dirty:

```
function getFruit($conn) {
    $sql = 'SELECT name, color, calories FROM fruit ORDER BY name';
    foreach ($conn->query($sql) as $row) {
        print $row['name'] . "\t";
        print $row['color'] . "\t";
        print $row['calories'] . "\n";
    }
}
```


----------



## nchristoph (21. August 2012)

Ich verwende über die Klasse einen Defaultwert gesetzt.

Ich habe jetzt alles bis auf den Query selber umgebaut, funktioniet leider immer noch nicht wie gewünscht.

Es wird nach wie vor nur 1 Datensatz ausgeben.

Kann es sein, das der Query für PDO ungeeignet ist?

//Edit:

Wenn ich jetzt die Foreach Schleife verwende anstatt der while funktionierts.

Wieso funktioniert dann die While nicht?


----------



## nchristoph (22. August 2012)

Sorry für Bump, Editbutton wird wieder mal nicht angezeigt.

Ich hab das jetzt mit der foreach version gemacht, funktioniert einwandfrei.

Bei der nächsten Datei hab ich jetzt ein anderes Problem:

Wenn ich jetzt diese Abfrage verwende, krieg ich Ergebnis False bzw. 0 zurück


```
$params1[':kateg_id'] = $row['kategorie_id'];              
        
        $kategorie_qry = "SELECT name FROM kategorie WHERE `k_id` = ':kateg_id' LIMIT 0,1";
        $stmt = $db->prepare($kategorie_qry);
        $stmt->execute($params1);
        $kategorie_data = $stmt->fetch();
        $kategorie = $kategorie_data['name'];
```

Bei der Version funktioniert die Abfrage:


```
$params1[':kateg_id'] = $row['kategorie_id'];              
        
        $kategorie_qry = "SELECT name FROM kategorie WHERE `k_id` = '{$row['kategorie_id']}' LIMIT 0,1";
        $stmt = $db->prepare($kategorie_qry);
        $stmt->execute($params1);
        $kategorie_data = $stmt->fetch();
        $kategorie = $kategorie_data['name'];
```

Kann mir da wer sagen wieso das so ist?

Fang erst an, mit PDO zu arbeiten.


----------



## alxy (22. August 2012)

Also entweder bin ich blind oder das ist zweimal exakt dieselbe Abfrage. Falls dem wirklich so ist, liegts nicht an diesem Stück Code 

Ah, unterschied entdeckt... wieder mal würde ich dir raten, die beispiele im Manual zu studieren:
http://www.php.net/manual/de/pdostatement.execute.php


----------



## nchristoph (22. August 2012)

BOING *10 Tonnenhammer raushol* 

So das war ja mal ein peinlicher Fehler

Danke für den Hinweis. 

Hast du auch ne Idee, wieso der Fetch in der Whileschleife nicht funktioniert, in der foreach schon?


----------

