Bernd: Was stimmt mit dem Code nicht?

Hallo,

so sieht mein PHP Code aus:

  
<?php  
$abfrage = "SELECT * FROM links WHERE bildurl = '".$_POST["bildurl"]."' AND groesse = '".$_POST["groesse"]."'";  
$abfr = mysql_query($abfrage);  
echo $abfrage;  
while($row = mysql_fetch_object($abfr))  
{  
echo $row->url;  
}  
?>  

das echo $abfrage; spuckt mir dann folgendes aus:

SELECT * FROM links WHERE bildurl = '#t2-user1' AND groesse = '13'

die Werte stehen auch in der Datenbank richtig drin. Aber ich bekomme dennoch folgende Meldung:

Warning: mysql_fetch_object(): supplied argument is not a valid MySQL result resource

Ich verstehe es einfach nicht!

  1. Hi,

    $abfr = mysql_query($abfrage);
    echo $abfrage;
    while($row = mysql_fetch_object($abfr))

    Das stimmt an deinem Code nicht - du fragst die Datenbank nach dem Versuch, eine Abfrage durchzuführen, weder danach, ob diese erfolgreich war, noch warum nicht falls nein.

    Informiere dich, was der Ruckgabewert von mysql_query aussagt, und wie man mysql_error verwendet.

    MfG ChrisB

    --
    Light travels faster than sound - that's why most people appear bright until you hear them speak.
    1. Hallo,

      hab es jetzt mal so gemacht:

        
      $ergebnis = mysql_query($query) or die(mysql_error());  
      
      

      nun bekomme ich diese Meldung:

      No database selected

      das erstaunt mich jetz was, denn das dürfte nicht sein :-)

        
      	error_reporting(E_ALL);  
      	  
      	define ( 'MYSQL_HOST',      'localhost' );  
      	define ( 'MYSQL_BENUTZER',  'xxx' );  
      	define ( 'MYSQL_KENNWORT',  'xxx' );  
      	define ( 'MYSQL_DATENBANK', 'xxx' );  
        
      
      

      und dann das:

        
      		<?php  
      $query = "SELECT * FROM links WHERE bildurl = '".$_POST["bildurl"]."' AND groesse = '".$_POST["groesse"]."'";  
      $ergebnis = mysql_query($query) or die(mysql_error());  
      $datensatz = mysql_fetch_assoc($ergebnis);  
      echo $datensatz['url'];?>  
        
      
      
      1. Hallo Bernd,

        $ergebnis = mysql_query($query) or die(mysql_error());

          
        die() ist zwar keine Fehlerbehandlung, aber ...  
          
        
        > nun bekomme ich diese Meldung:  
        > No database selected  
        > das erstaunt mich jetz was, denn das dürfte nicht sein :-)  
          
        ... wieso?  
          
        
        > ~~~php
          
        
        > 	error_reporting(E_ALL);  
        > 	  
        > 	define ( 'MYSQL_HOST',      'localhost' );  
        > 	define ( 'MYSQL_BENUTZER',  'xxx' );  
        > 	define ( 'MYSQL_KENNWORT',  'xxx' );  
        > 	define ( 'MYSQL_DATENBANK', 'xxx' );  
        >   
        > 
        
        

        und dann das:

          <?php  
        

        $query = "SELECT * FROM links WHERE bildurl = '".$_POST["bildurl"]."' AND groesse = '".$_POST["groesse"]."'";
        $ergebnis = mysql_query($query) or die(mysql_error());
        $datensatz = mysql_fetch_assoc($ergebnis);
        echo $datensatz['url'];?>

          
        Ich sehe nirgendwo einen Aufruf von [mysql_connect()](http://de.php.net/manual/de/function.mysql-connect.php) und [mysql_select_db()](http://de.php.net/manual/de/function.mysql-select-db.php).  
          
          
        Freundliche Grüße  
          
        Vinzenz
        
  2. Hallo,

    so sieht mein PHP Code aus:

    [code lang=php]
    <?php
    $abfrage = "SELECT * FROM links WHERE bildurl = '".$_POST["bildurl"]."' AND groesse = '".$_POST["groesse"]."'";

    Kontextwechsel nicht erkannt und deswegen nicht behandelt, siehe SELFHTML aktuell Kontextwechsel erkennen und behandeln. SQL-Injection ist somit prinzipiell möglich.

    $abfr = mysql_query($abfrage);

    Es fehlt die Prüfung des Rückgabewertes von mysql_query() - und für den Fall, dass mysql_query keine Ressource zurückliefert, welchen Fehler MySQL dazu meldet. Dazu könntest Du mysql_error() nutzen.

    Der Rest dürfte Folgefehler sein.

    Grundsätzlich empfehle ich, die veralteten und wenig leistungsfähigen mysql_*-Funktionen zugunsten modernerer und leistungsfähigerer Erweiterungen wie mysqli oder PDO aufzugeben.

    Freundliche Grüße

    Vinzenz

  3. Hallo,

    von den ganzen anderen schon angesprochenen Dinge mal abgesehen ...

    $abfrage = "SELECT * FROM links WHERE bildurl = '".$_POST["bildurl"]."'

    echo $row->url;

    Warning: mysql_fetch_object(): supplied argument is not a valid MySQL result resource

    Diese Fehlermeldung will Dir sagen: Du hast dem Objekt (hier: $row) ein ungültiges Argument (hier: url) übergeben. Jetzt schau Dir noch mal Deine Abfrage an - steht da irgend wo etwas von "url"?

    Grüße, luti

    1. Hallo,

      $abfrage = "SELECT * FROM links WHERE bildurl = '".$_POST["bildurl"]."'
      echo $row->url;
      Warning: mysql_fetch_object(): supplied argument is not a valid MySQL result resource
      Diese Fehlermeldung will Dir sagen: Du hast dem Objekt (hier: $row) ein ungültiges Argument (hier: url) übergeben.

      völlig missverstanden!
      Diese Fehlermeldung sagt nichts anderes, als dass die Funktion mysql_fetch_object(), die als Argument ein MySQL-Ressourcenhandle erwartet, eben kein gültiges Handle bekommt. Mit anderen Worten:

      while ($row = mysql_fetch_object($abfr))

      In $abfr steht schon Unsinn drin. Der Fehler ist also da zu suchen, wo $abfr einen Wert erhält:

      $abfr = mysql_query($abfrage);

      Denn mysql_query() gibt im Erfolgsfall ein MySQL-Ressourcenhandle zurück, im Fehlerfall aber einfach FALSE. Hier wäre also zu untersuchen, warum mysql_query() fehlschlägt.
      Der Grund dürfte sein (wie Vinzenz schon aufmerksam festgestellt hat), dass nirgends eine Verbindung zur Datenbank hergestellt wird.

      Jetzt schau Dir noch mal Deine Abfrage an - steht da irgend wo etwas von "url"?

      Vielleicht. Wir wissen ja nicht, welche Spalten die Tabelle hat, die der OP abfragen will.

      So long,
       Martin

      --
      Ordnung ist, wenn man etwas findet, was man gar nicht sucht.
  4. Guten morgen,

    vielen dank für eure ganzen Antworten. Ich habe es nun so umgesetzt:

      
      
    mysql_connect("localhost",  
      "xx","xx") or die  
      ("Keine Verbindung moeglich");  
      mysql_select_db("xx") or die  
      ("Die Datenbank existiert nicht");  
      
    
    

    dann hierm eine Abfrage:

      
    $query = "SELECT * FROM links WHERE bildurl = '".$_POST["bildurl"]."' AND groesse = '".$_POST["groesse"]."'";  
    $ergebnis = mysql_query($query) or die(mysql_error());  
    $datensatz = mysql_fetch_assoc($ergebnis);  
    
    

    Und so dann die Ausgabe:

    <?php echo $datensatz['url'];?>

    Was ich aber noch nicht ganz verstehe ist folgendes:

    Grundsätzlich empfehle ich, die veralteten und wenig leistungsfähigen mysql_*-Funktionen zugunsten modernerer und leistungsfähigerer Erweiterungen wie mysqli oder PDO aufzugeben.

    Kann mir das villeicht jemand mal noch erklären? Vielen dank schon mal im voraus.

    Gruß,
    Bernd

    1. Hallo Bernd,

      mysql_connect("localhost",
        "xx","xx") or die
        ("Keine Verbindung moeglich");

      1. die() ist keine Fehlerbehandlung.

      mysql_select_db("xx") or die
        ("Die Datenbank existiert nicht");

      2. die() ist keine Fehlerbehandlung.

      $query = "SELECT * FROM links WHERE bildurl = '".$_POST["bildurl"]."' AND groesse = '".$_POST["groesse"]."'";
      $ergebnis = mysql_query($query) or die(mysql_error());

      3. die() ist keine ... Du weißt jetzt hoffentlich, was die() nicht ist.

      Was ich aber noch nicht ganz verstehe ist folgendes:

      Grundsätzlich empfehle ich, die veralteten und wenig leistungsfähigen mysql_*-Funktionen zugunsten modernerer und leistungsfähigerer Erweiterungen wie mysqli oder PDO aufzugeben.

      Im PHP-Handbuch ist es ganz gut zusammengefaßt: http://www.php.net/manual/de/mysqli.overview.php (derzeit keine deutsche Version verfügbar).

      Freundliche Grüße

      Vinzenz