pc-world: Warning: mysql_fetch_array(): supplied argument is not a ...

Hallo, ich bekomme bei meiner Seite folgende Fehlermeldung:
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in ...

Ich habe schon im Internet nach diesem Problem gesucht und auch schon ein bisschen rumprobiert, was allerdings bis jetzt noch nichts genützt hat.

Hier mein Code:

  
<?php  
include "mysqlconfig.inc.php"; //MySQL-Login sowie DB-Auswahl  
  
//Variablen-Sicherheit  
$res =  mysql_query("select max(id) AS max from ".$tableforen);  
$row =  mysql_fetch_array($res);  
$maxForumId = $row["max"];  
if(isset($_GET['fid']) && $_GET['fid'] > 0 &&  $_GET['fid'] < ($maxForumId + 1) ) { $fid = mysql_real_escape_string(htmlentities($_GET['fid'],ENT_QUOTES)); } else { echo 'Keine Forums-ID empfangen oder die Forums-ID existiert nicht.'; exit; }  
  
$res =  mysql_query("select max(id) AS max from ".$tablethreads);  
$row =  mysql_fetch_array($res);  
$maxThreadId = $row["max"];  
if(isset($_GET['tid']) && $_GET['tid'] > 0 &&  $_GET['tid'] < ($maxThreadId + 1) ) { $tid = mysql_real_escape_string(htmlentities($_GET['tid'],ENT_QUOTES)); } else { echo 'Keine Thread-ID empfangen oder die Thread-ID existiert nicht.'; exit; }  
  
//Lesen aus DB  
$topic = mysql_query("SELECT * FROM '".$tablethreads."' WHERE id='".$tid."'");  
$topic = mysql_fetch_array($topic);  
$topic = $topic['topic'];  
echo '<h1>'.$topic.'</h1><br><br>';  
  
$res = mysql_query("select * from ".$tableanswers." where fid=".$fid." AND tid=".$tid);  
  
