Jochen Zwilz: MySql_fetch_assoc Fehler?

Morgen! Bräuchte bitte eure Hilfe!

Hier erstmal der Source Code:

<?php 

$dbncon = mysql_query("SELECT * FROM img_$uzerrofl WHERE imgtype='jpg'");
echo $dbncon;
while($checkit = mysql_fetch_assoc($dbncon)) {
$iddd = $checkit['imgid'];
$typpee = $checkit['imgtype'];
mysql_error();

$file = $iddd.'.'.$typpee;

?>

<a href="imgs/userups/ + <?php echo $file;?>">HAHA</a>;

<?php
}

?>

Das Script soll jedes Bild mit dem Dateitypen 'jpg' als Link ausgeben. Nun erhalte ich folgende Fehlermeldung: Warning: mysql_fetch_assoc() expects parameter 1 to be resource, boolean given in /users/user123/www/index.php on line 82

Der Teil img_$username sollte eigentlich die Tabelle ansprechen die den Inhalt der Variable '$username' als Inhalt hat.

Wie genau löse ich am effizienten die beiden Problem (falls das zweite denn eines ist)?

MfG Jochen

  1. Tach!

    Wie genau löse ich am effizienten die beiden Problem (falls das zweite denn eines ist)?

    Mit Fehlerbehandlung und Dokumentation lesen. Auch eine Suchmaschine kann helfen, diesem sehr häufig auftretendem Fehler auf die Spur zu kommen.

    Die Fehlermeldung sagt aus, dass ein unerwarteter Wert übergeben wird. Nun, da schaut man mal, wo dieser herkommt und dann schaut man in die Dokumentation, warum dieser und nicht der erwartete zurückgegeben wird. Mit var_dump() kann man sich übrigens genaue Informationen zu einem Wert anzeigen kassen. echo ist für solche Debug-Zwecke nahezu ungeeignet.

    Einen booleschen Wert liefert mysql_query() bei einem SELECT nur, wenn da ein Fehler auftrat. So schreibt es die Dokumentation und so ist es. Wie man an die Meldung des eigenlichen Fehlers kommt, weiß auch die Dokumenation.

    Und dann solltest du von der alten und abgekündigten mysql-Extension Abstand nehmen und mysqli oder PDO verwenden.

    dedlfix.

  2. Hallo Jochen,

    Hier erstmal der Source Code:

    <?php 
    
    $dbncon = mysql_query("SELECT * FROM img_$uzerrofl WHERE imgtype='jpg'");
    echo $dbncon;
    while($checkit = mysql_fetch_assoc($dbncon)) {
    $iddd = $checkit['imgid'];
    $typpee = $checkit['imgtype'];
    mysql_error();
    
    $file = $iddd.'.'.$typpee;
    
    ?>
    
    <a href="imgs/userups/ + <?php echo $file;?>">HAHA</a>;
    
    <?php
    }
    
    ?>
    

    Oh man, ist das eine neue Mode, die an mir vorbei gegangen ist? Warum für jeden User eine eigene Tabelle? Da hatte ich mich vor kurzem schon drüber ausgelassen.

    Weiterhin ist die MySQL-Extension deprecated, du solltest sie wirklich nicht mehr verwenden. PHP wird sie entfernen. Verwende lieber PDO oder MySQLi.

    Das Script soll jedes Bild mit dem Dateitypen 'jpg' als Link ausgeben. Nun erhalte ich folgende Fehlermeldung: Warning: mysql_fetch_assoc() expects parameter 1 to be resource, boolean given in /users/user123/www/index.php on line 82

    Dann lass dir mal mit mysql_error() den Fehler in der Query ausgeben. Wenn mysql_query() false zurück gibt, ist da etwas schief gelaufen.

    Weiterhin lass dir die zusammengesetzte Query ausgeben.

    Ist dir auch aufgefallen, dass im Query-String nicht $username steht, sondern $uzerrofl? Ob das ein Fehler ist kann ich ohne Kontext nicht erkennen.

    Weiterhin möchte ich darauf hinweisen, dass das + im Link nicht sinnvoll ist. Ist $file sicher safe im Sinne von HTML? Sprich, vielleicht möchtest du htmlspecialchars darüber laufen lassen.

    Auch der Aufruf von mysql_error() bringt so nichts, du musst das Ergebnis schon auch ausgeben, etwa so: echo mysql_error().

    LG,
    CK

    1. Danke erstmal an euch beide für die raschen Rückmeldungen!

      Ist dir auch aufgefallen, dass im Query-String nicht $username steht, sondern $uzerrofl? Ob das ein Fehler ist kann ich ohne Kontext nicht erkennen.

      Ja, das war ein Fehler von mir, hab mich verschrieben ;)

      Weiterhin möchte ich darauf hinweisen, dass das + im Link nicht sinnvoll ist. Ist $file sicher safe im Sinne von HTML? Sprich, vielleicht möchtest du htmlspecialchars darüber laufen lassen.

      Wie soll ich es deiner Meinung nach anstellen ohne das '+'? htmlspecialchars hab ich jetzt hinzugefügt, leider ist das Hauptproblem, nämlich die Fehlermeldung, noch immer nicht so ganz gelöst.

      Der Var_dump liefert als Resultat 'bool(false)'.

      Nun stehe ich wieder auf der Leitung.

      Mfg

      1. Hallo Jochen,

        Weiterhin möchte ich darauf hinweisen, dass das + im Link nicht sinnvoll ist. Ist $file sicher safe im Sinne von HTML? Sprich, vielleicht möchtest du htmlspecialchars darüber laufen lassen.

        Wie soll ich es deiner Meinung nach anstellen ohne das '+'?

        Lass das + weg. Wenn dieser Sourcecode stimmt:

        <a href="imgs/userups/ + <?php echo $file;?>">HAHA</a>;
        

        Dann gibst du via PHP in einem HTML-Schnipsel einfach etwas via PHP aus. Da ist da ; am Ende sowie das + mit den Leerzeichen einfach über. Dein PHP-Code ist in diesem Fall ja ins HTML embedded.

        htmlspecialchars hab ich jetzt hinzugefügt, leider ist das Hauptproblem, nämlich die Fehlermeldung, noch immer nicht so ganz gelöst.

        Der Var_dump liefert als Resultat 'bool(false)'.

        Was sagt denn echo mysql_error()? Wie sieht denn der zusammen gesetzte Query-String aus? echo "SELECT * FROM img_$username WHERE imgtype='jpg'". Das verschweigst du beides immer noch.

        LG,
        CK

        1. Was sagt denn echo mysql_error()? Wie sieht denn der zusammen gesetzte Query-String aus? echo "SELECT * FROM img_$username WHERE imgtype='jpg'". Das verschweigst du beides immer noch.

          Die Ausgabe von echo "SELECT * FROM img_$username WHERE imgtype='jpg'" ist: SELECT * FROM img_ WHERE imgtype='jpg'.

          Die Variable ist also demnach auch fehlerhaft.

          Und das, weil du die gegebenen Hinweise, dir die Fehlermeldung mit echo mysql_error(); anzeigen zu lassen, nicht befolgt hast.

          Hab ich. Ich hab das Resultat von var_dump(); schon vorhin gepostet, nämlich bool(false).

          Ich werde mir den Rat von Christian und dedlfix zu Herzen nehmen und mich erstmal in mysqli einarbeiten bevor ich weitermache!

          Danke trotzdem erstmal für die viele Hilfe!

          MfG

          1. Hallo Jochen,

            Was sagt denn echo mysql_error()? Wie sieht denn der zusammen gesetzte Query-String aus? echo "SELECT * FROM img_$username WHERE imgtype='jpg'". Das verschweigst du beides immer noch.

            Die Ausgabe von echo "SELECT * FROM img_$username WHERE imgtype='jpg'" ist: SELECT * FROM img_ WHERE imgtype='jpg'.

            Die Variable ist also demnach auch fehlerhaft.

            Das sehe ich auch so.

            Und das, weil du die gegebenen Hinweise, dir die Fehlermeldung mit echo mysql_error(); anzeigen zu lassen, nicht befolgt hast.

            Hab ich. Ich hab das Resultat von var_dump(); schon vorhin gepostet, nämlich bool(false).

            Ich hatte nicht nach dem Resultat von var_dump($dbncon) gefragt, sondern nach dem Ergebnis von echo mysql_error() 😉

            LG,
            CK

            1. Ich hatte nicht nach dem Resultat von var_dump($dbncon) gefragt, sondern nach dem Ergebnis von echo mysql_error() 😉

              Du nicht, aber Auge :D

              von mysql_error() krieg ich gar nix raus außer die alte Fehlermeldung mit Bool und parameter 1..

              1. Hi,

                von mysql_error() krieg ich gar nix raus außer die alte Fehlermeldung mit Bool und parameter 1..

                Weil Du mysql_error erst nach dem fetch_assoc aufrufst ...

                cu,
                Andreas a/k/a MudGuard

      2. Tach!

        Nun stehe ich wieder auf der Leitung.

        Du solltest an dieser Stelle nicht weitermachen, sondern das Handbuch zur Hand nehmen, dir die Alternativen (PDO oder mysqli) anschauen und dann den Datenbankteil von vorn beginnen.

        dedlfix.

      3. Hallo

        Wie soll ich es deiner Meinung nach anstellen ohne das '+'? htmlspecialchars hab ich jetzt hinzugefügt, leider ist das Hauptproblem, nämlich die Fehlermeldung, noch immer nicht so ganz gelöst.

        Der Var_dump liefert als Resultat 'bool(false)'.

        Nun stehe ich wieder auf der Leitung.

        Und das, weil du die gegebenen Hinweise, dir die Fehlermeldung mit echo mysql_error(); anzeigen zu lassen, nicht befolgt hast. Du hast irgendeinen Fehler (vermutlich) im Query, der dafür sorgt, dass im MySQL-Server bei der Ausführung der Anfrage ein Fehler auftritt. Den musst du finden und beheben.

        Den Query solltest du dir vor dessen Ausführung auch noch einmal mit var_dump($dbncon); ansehen. Vielleicht sieht dein Zusammengestückeltes schon da nicht so aus, wie du es haben willst.

        Tschö, Auge

        --
        Wo wir Mängel selbst aufdecken, kann sich kein Gegner einnisten.
        Wolfgang Schneidewind *prust*
        1. Hallo,

          Den musst du finden und beheben.

          Nö, wie dedlfix schrieb, muss er ganz neu beginnnen. Ich hätte zwar auch ne Vermutung, wo die Ursache liegt, aber die behalte ich daher für mich ;p

          Gruß
          Kalk

          1. Hallo,

            Den musst du finden und beheben.

            Nö, wie dedlfix schrieb, muss er ganz neu beginnnen. Ich hätte zwar auch ne Vermutung, wo die Ursache liegt, aber die behalte ich daher für mich ;p

            Gruß
            Kalk

            Ach komm, sag schon :P

  3. Hallo und guten Tag,

    <?php 
    
    $dbncon = mysql_query("SELECT * FROM img_$uzerrofl WHERE imgtype='jpg'");
    echo $dbncon;
    while($checkit = mysql_fetch_assoc($dbncon)) {
    $iddd = $checkit['imgid'];
    $typpee = $checkit['imgtype'];
    mysql_error();
    
    $file = $iddd.'.'.$typpee;
    
    ?>
    
    <a href="imgs/userups/ + <?php echo $file;?>">HAHA</a>;
    
    <?php
    }
    
    ?>
    

    Codiere das, was getan werden soll, mal explizit, also ohne automatische Variablenersetzungen usw. Und dann baue nach jedem fehlerbewehrtem Statement eine passende Fehlerbehandlung nebst -ausgabe ein. Dann sollte Dir schnell klar werden, wo es klemmt.

    Der böse implizite Stil, der mMn durch C eingeführt wurde, spart zwar ein paar Zeilen Quelltext, bedingt aber dadurch eigentlich etliche zusätzliche Zeilen Programmbeschreibung und -dokumentation. Und er sorgt meistens für versteckte, nicht abgefangene Fehlerquellen. Die zwei Minuten, die man beim Codieren spart, steckt man dann hinterher vielfach wieder rein für die Fehlersuche oder die Datenrettung...

    Grüße
    TS

    --
    es wachse der Freifunk
    http://freifunk-oberharz.de
    1. Hallo,

      Der böse implizite Stil, der mMn durch C eingeführt wurde, spart zwar ein paar Zeilen Quelltext, bedingt aber dadurch eigentlich etliche zusätzliche Zeilen Programmbeschreibung und -dokumentation.

      könntest du dazu ein paar Worte mehr verlieren?

      Mir ist nämlich nicht klar, wie oder warum mit C ein impliziter Stil eingeführt worden sein soll oder was du damit konkret meinst. Die Beschreibung und/oder Dokumentation soll ja nicht haarklein ausbreiten, was der Code tut, denn das sollte für jemanden, der C beherrscht, offensichtlich sein. Vielmehr sollte die Idee dahinter, der Algorithmus, das Warum beschrieben werden. Und das ist unabhängig vom Stil oder gar der Programmiersprache.

      Und er sorgt meistens für versteckte, nicht abgefangene Fehlerquellen.

      Such as ...?

      Ciao,
       Martin

      --
      Nothing travels faster than the speed of light with the possible exception of bad news, which obeys its own special laws.
      - Douglas Adams, The Hitchhiker's Guide To The Galaxy
      1. Hallo und guten Tag,

        Der böse implizite Stil, der mMn durch C eingeführt wurde, spart zwar ein paar Zeilen Quelltext, bedingt aber dadurch eigentlich etliche zusätzliche Zeilen Programmbeschreibung und -dokumentation.

        könntest du dazu ein paar Worte mehr verlieren?

        Nö, das ist allgemein bekannt und hier oft genug diskutiert worden. Wer seine Lehren aus der Aussage ziehen will, der wird den Weg finden. Wer nur Gegenhaltungen verbreiten will, kann das von mir aus gerne tun. Jeder glaubt das, was er kennt...

        Grüße
        TS

        --
        es wachse der Freifunk
        http://freifunk-oberharz.de
        1. Hi,

          könntest du dazu ein paar Worte mehr verlieren?

          Nö, das ist allgemein bekannt und hier oft genug diskutiert worden.

          dann eben nicht, schönen Dank auch.

          So long,
           Martin

          --
          Nothing travels faster than the speed of light with the possible exception of bad news, which obeys its own special laws.
          - Douglas Adams, The Hitchhiker's Guide To The Galaxy
          1. Hallo Der Martin,

            könntest du dazu ein paar Worte mehr verlieren?

            Nö, das ist allgemein bekannt und hier oft genug diskutiert worden.

            Ich denke, er meint die Zuweisung in der Bedingung, die zu true oder false ausgewertet wird. Das ist ja nun mal nicht selbstverständlich.

            dann eben nicht, schönen Dank auch.

            Das finde ich allerdings auch.

            Bis demnächst
            Matthias

            --
            Dieses Forum nutzt Markdown. Im Wiki erhalten Sie Hilfe bei der Formatierung Ihrer Beiträge.
            1. Moin,

              könntest du dazu ein paar Worte mehr verlieren?

              Nö, das ist allgemein bekannt und hier oft genug diskutiert worden.

              Ich denke, er meint die Zuweisung in der Bedingung, die zu true oder false ausgewertet wird.

              das ist aber nur dann "merkwürdig", wenn man von Anfang an auf die eingeengte Sichtweise trainiert wurde, dass in der Klammer einer if- oder while-Anweisung eine Vergleichsoperation stehen müsse. Bedingung ist in C ja nur ein Synonym für einen Ausdruck, der Null oder eben nicht Null ergibt.

              Das ist ja nun mal nicht selbstverständlich.

              Wenn man das Konzept des Ausdrucks (Expression) von Anfang an allgemein betrachtet, ist auch das mit der Zuweisung nichts Besonderes mehr. Der Fallstrick lauert nur im Verwechseln von Vergleichs- und Zuweisungsoperator.

              Im Studium fand ich damals die Lernkurve extrem steil: Schon vor Beginn des Studiums war ich eifriger Hobby-Programmierer mit soliden Kenntnissen in BASIC und 6502-Assembler (durch den C64). Von dem für Spaghetti-Code berüchtigten BASIC kam dann der Kulturschock zu Pascal, einer Sprache, die einen sehr stark zur Disziplin zwingt und erzieht und deshalb gern als erste Programmiersprache in der Ausbildung gelehrt wird. Zwei Semester später kam dann C, und ich war geradezu erschlagen von der ungeahnten Flexibilität (gegenüber Pascal), aber auch der teilweise recht knappen, kryptischen Schreibweise. Es dauerte weitere zwei Semester, bis ich C so weit begriffen hatte, dass ich anfing, die Sprache zu mögen. Und es ist bis heute mein Favorit unter den Programmiersprachen geblieben.

              So long,
               Martin

              --
              Nothing travels faster than the speed of light with the possible exception of bad news, which obeys its own special laws.
              - Douglas Adams, The Hitchhiker's Guide To The Galaxy
              1. Hallo und guten Tag,

                könntest du dazu ein paar Worte mehr verlieren?

                Nö, das ist allgemein bekannt und hier oft genug diskutiert worden.

                Ich denke, er meint die Zuweisung in der Bedingung, die zu true oder false ausgewertet wird.

                das ist aber nur dann "merkwürdig", wenn man von Anfang an auf die eingeengte Sichtweise trainiert wurde, dass in der Klammer einer if- oder while-Anweisung eine Vergleichsoperation stehen müsse. Bedingung ist in C ja nur ein Synonym für einen Ausdruck, der Null oder eben nicht Null ergibt.

                Das ist ja nun mal nicht selbstverständlich.

                Wenn man das Konzept des Ausdrucks (Expression) von Anfang an allgemein betrachtet, ist auch das mit der Zuweisung nichts Besonderes mehr. Der Fallstrick lauert nur im Verwechseln von Vergleichs- und Zuweisungsoperator.

                Im Studium fand ich damals die Lernkurve extrem steil: Schon vor Beginn des Studiums war ich eifriger Hobby-Programmierer mit soliden Kenntnissen in BASIC und 6502-Assembler (durch den C64). Von dem für Spaghetti-Code berüchtigten BASIC kam dann der Kulturschock zu Pascal, einer Sprache, die einen sehr stark zur Disziplin zwingt und erzieht und deshalb gern als erste Programmiersprache in der Ausbildung gelehrt wird. Zwei Semester später kam dann C, und ich war geradezu erschlagen von der ungeahnten Flexibilität (gegenüber Pascal), aber auch der teilweise recht knappen, kryptischen Schreibweise. Es dauerte weitere zwei Semester, bis ich C so weit begriffen hatte, dass ich anfing, die Sprache zu mögen. Und es ist bis heute mein Favorit unter den Programmiersprachen geblieben.

                Das kann ich gar nicht glauben!
                Seid Ihr schon so blind, dass Ihr selbst die einfachsten Fehlerquellen nicht mehr seht?

                $dbncon = mysql_query("SELECT * FROM img_$uzerrofl WHERE imgtype='jpg'");
                
                

                Wenn man stabile Programme schreiben will, ist die obige Inline-Ersetzung äußerst kontraproduktiv!

                usw.

                Grüße
                TS

                --
                es wachse der Freifunk
                http://freifunk-oberharz.de
                1. Mahlzeit,

                  Es dauerte weitere zwei Semester, bis ich C so weit begriffen hatte, dass ich anfing, die Sprache zu mögen. Und es ist bis heute mein Favorit unter den Programmiersprachen geblieben.

                  Das kann ich gar nicht glauben!

                  was jetzt? Dass C meine Lieblings-Programmiersprache ist? Weil es so unglaublich flexibel ist?

                  Seid Ihr schon so blind, dass Ihr selbst die einfachsten Fehlerquellen nicht mehr seht?

                  Eigentlich nicht. Okay, manchmal vielleicht.

                  $dbncon = mysql_query("SELECT * FROM img_$uzerrofl WHERE imgtype='jpg'");
                  

                  Wenn man stabile Programme schreiben will, ist die obige Inline-Ersetzung äußerst kontraproduktiv!

                  Keineswegs. Es ist ein bekanntes Feature (meinetwegen auch ein bekanntes Leiden) in PHP, aber eine wohl definierte Eigenschaft. Wenn man PHP nutzt, sollte man dessen Eigenschaften und Features kennen, wie bei jeder anderen Programmier- oder Markupsprache auch. Dann ist die Variablen-Ersetzung auch nicht mehr unbedingt eine Fehlerquelle, auch wenn ich sie nicht unbedingt gutheißen und empfehlen würde.

                  Viel heftiger würde ich am obigen Ansatz das Datenbank-Layout kritisieren. Mehrere gleichartige Tabellen, eine pro User, die dann per Parameter ausgewählt werden, halte ich für ein schlechtes Konzept.

                  Ciao,
                   Martin

                  --
                  Nothing travels faster than the speed of light with the possible exception of bad news, which obeys its own special laws.
                  - Douglas Adams, The Hitchhiker's Guide To The Galaxy