Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] korrektes SQL-Statement führt zu non-object Fehler

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] korrektes SQL-Statement führt zu non-object Fehler

    Hilfe, ich komme nicht mehr weiter.

    Ich habe folgenden Code:
    PHP-Code:
    80 $sql2 "SELECT a.fld_disziplin
    81                        FROM tbl_disziplinen as a, tbl_wahl as b
    82                        WHERE a.fld_id = b.tbl_disziplinen_fld_id
    83                        AND b.tbl_athleten_fld_id = 
    $fld_id
    84                        AND b.tbl_jahr_fld_id = 
    $jahrwahl";
    85            $ergebnis2=$db->query($sql2);
    86            var_dump($ergebnis2);
    87            while ($row=$ergebnis2->fetch_object()) {
    88                echo $row->fld_disziplin;
    89            
    wobei meine $db definiert ist (20 Zeilen über diesem Code) und eine Ausgabe von $sql2 auch eine in phpmyadmin korrekt ausführbare Query mit einem Resultat ergibt.
    Wenn ich es aber in der Datei ausführe erhalte ich immer:
    bool(false) Fatal error: Call to a member function fetch_object() on a non-object in /volume1/web/mysqli/php/2006_form_daten_editieren1.php on line 87
    Mich wundert es stark, dass es in phpmyadmin funktioniert und auch ein Resultat (oder sogar mehrere) gibt und hier in der Datei nicht. Ich habe bei Google schon viel versucht und weiss nun nicht mehr weiter, darum mein Hilferuf.

    Vielen Dank für gut gemeinte Ratschläge.

    Martin

  • #2
    Probier mal

    PHP-Code:
    $sql2 "SELECT a.fld_disziplin 
                            FROM tbl_disziplinen as a, tbl_wahl as b 
                            WHERE a.fld_id = b.tbl_disziplinen_fld_id 
                            AND b.tbl_athleten_fld_id = '
    $fld_id
                            AND b.tbl_jahr_fld_id = '
    $jahrwahl'"

    Kommentar


    • #3
      var_dump($ergebnis2) gibt false wie du siehst. Lass dir doch einfach mal die Fehler ausgeben (mysqli_error ...) http://php.net/manual/de/mysqli.error.php und vor allem die fertig geparste query.

      http://php-de.github.io/jumpto/sql/

      LG
      The string "()()" is not palindrom but the String "())(" is.

      Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
      PHP.de Wissenssammlung | Kein Support per PN

      Kommentar


      • #4
        Zitat von Fuel Beitrag anzeigen
        Probier mal

        PHP-Code:
        $sql2 "SELECT a.fld_disziplin 
                                FROM tbl_disziplinen as a, tbl_wahl as b 
                                WHERE a.fld_id = b.tbl_disziplinen_fld_id 
                                AND b.tbl_athleten_fld_id = '
        $fld_id
                                AND b.tbl_jahr_fld_id = '
        $jahrwahl'"
        Habe ich getestet, geht leider auch nicht.

        Ich habe auch den anderen Rat befolgt, habe selbstverständlich im File ganz oben
        PHP-Code:
        ini_set('display_errors'1);
        error_reporting(E_ALL); 
        eingefügt.

        aktueller Code:
        PHP-Code:
        80 $sql2 "SELECT a.fld_disziplin
        81 FROM tbl_disziplinen as a, tbl_wahl as b
        82 WHERE a.fld_id = b.tbl_disziplinen_fld_id
        83 AND b.tbl_athleten_fld_id = '
        $fld_id'
        84 AND b.tbl_jahr_fld_id = '
        $jahrwahl'";
        85 echo $sql2;
        86 $ergebnis2=$db->query($sql2);
        87 while ($row=$ergebnis2->fetch_object()) {
        88     echo $row->fld_disziplin;
        89     echo '   ';
        90
        erzeugt folgende Meldung:
        SELECT a.fld_disziplin FROM tbl_disziplinen as a, tbl_wahl as b WHERE a.fld_id = b.tbl_disziplinen_fld_id AND b.tbl_athleten_fld_id = '276' AND b.tbl_jahr_fld_id = '10' Fatal error: Call to a member function fetch_object() on a non-object in /volume1/web/mysqli/php/2006_form_daten_editieren1.php on line 87
        Wie bereits gesagt führt genau dieses SELECT Statement in phpmyadmin zu einer Ausgabe.

        Kann ich noch mehr Fehlermeldungen ausgeben? Sonstige Hilfen den Fehler zu finden? Könnte es an der Definition einer Variablen liegen?

        Kommentar


        • #5
          PHP-Code:
          echo $db->error
          call to a member function of non-object heißt aber eigentlich das dein Query eben genau kein gültiges Mysqli-Ergebnis liefert.

          [siehe oben, $ergebnis2 ist false]

          Kommentar


          • #6
            Ich habe auch den anderen Rat befolgt, habe selbstverständlich im File ganz oben
            PHP-Code:
            ini_set('display_errors', 1);
            error_reporting(E_ALL);
            Was letztlich überhaupt nichts bringt. Das PHP-Error-reporting ist für PHP-Fehler zuständig (wer hätts gedacht) und die Mysql-Fehlerauswertung für deren Syntaxfehler.


            PHP.de Wiki | Debugging:SQL
            [COLOR="#F5F5FF"]--[/COLOR]
            [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
            „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
            [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
            [COLOR="#F5F5FF"]
            --[/COLOR]

            Kommentar


            • #7
              Zitat von hausl Beitrag anzeigen
              ... Lass dir doch einfach mal die Fehler ausgeben (mysqli_error ...) http://php.net/manual/de/mysqli.error.php und vor allem die fertig geparste query.
              http://php-de.github.io/jumpto/sql/
              The string "()()" is not palindrom but the String "())(" is.

              Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
              PHP.de Wissenssammlung | Kein Support per PN

              Kommentar


              • #8
                PHP-Code:
                                // Verbindung herstellen
                    
                include_once '../php/config.inc.php';
                    
                $db = new mysqli(HOSTUSERPASSWORDDATABASE);
                    
                $db->set_charset('utf8');
                            
                            
                /* check connection */
                if ($db->connect_errno) {
                    
                printf("Connect failed: %s\n"$db->connect_error);
                    exit();
                }

                if (!
                $db->query("SELECT * FROM tbl_jahr")) {
                    
                printf("Errormessage: %s\n"$db->error);

                Das habe ich eingefügt und es führt zu keiner Fehlermeldung.

                Weiter unten im Skript habe ich dann das eingefügt

                PHP-Code:
                                    $sql2 "SELECT a.fld_disziplin
                                        FROM tbl_disziplinen as a, tbl_wahl as b
                                        WHERE a.fld_id = b.tbl_disziplinen_fld_id
                                        AND b.tbl_athleten_fld_id = 
                $fld_id
                                        AND b.tbl_jahr_fld_id = 
                $jahrwahl";
                            if (
                false === mysqli_query($db$sql2)) {
                   die(
                mysqli_error($db));

                Und das führt zu dieser Fehlermeldung:
                Commands out of sync; you can't run this command now
                Das SQL-Statement ist korrekt, wenn ich es mit echo ausgebe und genau diese Ausgabe in phpMyAdmin ausführe erhalte ich das korrekte Ergebnis. Es kann also nicht an falschen Tabellennamen, Spaltenüberschriften oder sonstigem liegen.
                Die Verbindung zur Datenbank ist auch gegeben, sonst würde es oben ja eine Fehlermeldung geben (Connect failed: ...) und auch ein anderer Select ist möglich (es kommt keine Errormessage).
                Seltsam ist einfach, dass ich vorher alles in mysql hatte und jetzt die Dinge auf mysqli geändert habe. Vorher hat es funktioniert.

                Ich bin mit meinem Latein am Ende und bitte um weitere Hilfe. Oder setze ich eure Hinweise falsch um?

                Martin

                Kommentar


                • #9
                  PHP-Code:
                  if (!$db->query("SELECT * FROM tbl_jahr")) { 
                  PHP-Code:
                   if (false === mysqli_query($db$sql2)) { 
                     die(
                  mysqli_error($db)); 
                  Warum mischt du die OO und die prozeduale Variante? Versuch das zweit auch in OOP Schreibweise anzugeben.

                  Ansonsten: https://www.google.at/#q=mysql+commands+out+of+sync

                  LG
                  The string "()()" is not palindrom but the String "())(" is.

                  Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                  PHP.de Wissenssammlung | Kein Support per PN

                  Kommentar


                  • #10
                    Hast du mal nach dieser Fehlermeldung gesucht? Das hat offenbar mit dem Buffern der Queries bzw. mit dem Nicht-Abholen (fetchen) der vorhergehenden Abfrage zu tun. Aber bevor ich hier eine fremde Lösung als meine eigene verkaufe: http://stackoverflow.com/questions/6...is-command-now

                    Kommentar


                    • #11
                      Probiere doch mal die objektorientierte Variante anstatt die prozeduale mit prepared Statements.

                      PHP-Code:
                       $sql2 "SELECT a.fld_disziplin
                                              FROM tbl_disziplinen as a, tbl_wahl as b
                                              WHERE a.fld_id = b.tbl_disziplinen_fld_id
                                              AND b.tbl_athleten_fld_id = ?
                                              AND b.tbl_jahr_fld_id = ?"
                      ;
                      $stmt=$db->prepare($sql2);
                      $stmt->bind_param('ii'$fld_id$jahrwahl);
                      $stmt->execute();
                      $stmt->bind_result($fld_disziplin);
                        
                      while (
                      $stmt->fetch())
                      {
                          echo 
                      $fld_disziplin;
                      }

                      $stmt->close(); 

                      Kommentar


                      • #12
                        Zitat von Tropi Beitrag anzeigen
                        Hast du mal nach dieser Fehlermeldung gesucht? Das hat offenbar mit dem Buffern der Queries bzw. mit dem Nicht-Abholen (fetchen) der vorhergehenden Abfrage zu tun. Aber bevor ich hier eine fremde Lösung als meine eigene verkaufe: http://stackoverflow.com/questions/6...is-command-now
                        Yep, an das habe ich auch schon gedacht und genau diesen Beitrag auch schon gefunden. Ich werde nun alle queries entsprechend umbenennen und hoffen dass mit dem der Fehler behoben ist. Zudem versuche ich die Ergebnisse wieder frei zu geben, mal sehen was passiert.
                        Ist halt eine verschachtelte Abfrage und ich bräuchte eigentlich eine Multiquery, aber da blicke ich noch nicht so durch.

                        Werde alles auf objektorientiert umschalten.

                        Melde mich wieder wenn ich mehr weiss. Vielen Dank bis jetzt für eure Hilfe!!

                        Martin

                        Kommentar


                        • #13
                          PHP-Code:
                                  $sql "SELECT a.fld_vname as fld_vname, a.fld_nname as fld_nname, a.fld_id as fld_id
                                  FROM tbl_athleten as a, tbl_wahl as d
                                  WHERE a.fld_id = d.tbl_athleten_fld_id
                                  AND d.tbl_jahr_fld_id = 
                          $jahrwahl
                                  AND a.tbl_schulen_fld_id = 
                          $schuleid
                                  AND a.tbl_geschlecht_fld_id = 
                          $geschlechtid
                                  GROUP BY a.fld_id
                                  ORDER BY a.fld_nname, a.fld_vname"
                          ;
                                  
                          $sql .= "SELECT a.fld_disziplin as fld_disziplin
                                  FROM tbl_disziplinen as a, tbl_wahl as b
                                  WHERE a.fld_id = b.tbl_disziplinen_fld_id
                                  AND b.tbl_athleten_fld_id = (SELECT a.fld_id
                                                                  FROM tbl_athleten as a, tbl_wahl as d
                                                                  WHERE a.fld_id = d.tbl_athleten_fld_id
                                                                  AND d.tbl_jahr_fld_id = 
                          $jahrwahl
                                                                  AND a.tbl_schulen_fld_id = 
                          $schuleid
                                                                  AND a.tbl_geschlecht_fld_id = 
                          $geschlechtid
                                                                  GROUP BY a.fld_id
                                                                  ORDER BY a.fld_nname, a.fld_vname)
                                  AND b.tbl_jahr_fld_id = 
                          $jahrwahl";
                                  if (
                          $db -> multi_query($sql)) {
                                      do {
                                          
                          #erste Abfrageergebnisse ausgeben
                                          
                          if ($ergebnis -> $db->store_result()) {
                                              while (
                          $row $ergebnis->fetch_object()) {
                                                  echo
                          '<tr>';
                                                  echo
                          '<td>';
                                                      
                          #$AthletenID = $rowabfrage['AthletenID'];
                                                      
                          $_POST['Athleten'] = $row->fld_id;
                                                      echo 
                          '<input type="radio" name="AthletenID" value="'.$row->fld_id.'"/>';
                                                  echo
                          '</td>';
                                                  echo
                          '<td>';
                                                      echo 
                          $row->fld_nname;
                                                  echo
                          '</td>';
                                                  echo
                          '<td>';
                                                      echo 
                          $row->fld_vname;
                                                  echo
                          '</td>';
                                              }
                                              
                          $ergebnis->close();
                                          }
                                          
                          #zweite Abfrageergebnisse ausgeben
                                          
                          if ($db->more_results()) {
                                              while (
                          $zeile $ergebnis->fetch_array()) {
                                                  echo 
                          $zeile->fld_disziplin;
                                                  echo 
                          '&nbsp;&nbsp;&nbsp;';
                                              }
                                                  echo
                          '</td>';
                                          }
                                          echo
                          '</tr>';
                                      }
                                  } 
                          Versuche nun mit einem Multiquery dem Problem Herr zu werden. Funktioniert noch nicht, die letzte geschweifte Klammer sei zuviel. Aber wenn ich es durchzähle stimmt alles. Mal sehen.

                          Gute Nacht!

                          Kommentar


                          • #14
                            Funktioniert noch nicht, die letzte geschweifte Klammer sei zuviel. Aber wenn ich es durchzähle stimmt alles
                            Vermutlich ein fehlendes Semikolin oder eine () Klammer zuviel/wenig...

                            Aber:

                            PHP-Code:
                                  $sql "SELECT a.fld_vname as fld_vname, a.fld_nname as fld_nname, a.fld_id as fld_id 
                                    FROM tbl_athleten as a, tbl_wahl as d 
                                    WHERE a.fld_id = d.tbl_athleten_fld_id 
                                    AND d.tbl_jahr_fld_id = 
                            $jahrwahl 
                                    AND a.tbl_schulen_fld_id = 
                            $schuleid 
                                    AND a.tbl_geschlecht_fld_id = 
                            $geschlechtid 
                                    GROUP BY a.fld_id 
                                    ORDER BY a.fld_nname, a.fld_vname"

                                    
                            $sql .= "SELECT a.fld_disziplin as fld_disziplin 
                                    FROM tbl_disziplinen as a, tbl_wahl as b 
                                    WHERE a.fld_id = b.tbl_disziplinen_fld_id 
                                    AND b.tbl_athleten_fld_id = (SELECT a.fld_id 
                                                                    FROM tbl_athleten as a, tbl_wahl as d 
                                                                    WHERE a.fld_id = d.tbl_athleten_fld_id 
                                                                    AND d.tbl_jahr_fld_id = 
                            $jahrwahl 
                                                                    AND a.tbl_schulen_fld_id = 
                            $schuleid 
                                                                    AND a.tbl_geschlecht_fld_id = 
                            $geschlechtid 
                                                                    GROUP BY a.fld_id 
                                                                    ORDER BY a.fld_nname, a.fld_vname) 
                                    AND b.tbl_jahr_fld_id = 
                            $jahrwahl"
                            Glaub nicht das die query so ok ist. Warum ein concat mit zwei mal "SELECT ... " und wenn dann (weil mir unbekannt) sollte hier jedenfalls mal ein Leerzeichen dazwischen kommen.

                            PHP-Code:
                            ORDER BY a.fld_nnamea.fld_vname"; 
                                    
                            $sql .= "SELECT a.fld_disziplin as fld_disziplin 
                            Aber gut soweit bist du noch nicht wenn du noch mit Parse-Errors wegen falscher Syntax (Klammern ode was auch immer) am Schaffen bist.
                            The string "()()" is not palindrom but the String "())(" is.

                            Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                            PHP.de Wissenssammlung | Kein Support per PN

                            Kommentar


                            • #15
                              Man könnte natürlich auch den Query entsprechend aufräumen... Womöglich braucht man nämlich gar nicht mehrere Queries auf einmal.

                              Kommentar

                              Lädt...
                              X