//ausgeben  
while($row = mysql_fetch_array($res)) {  
 $text = nl2br($row["text"]);  
 echo '<fieldset>  
        <legend>'.$row["user"].'schrieb:</legend>'.  
        $text.'</p>';  
}  
?>  

  1. Hi,

    Hallo, ich bekomme bei meiner Seite folgende Fehlermeldung:
    Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in ...

    Dein SQL-Statement ist ungültig. Ich wittere darin aber ein absolut unglaublich kritisch schwerwiegendes Mega-Problem:

    $res =  mysql_query("select max(id) AS max from ".$tableforen);

    Falls es sich bei der Spalte "id" um eine ID-Spalte handelt: Was zur Hölle interessiert Dich dessen Maximalwert? Der hat für Dich keinerlei Nutzen.

    $res = mysql_query("select * from ".$tableanswers." where fid=".$fid." AND tid=".$tid);

    Desweiteren ist das Selektieren von "*" außerhalb von Tests widersinnig.

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. Dein SQL-Statement ist ungültig. Ich wittere darin aber ein absolut unglaublich kritisch schwerwiegendes Mega-Problem:

      $res =  mysql_query("select max(id) AS max from ".$tableforen);

      Falls es sich bei der Spalte "id" um eine ID-Spalte handelt: Was zur Hölle interessiert Dich dessen Maximalwert? Der hat für Dich keinerlei Nutzen.

      Ich möchte überprüfen, ob es überhaupt die ID gibt, die mir in der URL geliefert wird.

      Aber was sollte dort das Problem sein?

      1. Hi,

        Ich möchte überprüfen, ob es überhaupt die ID gibt, die mir in der URL geliefert wird.

        und was hat das mit der maximalen ID zu tun?

        Aber was sollte dort das Problem sein?

        Du scheinst in der ID irgend eine Information zu sehen, die dort nicht existieren *darf*. Ich habe nicht den geringsten Zweifel, dass dies kurz- bis mittelfristig bei Dir zu Problemen führt, die ggf. irreversibel sind.

        Cheatah

        --
        X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
        X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes
        1. und was hat das mit der maximalen ID zu tun?

          Weil es keine höhere gibt...

          Ich hab die Zeilen ja jetzt gelöscht...

          1. Hab jetzt rausbekommen, welche Zeile den Fehler verursacht:

            $sql = "SELECT * FROM '".$tablethreads."' WHERE id='".$tid."'";

            Dann entsteht z. B. folgender Befehl:
            SELECT * FROM 'MeineTabelle' WHERE id='5'

            Die MySQL-Fehlermeldung:
            You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''MeineTabelle' WHERE id='5'' at line 1

            Vermutlich liegt es wirklich an der Spalte id, ich schau gleich mal...

            1. So, hier meine Tabelle $tablethreads :-)

              Kann mir jemand sagen, ob da id steht, ansonten bin ich blind...

            2. echo $begrüßung;

              SELECT * FROM 'MeineTabelle' WHERE id='5'
              You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''MeineTabelle' WHERE id='5'' at line 1
              Vermutlich liegt es wirklich an der Spalte id, ich schau gleich mal...

              Nein, es liegt am Anfang der zitierten Stelle. Der Rest ist einfach nur eine Fortsetzung deines Statements. Das Kapitel Language Structure klärt dich über die Formalitäten der MySQL-Syntax auf. Ein String ist kein Tabellen-Identifizierer.

              echo "$verabschiedung $name";

              1. Ein String ist kein Tabellen-Identifizierer.

                Hab jetzt die Zeile so abgeändert:
                $sql = "SELECT * FROM '".$tablethreads."' WHERE id=".$tid;
                Du meintest doch, dass die ' wegmüssen, oder?

                Jetzt sieht die Variable $sql z. B. so aus:
                SELECT * FROM 'ProjektWeltwunderThreads' WHERE id=5

                Es kommt immer noch die gleiche Fehlermeldung.

                1. echo $begrüßung;

                  Du meintest doch, dass die ' wegmüssen, oder?

                  Jetzt sieht die Variable $sql z. B. so aus:
                  SELECT * FROM 'ProjektWeltwunderThreads' WHERE id=5

                  Es kommt immer noch die gleiche Fehlermeldung.

                  Dann sag ich es dir mochmal deutlicher: Es geht _nicht_ um die id. Die bemängelte Stelle ist am Anfang der in der Fehlermeldung zitierten Stelle deines Statements zu finden, also der Tabellenname.

                  echo "$verabschiedung $name";

                  1. Die bemängelte Stelle ist am Anfang der in der Fehlermeldung zitierten Stelle deines Statements zu finden, also der Tabellenname.

                    Danke! Jetzt geht alles perfekt.

                2. Hello,

                  Hab jetzt die Zeile so abgeändert:
                  $sql = "SELECT * FROM '".$tablethreads."' WHERE id=".$tid;
                  Du meintest doch, dass die ' wegmüssen, oder?

                  Jetzt sieht die Variable $sql z. B. so aus:
                  SELECT * FROM 'ProjektWeltwunderThreads' WHERE id=5

                  Damit das hier nicht halbgar stehen bleibt, auch wenn pc-world inzwischen den fehler gefunden zu haben  scheint:

                  ~~~php

                  $sql = "SELECT $columnlist FROM $tablethreads WHERE id=".intval($tid);

                    
                  sollte nicht schädlich sein für MySQL.  
                    
                  Anstelle von einfachen Hochkommata für den Tabellenbezeichner sind "Backticks" zu verwenden, wenn man die eben überhaupt setzen will (siehe übrige Diskussionen zum Thema in anderen aktuellen Threads).  
                    
                  Und die \_numerische\_ ID, die irgendwie "von außen" kommt, auch als numerische Größe zu übergeben, ist positiv zu gunsten der Sicherheit. Dafür sollte dann aber die 0 als ID nicht zulässig, bzw. den "neutralen Wert" darstellen.  
                    
                  Anderenfalls müsste man hier die vorgesehene Escape-Funktion verwenden (mysql\_real\_escape\_string()).  
                    
                  Ich bin jetzt davon ausgegangen, dass der Tabellenname \_nicht\_ von außen geliefert wird!  
                  Und die Verwendung des \* für die Spaltenliste sollte auch unterbleiben, sondern stattdessen eine dedizierte Liste von Spaltennamen übergeben werden, die ihrerseits dann wieder  
                    
                    
                    ~~~php
                    
                    
                    $columnlist = "`vorname`, `nachname`, `plz`, `index`";  
                    
                    
                  

                  lauten könnte...
                  Ich habe hier absichtlich eine Spalte (index) mit einem reservierten Wort benutzt, da MySQL dies nun einmal erlaubt und ich daher der Meinung bin, dass man genau deshalb auch die Backticks _immer_ einsetzen sollte.

                  Wenn man ein richtiges[tm] DBMS benutzt, kann oder muss man das ja dann sowieso unterlassen.

                  Ein harzliches Glückauf

                  Tom vom Berg

                  --
                  Nur selber lernen macht schlau
                  http://bergpost.annerschbarrich.de
                  1. echo $begrüßung;

                    Wenn man ein richtiges[tm] DBMS benutzt, kann oder muss man das ja dann sowieso unterlassen.

                    Was sind für dich richtige™ DBMS und welche davon bieten keine Möglichkeit, Identifizierer zu quotieren?

                    echo "$verabschiedung $name";

  2. Hallo

    Hallo, ich bekomme bei meiner Seite folgende Fehlermeldung:
    Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in ...

    aha, in welcher Zeile also?

    <?php
    $res =  mysql_query("select max(id) AS max from ".$tableforen);

    Schlechte Idee.

    Wenn Du schon die veralteten mysql_*-Funktionen nutzen willst, dann baue

    bitte Dein Statement zuvor in einer eigenen Variable zusammen, damit Du

    Dir anschauen kannst, was Du da an die DB schickst.

    Es fehlt die Überprüfung, ob die Aktion erfolgreich war.

    $row =  mysql_fetch_array($res);

    Hier könnte der Fehler bereits auftreten.

    [...]

    $res =  mysql_query("select max(id) AS max from ".$tablethreads);
    $row =  mysql_fetch_array($res);

    Gleiches Vorgehen, gleiche fehlende Fehlerbehandlung.

    $topic = mysql_query("SELECT * FROM '".$tablethreads."' WHERE id='".$tid."'");
    $topic = mysql_fetch_array($topic);
    $topic = $topic['topic'];

    Ähnliches Vorgehen, fehlende Fehlerbehandlung, Variable wird zweimal mit

    völlig unterschiedlichen Inhalten überschrieben. Sowas macht man nicht.

    $res = mysql_query("select * from ".$tableanswers." where fid=".$fid." AND tid=".$tid);
    while($row = mysql_fetch_array($res)) {

    Siehe oben ...

      
      
    Freundliche Grüße  
      
    Vinzenz
    
    1. aha, in welcher Zeile also?

      Ich verwende so einen blöden Free-Space-Provider, da stehen in der Fehlermeldung immer Zeilen, die nichtmal in der Datei existieren (sonst hätte ich die Zeile gepostet und auch im Code markiert!).

      <?php
      $res =  mysql_query("select max(id) AS max from ".$tableforen);

      
      >   
      > # Schlechte Idee.  
      > # Wenn Du schon die veralteten mysql\_\*-Funktionen nutzen willst, dann baue  
      > # bitte Dein Statement zuvor in einer eigenen Variable zusammen, damit Du  
      > # Dir anschauen kannst, was Du da an die DB schickst.  
        
      Also das mit der Überprüfung der zuletzt verwendeten ID hab ich jetzt weggelassen, die Fehlermeldung kommt allerdings immer noch.  
        
      
      > # Es fehlt die Überprüfung, ob die Aktion erfolgreich war.  
      > > ~~~php
      
      $row =  mysql_fetch_array($res);[/lang]  
      
      >   
      > # Hier könnte der Fehler bereits auftreten.  
        
      Ich habe jetzt nach allen MySQL-Befehlen "or die(mysql_error())" hinzugefügt. Das ist doch das, was du gemeint hattest, oder?  
        
        
      Mein aktueller Code (die Fehlermeldung kommt immer noch):  
        
      [code lang=php]<?php  
      include "mysqlconfig.inc.php"; //Login und DB-Auswahl  
        
      //Var-Sicherheit  
      if(isset($_GET['fid'])) { $fid = mysql_real_escape_string(htmlentities($_GET['fid'],ENT_QUOTES)); } else { echo 'Keine Forums-ID empfangen oder die Forums-ID existiert nicht..'; exit; }  
        
      if(isset($_GET['tid'])) { $tid = mysql_real_escape_string(htmlentities($_GET['tid'],ENT_QUOTES)); } else { echo 'Keine Thread-ID empfangen oder die Thread-ID existiert nicht.'; exit; }  
        
      //Lesen aus DB  
      $topic = mysql_query("SELECT * FROM '".$tablethreads."' WHERE id='".$tid."'") or die(mysql_error()) or die(mysql_error());  
      $topic = mysql_fetch_array($topic) or die(mysql_error());  
      $topic = $topic['topic'];  
      echo '<h1>'.$topic.'</h1><br><br>';  
        
      $res = mysql_query("select * from ".$tableanswers." where fid=".$fid." AND tid=".$tid);  
        
      //ausgeben  
      while($row = mysql_fetch_array($res) or die(mysql_error())) {  
       $text = nl2br($row["text"]); //Zeilenumbrüche  
       echo '<fieldset>  
              <legend>'.$row["user"].'schrieb:</legend>'.  
              $text.'</p>';  
      }  
      ?>
      
      1. Hi,

        Ich verwende so einen blöden Free-Space-Provider, da stehen in der Fehlermeldung immer Zeilen, die nichtmal in der Datei existieren (sonst hätte ich die Zeile gepostet und auch im Code markiert!).

        durch sinnvolle Debug-Ausgaben lässt sich die Zeile auch dann recht zuverlässig ermitteln, wenn Dein Provider darum bettelt, von Dir verlassen zu werden.

        Also das mit der Überprüfung der zuletzt verwendeten ID

        Du hast die höchste ID abgefragt, nicht die zuletzt verwendete. Egal, wie Du "verwendet" definierst.

        Ich habe jetzt nach allen MySQL-Befehlen "or die(mysql_error())" hinzugefügt. Das ist doch das, was du gemeint hattest, oder?

        Das vermute ich nicht, denn "die()" ist ebenso sehr eine Fehlerbehandlung, wie Suizid eine Heilmethode ist.

        Cheatah

        --
        X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
        X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes
        1. Moin Moin!

          "die()" ist ebenso sehr eine Fehlerbehandlung, wie Suizid eine Heilmethode ist.

          Hmmm, danach hat man jedenfalls keine Probleme mehr mit irgendwelchen Erkrankungen. ;-)

          Als Heilung würde ich das aber auch nicht definieren.

          Alexander

          --
          Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
          1. Hi,

            "die()" ist ebenso sehr eine Fehlerbehandlung, wie Suizid eine Heilmethode ist.
            Hmmm, danach hat man jedenfalls keine Probleme mehr mit irgendwelchen Erkrankungen. ;-)

            es heißt ja, die Aufgabe eines Notarztes sei es, den Patienten in einen stabilen Zustand zu bringen. Der Tod ist ein *sehr* stabiler Zustand ;-)

            Als Heilung würde ich das aber auch nicht definieren.

            Glücklicherweise haben die meisten Ärzte eine ähnliche Auffassung ...

            Cheatah

            --
            X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
            X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
            X-Will-Answer-Email: No
            X-Please-Search-Archive-First: Absolutely Yes
            1. Hallo Cheatah,

              "die()" ist ebenso sehr eine Fehlerbehandlung, wie Suizid eine Heilmethode ist.
              Hmmm, danach hat man jedenfalls keine Probleme mehr mit irgendwelchen Erkrankungen. ;-)

              es heißt ja, die Aufgabe eines Notarztes sei es, den Patienten in einen stabilen Zustand zu bringen. Der Tod ist ein *sehr* stabiler Zustand ;-)

              Nicht für Buddhisten mit schlechtem Karma.

              Grüße

              Marc Reichelt || http://www.marcreichelt.de/

              --
              panic("Oh boy, that early out of memory?");
                      linux-2.2.16/arch/mips/mm/init.c
              Selfcode: ie:{ fl:| br:> va:} ls:< fo:} rl:( n4:( ss:) de:> js:| ch:? sh:| mo:) zu:)
            2. Moin Moin!

              "die()" ist ebenso sehr eine Fehlerbehandlung, wie Suizid eine Heilmethode ist.
              Hmmm, danach hat man jedenfalls keine Probleme mehr mit irgendwelchen Erkrankungen. ;-)

              es heißt ja, die Aufgabe eines Notarztes sei es, den Patienten in einen stabilen Zustand zu bringen. Der Tod ist ein *sehr* stabiler Zustand ;-)

              Naja, zumindest bis die Verwesung einsetzt.

              Alexander

              --
              Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
        2. wenn Dein Provider darum bettelt, von Dir verlassen zu werden.

          Wollte mich gerade von ihm abmelden...
          Natürlich kann es nicht anders kommen und es kommt folgende Fehlermeldung: "Fehler:
          Server konnte nicht identifiziert werden"

          Das ganze Theater war bei: http://www.kostenlos-php.de/ - samt Serverausfällen, manchml hat die Seite 10-40 Sekunden gebraucht, um zu laden... :D