• Jeder User im Forum verpflichtet sich zur Akzeptanz und zur Einhaltung dieser Regeln:
    1. Umgangston
      Ein angemessener höflicher Umgangston, ohne Beleidigungen, Beschimpfungen und aggressive Postings ist für jedes Mitglied Pflicht.
    2. Beiträge
      Jedes Mitglied sollte sich bemühen nur sinnvolle Beiträge zum Thema zu posten. Dabei ist unbedingt vorher zu prüfen, ob das Thema vorher schon einmal diskutiert wurde und daher fortgesetzt werden kann
      • Suchfunktion benutzen!
      • offizielle Doku lesen!
    3. Haftung
      Jeder Beitragsersteller übernimmt die alleinige Verantwortung seiner Inhalte.
    4. Werbung
      Wir erlauben keine Beiträge, Signaturen, Private Nachrichten oder eMails an Benutzer, die Werbung enthalten. Ausgenommen
      sind Stellengesuche /-angebote, welche ausschließlich im Forum "Stellengesuche" veröffentlicht werden dürfen.
    5. Verstöße
      Regelwidrige Beiträge sollten dem Team gemeldet werden. Nach deren Überprüfung werden wir schnellstmöglich
      entsprechend handeln.
    6. Authorität
      Den Anweisungen der Team-Mitglieder (Administratoren und Moderatoren) sind in diesem Forum Folge zu leisten.
      Bei Fragen oder Beschwerden bitte an diese wenden.
    Wir möchten Euch darauf aufmerksam machen, dass es bei Verstößen gegen einen oder mehreren der oben genannten
    Punkte dem Team frei steht entsprechend zu handeln. Dies kann z.B. das Löschen eines Beitrags, das Ausschliessen bzw.
    Sperren von Mitgliedern oder aber lediglich eine Verwarnung sein.

    In diesem Zusammenhang sollte erwähnt werden, dass das Forum automatisch die IP-Adresse jedes Beitrag-Erstellers
    speichert. Bei schweren Vergehen, behalten wir es uns vor, die IP-Adresse zur Strafverfolgung weiterzugeben.
  • Willkommen im Zend Framework Forum

    ZF1 Zend Framework 1 + ZF2 Zend Framework 2

    Das Zend Framework Forum ist seit 2006 die erste Anlaufstelle für Zend Framework Entwickler in Deutschland. Mit über 70.000 Beiträgen und einer steigenden Nutzerzahl bietet das Forum hilfreiche Themen und ZF-Tutorials für professionelle Entwickler, fortgeschrittene Programmierer sowie Zend Framework Einsteiger.
    Wenn dies Dein erster Besuch in der Zend Framework Community ist, lies bitte zuerst die Hilfe - FAQ durch. Du musst Dich registrieren, bevor Du Beiträge verfassen kannst. Klicke oben auf 'Registrieren', um die Registrierung zu starten. Du kannst auch jetzt schon Beiträge lesen. Hier im Forum findest Du die Zend Framework Hilfe, die Du suchst!

    Grüße an alle Zend Framework Entwickler. Das Team vom Zend Framework Forum!

    Drupal Agentur

Daten aus DB per Debug anzeigen

mondy

New member
Hallo,

in einem Controller lade ich Daten aus einer DB (ZF2).

PHP:
$teasers = $this->getTeaserTable()->getTeasers($a, $b, $c);
Wenn ich die Daten per foreach durchlaufe, dann werden mir die Daten angezeigt.

PHP:
foreach ($teasers as $teaser) {   echo $teaser->id;   echo "<br>";}
Wenn ich $teasers mit Debug::dump($teasers); ausgebe, dann bekomme ich allerdings das hier ausgegeben:

HTML:
object(Zend\Db\ResultSet\ResultSet)#286 (8) {  ["allowedReturnTypes":protected] => array(2) {    [0] => string(11) "arrayobject"    [1] => string(5) "array"  }  ["arrayObjectPrototype":protected] => object(Ibe\Model\Teaser)#268 (6) {    ["id"] => NULL    ["cluster"] => NULL    ["agent"] => NULL    ["affiliate"] => NULL    ["idpage"] => NULL    ["type"] => NULL  }  ["returnType":protected] => string(11) "arrayobject"  ["buffer":protected] => NULL  ["count":protected] => int(90)  ["dataSource":protected] => object(Zend\Db\Adapter\Driver\Pdo\Result)#285 (8) {    ["statementMode":protected] => string(7) "forward"    ["resource":protected] => object(PDOStatement)#274 (1) {      ["queryString"] => string(107) "SELECT `tabelle`.* FROM `tabelle` WHERE `a` = :where1 AND `b` = :where2 AND `c` = :where3"    }    ["options":protected] => NULL    ["currentComplete":protected] => bool(false)    ["currentData":protected] => NULL    ["position":protected] => int(-1)    ["generatedValue":protected] => string(1) "0"    ["rowCount":protected] => int(90)  }  ["fieldCount":protected] => int(51)  ["position":protected] => int(0)}
Wenn ich die Seite z.B. debugge, sehe ich auch keine Datensätze.

