1. #1

    Registriert seit
    03.09.2015
    Beiträge
    135
    Thanked 55 Times in 40 Posts

    Standard MySQL bestimmte Zeile auslesen

    Moin moin,

    ich weiß nicht wieso, aber es gelingt mir einfach nicht, eine einzelne Zeile aus der Datenbank auszugeben:

    PHP-Code:
    <?php
      $pdo 
    = new PDO("mysql:host=localhost;dbname=Onlineshop""root""root");
      
    $sql "SELECT * FROM users WHERE id = 1";
      
    $user $pdo->query($sql);
      echo 
    $user["vorname"];
    ?>
    Error-Log sagt:
    PHP Fatal error: Cannot use object of type PDOStatement as array in line 5
    Wenn ich mir alle Zeilen ausgebe, denn passt es doch auch:
    PHP-Code:
      $pdo = new PDO("mysql:host=localhost;dbname=Onlineshop""root""root");
      
    $sql "SELECT * FROM users WHERE 1";
     
      foreach (
    $pdo->query($sql) as $user){
        echo 
    $user["vorname"];
      } 
    Ich arbeite mit PHP 5.5. Hat jemand einen Tipp?

    Lg
    Geändert von Negok (08.02.2016 um 07:44 Uhr)
    Mfg

    .\

  2. The Following User Says Thank You to Negok For This Useful Post:

    Investigator (12.12.2018)

  3. #2

    Registriert seit
    02.01.2013
    Beiträge
    879
    Thanked 458 Times in 313 Posts

    Standard AW: MySQL bestimmte Zeile auslesen

    Ich kann kein PHP, kann mir aber denken, wo das Problem liegt. Ergibt nicht $pdo->query($sql) eine Liste von Arrays (oder ein Array von Arrays)? Müsste doch, weil es ja mehrere Ergebnisse geben könnte. Wenn es nur ein Ergebnis gibt, ist es immer noch eine Liste (Array), allerdings mit nur einem Eintrag. Im $user["vorname"] ist aber nicht angegeben, welches Listenelement genommen werden soll... nämlich das erste. Auch bei Listen mit nur einem Element muß man angeben, welches Element man meint, jedenfalls in anderen Programmiersprachen, und es würde mich wundern, wenn das in PHP nicht so ist. Im zweiten Codebeispiel enthält $user keine Liste(Array) von Arrays mehr, denn das Foreach zerpflückt ja die Liste und weist dem $user einzelne Arrays zu (einzelne Ergebniszeilen). $user["vorname"] kann dann problemlos funktionieren, weil $user keine Liste(Array) von Arrays mehr ist, sondern nur noch ein Array (nämlich die Spalten eines Ergebnisses).

    Ich kenne wie gesagt PHP nicht, und weiß nicht, wie man das erste Element einer Liste adressiert... oder ob es überhaupt Listen gibt. Wenn Listen nur Arrays sind, dann musst Du im ersten Beispiel nur angeben, daß Du den ersten Arrayeintrag in $user adressieren willst. In anderen Sprachen wäre das so etwas wie:

    echo user[0].vorname
    Geändert von freulein (05.02.2016 um 15:59 Uhr)

  4. The Following 2 Users Say Thank You to freulein For This Useful Post:

    Investigator (12.12.2018), Negok (10.02.2016)

  5. #3

    Registriert seit
    24.11.2011
    Beiträge
    207
    Thanked 113 Times in 71 Posts

    Standard AW: MySQL bestimmte Zeile auslesen

    Suchst du evtl. das hier:

    PHP-Code:
    <?php
    $pdo 
    = new PDO('mysql:host=localhost;dbname=onlineshop''root''PASSWORT');
     
    $sql "SELECT * FROM users WHERE id = 1";
    foreach (
    $pdo->query($sql) as $row) {
       echo 
    $row['vorname']."<br />";
    }
    ?>
    Geändert von Suchty (05.02.2016 um 18:30 Uhr)

    Kontakt:
    Kein Anschluss unter diesem Nick!

  6. The Following User Says Thank You to Suchty For This Useful Post:

    Investigator (12.12.2018)

  7. #4
    Avatar von DMW007
    Registriert seit
    15.11.2011
    Beiträge
    6.080
    Thanked 9.118 Times in 2.995 Posts
    Blog Entries
    5

    Standard AW: MySQL bestimmte Zeile auslesen

    Dein Beispiel ist bereits vom Syntax her nicht valide, am Ende des DSN-Strings fehlt das schließende doppelte Anführungszeichen. Ich vermute aber mal das ist ein Tippfehler in diesem Beispiel, denn in dem Fall würde PHP das Script abbrechen.

    Das Verhalten deines Codes ist weniger verwunderlich: query() scheint mir eher zum Ausführen einer Abfrage ohne Rückgabewert gedacht zu sein, wie das bei der äquivalenten Funktion des MySQLi-Treibers der Fall ist. Ein Blick in die Dokumentation bestätigt dies, da kein assoziatives Array der Abfrageergebnisse sondern ein PDOStatement-Objekt zurückgegeben wird:

    PHP-Code:
    $pdo = new PDO("mysql:host=localhost;dbname=test""root""");
    $sql "SELECT * FROM user WHERE userid = 1";
    var_dump($pdo->query($sql)); 
    Erzeugt
    Code:
    object(PDOStatement)#2 (1) { ["queryString"]=> string(35) "SELECT * FROM user WHERE userid = 1" }
    Verwendet man die query() Funktion innerhalb einer Schleife, bekommt man kurioserweise wiederum einen nummerischen Array zurück:
    Code:
    array(222) {
        ["userid"]=>
      string(1) "1"
        [0]=>
      string(1) "1"
        ["avatarid"]=>
      string(2) "3"
        [...]
    );
    Leider gibt es in PHP an verschiedenen Stellen verwunderliches bis inkonsistentes Verhalten. Das fängt bei den Namenskonventionen an wie beispielsweise is_string(), aber strcmp(), und geht bis hin zu völlig unerwarteten/absurden Ergebnissen wie beispielsweise dass "foo" == 0 true ergibt. Das ist ein Hauptgrund warum ich .NET bevorzuge, aber zurück zu deinem Problem: Ich würde lieber gleich prepared statements verwenden, und zwar aus zwei Gründen. Erst mal hast du damit diese Problematik nicht, weil du auf das Statement MySQLi-Ähnliche Funktionen wie fetch() oder fetchAll() anwenden kannst. Diese geben dir zuverlässig die selektierten Daten zurück oder ein leeres Array. Darüber hinaus wird dein Code sicherer, weil jeglicher variabler Input in der Abfrage automatisch escaped wird => Keine SQL-Injections mehr.

    Beispiel:
    PHP-Code:
    $pdo = new PDO("mysql:host=localhost;dbname=test""root""");
    $sql "SELECT * FROM user WHERE userid = 1";
    $statement $pdo->prepare($sql);
    $statement->execute();
    $users $statement->fetchAll(PDO::FETCH_ASSOC);
    print_r($users); 
    Erzeugt
    Code:
    Array
    (
        [0] => Array
        (
            [userid] => 1
            [avatarid] => 3
            [...]
        )
    )
    Sollte absehbar sein, dass du nur einen einzigen Datensatz erhalten wirst wie in meinem ersten Beispiel, kannst du auch einfach fetch() statt fetchAll() verwenden. Dann erhälst du direkt ein assoziatives Array ohne Indizes des darüberliegenden nummerischen Arrays:
    Code:
    Array
    (
        [userid] => 1
        [avatarid] => 3
    )
    Was der Fall sein wird weißt du ja in der Regel bereits beim schreiben der Abfrage.


  8. The Following 2 Users Say Thank You to DMW007 For This Useful Post:

    Investigator (12.12.2018), Negok (10.02.2016)

  9. #5

    Registriert seit
    03.09.2015
    Beiträge
    135
    Thanked 55 Times in 40 Posts

    Standard AW: MySQL bestimmte Zeile auslesen

    @Suchty
    Klappt so natürlich - jedoch habe ich angenommen, dass es auch irgendwie ohne Schleife gehen muss, wenn man eh nur ein Ergebnis erhalten sollte.. :- )
    Ich glaube, unsere beiden Beispiele haben wir von folgender Seite: MySQL SELECT komplexe Datenabfragen - MySQL Tutorial - PHP & MySQL lernen
    Direkt unter dem ersten Code-Beispiel steht denn auch:

    Hier können wir auch auf die foreach-Schleife verzichten, da wir nur einen Datensatz zurückerhalten und es alternativ wie folgt schreiben. [...]
    Merkwürdig nur, dass der darauffolgende Code-Snippet (wie von mir gezeigt) denn trotzdem nicht funktioniert..

    @DMW007:
    Den Tippfehler habe ich korrigiert, sorry! Danke für deine Tipps und die hilfreiche Beschreibung! Von den prepared Statements und dem Vortel ggü. Injections habe ich auch schon gelesen, hielt ich vorrangig aber erst mal für nicht notwendig..... Falsch gedacht!

    @fräulein
    In Verbindung mit prepared Satements, wie von DMW007 vorgeschlagen, klappt dein Ansatz über eine weitere Indexierung - danke!
    Geändert von Negok (08.02.2016 um 10:39 Uhr)
    Mfg

    .\

  10. The Following User Says Thank You to Negok For This Useful Post:

    Investigator (12.12.2018)

Ähnliche Themen

  1. Antworten: 8
    Letzter Beitrag: 22.03.2014, 22:57
  2. Ausgewählte Zeile mit Tastenkombination markieren?
    Von x BoooM x im Forum Internet und Technik
    Antworten: 2
    Letzter Beitrag: 30.11.2013, 16:03
  3. [SQL] Jede zweite Zeile ausgeben !
    Von Saad im Forum Andere
    Antworten: 3
    Letzter Beitrag: 13.09.2013, 11:21
  4. VB.Net Richtextbox einzelne Zeile Leerzeichen entfernen
    Von One Way im Forum .Net
    Antworten: 0
    Letzter Beitrag: 10.03.2013, 18:05
  5. VB.Net Captcha aus Quelltext Zeile auslesen
    Von rVs14 im Forum .Net
    Antworten: 9
    Letzter Beitrag: 06.04.2012, 21:31
Diese Seite nutzt Cookies, um das Nutzererlebnis zu verbessern. Klicken Sie hier, um das Cookie-Tracking zu deaktivieren.