[PDO] while Schleife für Fetch

nchristoph

Erfahrenes Mitglied
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:
<?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

PHP:
while($row = mysql_fetch_assoc($qry)

Wie funktioniert das mit PDO?

Mit dem Aktuellen Code wird nur 1 Eintrag von 6 ausgegeben.
 
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:
<?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?
 
Zuletzt bearbeitet:
fetch erwartet einen Paramter, oder hast du da einen default Wert festgelegt:

PHP:
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:
PHP:
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";
    }
}
 
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?
 
Zuletzt bearbeitet:
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

PHP:
        $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:

PHP:
        $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.
 
BOING *10 Tonnenhammer raushol*

So das war ja mal ein peinlicher Fehler:P

Danke für den Hinweis.

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