Wie bekomme ich die Datensätze dargestellt?

Danke und Gruß,
Mondy
 

Kaiuwe

Super-Moderator
Wenn ich die Seite z.B. debugge, sehe ich auch keine Datensätze.
Was dir aber nicht neu sein sollte, denn das ist klassische Verhalten von Standard-PHP mit PDO, mysqli und Co.: Du bekommst für deine Abfrage ein Objekt geliefert, welches das Ergebnis deiner Abfrage repräsentiert. Von diesem Objekt holst du dir dann die tatsächlichen Daten, als einzelnes Datum, als ganzen Datensatz oder alle Daten der Abfrage.

An dieser Stelle bekommst du ein Objekt vom Typ „Zend\Db\ResultSet\ResultSet“, auch wenn die Doku hier etwas dünn ist, findest du trotzdem eine passende Methode.
 

mondy

New member
Tut mir leid, anscheinend bin ich zu blöd dafür :-(


In ZF1 habe ich das immer so gemacht:


Im Controller:


$teasers = $this->modelContent->getTeasers($a, $b, $c);


Im Model:


PHP:
public function getTeasers($a, $b, $C){
    $select = $this->db->select();
    $select->from( array( 'teasers' => 'teasers' ),
    array('id', 'pic', 'link', 'type', 'text1', 'text2', 'text3', 'type', 'active' ) );

        ....

    return $this->db->fetchAll($select);
}
Dann konnte ich beim Debuggen in Zend Studio einen Breakpoint hinter $teasers setzen und dann direkt die ganzen Datensätze dort sehen, bzw. mit Zend_Debug::dump($teasers) die Daten auf dem Bildschirm sehen.
 

Kaiuwe

Super-Moderator
In ZF1 habe ich das immer so gemacht:
ZF1 ist hier einfach nicht mehr gültig.

Wenn du mal dem Link folgst, dann wirst du folgendes in der Doku finden:
PHP:
abstract class AbstractResultSet implements Iterator, ResultSetInterface
 {
     public function initialize($dataSource)
     public function getDataSource()
     public function getFieldCount()

     /** Iterator */
     public function next()
     public function key()
     public function current()
     public function valid()
     public function rewind()

     /** countable */
     public function count()

     /** get rows as array */
     public function toArray()
 }
Die letzte Methode sieht doch gar nicht so schlecht aus. Also:
PHP:
Debug::dump($teasers->toArray());
(Das sagt dir übrigens auch deine IDE!)
 

mondy

New member
Das hatte ich sogar schon ausprobiert :eek:
(use Zend\Debug\Debug;)

PHP:
$data = $teasers->toArray();
Dann bekomme ich allerdings die folgende Fehlermeldung im Browser angezeigt:

Warning: include(/usr/local/zend/apache2/htdocs/test1/module/Admin/config/../view/error/index.phtml): failed to open stream: No such file or directory in /usr/local/zend/apache2/htdocs/test1/vendor/zendframework/zendframework/library/Zend/View/Renderer/PhpRenderer.php on line 506

Warning: include(): Failed opening '/usr/local/zend/apache2/htdocs/test1/module/Admin/config/../view/error/index.phtml' for inclusion (include_path='.:/usr/local/zend/var/libraries/Zend_Framework_1/default/library:/usr/local/zend/share/pear') in /usr/local/zend/apache2/htdocs/test1/vendor/zendframework/zendframework/library/Zend/View/Renderer/PhpRenderer.php on line 506
 

Kaiuwe

Super-Moderator
Dann bekomme ich allerdings die folgende Fehlermeldung im Browser angezeigt:

Warning: include(/usr/local/zend/apache2/htdocs/test1/module/Admin/config/../view/error/index.phtml): failed to open stream: No such file or directory in /usr/local/zend/apache2/htdocs/test1/vendor/zendframework/zendframework/library/Zend/View/Renderer/PhpRenderer.php on line 506

Warning: include(): Failed opening '/usr/local/zend/apache2/htdocs/test1/module/Admin/config/../view/error/index.phtml' for inclusion (include_path='.:/usr/local/zend/var/libraries/Zend_Framework_1/default/library:/usr/local/zend/share/pear') in /usr/local/zend/apache2/htdocs/test1/vendor/zendframework/zendframework/library/Zend/View/Renderer/PhpRenderer.php on line 506
Und warum ignorierst du dies einfach?! :rolleyes:

Es wird versucht, das Skript für die Fehlerausgabe aufzurufen, welches bei dir nicht vorhanden ist.
Richte dies mal ein, dann wirst du bestimmt feststellen, das der Zwischenspeicher/Puffer fehlt.
 
Zuletzt bearbeitet:

mondy

New member
Äh ja ok... View erst mal angelegt... :eek:

Jetzt erhalte ich den Fehler:


Ein Fehler ist aufgetreten
An error occurred during execution; please try again later.
Zusätzliche Information:
Zend\Db\ResultSet\Exception\RuntimeException


Datei:


/usr/local/zend/apache2/htdocs/test1/vendor/zendframework/zendframework/library/Zend/Db/ResultSet/AbstractResultSet.php:273


Meldung:


Rows as part of this DataSource, with type object cannot be cast to an array


Stapelüberwachung:


...
 

Kaiuwe

Super-Moderator
Rows as part of this DataSource, with type object cannot be cast to an array
„toArray“ funktioniert bei dir nicht, da dein Objekt „Ibe\Model\Teaser“ nicht entsprechend verwendet/umgewandelt werden kann. (Das du „Ibe\Model\Teaser“ verwendest, habe ich auch jetzt erst gesehen, denn in deinem Ausgangsbeitrag ist der Teil leider nur schlecht zu lesen.)
Wenn ich es richtig gelesen habe, hat dein Objekt eine Methode „exchangeArray“. Wenn du schon die Methode hast, kannst du auch noch die Methode „toArray“ ergänzen. Dann läuft auch die „toArray“-Methode von „AbstractResultSet“.

Ich persönlich verwende keine der beiden Methoden. Ich baue auf die „Hydratoren“ und spare mit damit diese zusätzlichen Methoden. Dann rennt hier ebenfalls die „toArray“-Methode für das gesamte Ergebnisset.
 

mondy

New member
Ich habe mich an das Tutorial gehalten:
Database and models — Zend Framework 2 2.0.7 documentation - Zend Framework

Leider habe ich noch keinen Überblick, was gut ist und was ggf. besser.
Ist wahrscheinlich auch beides problemlos möglich.

Um zunächst mal mein eigentliches Problem zu lösen, habe ich nun den folgenden Code hinzu gefügt:

PHP:
public function toArray()
    {
    $return = array();
    
    foreach ($this as $row) {
    $return[] = $row;
    }
    
    return $return;
    }
Es kommen mir allerdings gleich die Tränen... :confused:


Meldung:

This result is a forward only result set, calling rewind() after moving forward is not supported
 

Kaiuwe

Super-Moderator
Um zunächst mal mein eigentliches Problem zu lösen, habe ich nun den folgenden Code hinzu gefügt:

PHP:
public function toArray()
    {
    $return = array();
    
    foreach ($this as $row) {
    $return[] = $row;
    }
    
    return $return;
    }
Wo hast du das eingefügt?

Es fehlte die Methode „toArray“ in deinem Objekt „Ibe\Model\Teaser“ und dort sollte es deutlich anders aussehen!
 

mondy

New member
Funktioniert ja jetzt. Siehe letzter Eintrag. ;-)

Ich habe es in der Teaser.php hinzu gefügt, dort wo das exchangeArray definiert ist.

Zum debuggen ist es halt was blöd, denn dann muss ich extra Code schreiben, um es zu debuggen, und danach wieder entfernen.
Wenn alles funktioniert, dann kann ich den Breakpoint ja auch in der View setzen. Wenn der Breakpoint dort sitzt, dann sehe ich allerdings nur, was in der View ankommt. Wenn sich der Fehler direkt im Controller oder im Model befindet, ist das eigentlich zu spät, denn man möchte ja wissen, an welcher Stelle der Fehler entsteht.

Kann man eigentlich auch den kompletten Select anzeigen lassen, der ausgeführt wird? Im Object stehen auch nur Platzhalter drin.

Danke im Übrigen für die intensive Hilfe.
 

Kaiuwe

Super-Moderator
Ich habe es in der Teaser.php hinzu gefügt, dort wo das exchangeArray definiert ist.
Aber was soll innerhalb deines Objekt „Teaser“ die Eigenschaft „$row“ sein?

Zum debuggen ist es halt was blöd, denn dann muss ich extra Code schreiben, um es zu debuggen, und danach wieder entfernen.
Die „toArray“-Methode ist nicht nur zur Überprüfung nützlich, sondern das du eben auch dein Objekt/die Eigenschaften des Objekts als Array ausliefern kannst.
Solltest du dies nicht benötigen, dann schau dir mal das Thema „Hydrator“ an. Dann kannst du solche Methode („toArray“ und „exchangeArray“) aus deinen Objekten raushalten.

Kann man eigentlich auch den kompletten Select anzeigen lassen, der ausgeführt wird? Im Object stehen auch nur Platzhalter drin.
Schau dir mal den Hintergrund dazu an: „Prepared Statement“, dann wirst du feststellen, dass die Abfrage genau mit diesen Platzhaltern so an die DBMS geht. Der Rest wird dann auch dort zusammengesetzt.
Du kannst dir aber trotzdem die Abfragen anschauen, in dem du das Log der Datenbank verwendest. (vorher aktivieren)
 
Oben