dor_neue: Warning: mysql_fetch_array(): supplied argument is not a ...

echo $begruessung;

Schreibe gerade nen Downloadscript - also der User klickt einen Link an (z.B. FileDownload.php?f8b071da2be98f6dd4f1c454f3ca888b) und bekommt dann die Datei hallo.pdf als Download.
Dabei muss ich natürlich auf meine MySQL-Datenbank zurückgreifen:

// Verbindungsaufbau - Verbindungsdaten lass ich hier mal wech :P
if (!($DB_connection = @mysql_connect($hostname,$username,$passwort)))
 echo mysql_errno() . ": " . mysql_error(). "\n";

if (!(mysql_select_db($database, $DB_connection)))
 echo mysql_errno() . ": " . mysql_error(). "\n";
// Verbindung aufgebaut - bis hierher keine Fehler

// Abfrage formulieren und absenden - einfachhalber schon statischer Wert und keine Variable als physical_filename
$SQL_Abfrage =  'SELECT * FROM files WHERE physical\_filename LIKE 'f8b071da2be98f6dd4f1c454f3ca888b' LIMIT 1 ';
$SQL_Ergebniss = mysql_query("$SQL_Abfrage");

// Fehlerausgabe
echo mysql_errno() . ": " . mysql_error(). "\n";

// Anhand der Anzahl der Zeilen erkenne ich wieviele Treffer da sind
echo mysql_num_rows($SQL_Ergebniss);

//
$Details_zum_File = mysql_fetch_array(SQL_Ergebniss);

Danach bekomm ich die Fehlermeldung:
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in ***/FileDownload.php on line 55
Die Sterne anstelle des Pfades...

Und nun mein großes Problem: Der Fehler kommt nur, wenn mysql_num_rows($SQL_Ergebniss) > 0 und liefert über mysql_error() dabei KEINEN Fehler zurück... Die gleiche Abfrage im phpmyadmin funzt ohne Probleme...
Und um jetzt noch eins draufzusetzen - wenn die Abfrage keine Einträge zurückliefert - dann kommt keine Fehlermeldung...

  1. Hallo,

    Dabei muss ich natürlich auf meine MySQL-Datenbank zurückgreifen:

    "natürlich"? Du könntest die Dokumente ebensogut aus dem Dateisystem des Servers holen und so ausliefern.

    $SQL_Ergebniss = mysql_query("$SQL_Abfrage");

    "Ergebnis" mit Doppel-s zu schreiben, ist anscheinend eine sehr verbreitete Unsitte. Nebenbei: Warum bettest du $SQL_Abfrage erst noch in einen String ein und machst dem Parser damit unnötig mehr Arbeit?

    $Details_zum_File = mysql_fetch_array(SQL_Ergebniss);
    Danach bekomm ich die Fehlermeldung:
    Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in ***/FileDownload.php on line 55

    Das wundert mich nicht. Ein Klassiker:
    Zu wenig Geld. Investier hier mal ein paar Dollar.
    Oder hast du zusätzlich noch eine Konstante SQL_Ergebniss definiert, die auch noch zufällig denselben Wert hat wie die Variable $SQL_Ergebniss? Im übrigen wundert mich, dass PHP nicht noch eine Meldung (eine Notice) ausgibt, die dich auf die Verwendung einer nicht definierten Konstanten hinweist ...

    Und um jetzt noch eins draufzusetzen - wenn die Abfrage keine Einträge zurückliefert - dann kommt keine Fehlermeldung...

    Klar, dann wird der Aufruf von mysql_fetch_array() ja gar nicht ausgeführt.

    So long,
     Martin

    --
    Nicht jeder, der aus dem Rahmen fällt, war vorher im Bilde.
    1. $SQL_Abfrage =  'SELECT * FROM files WHERE physical\_filename LIKE 'f8b071da2be98f6dd4f1c454f3ca888b' LIMIT 1 ';
      der Einsatz von LIKE ohne Wildcard dürfte wenig Mehrwert bringen - im Gegenteil. Geh auf ein normales = zurück.

      Hab ich gemacht - danke für den Tipp...
      Eigentlich war vorher auch nen =geplant, aber bei meinem rumprobieren bin ich dann auch über LIKE %...% zu LIKE gekommen und hab es nicht mehr zurück geändert...

      Hallo,

      Dabei muss ich natürlich auf meine MySQL-Datenbank zurückgreifen:

      "natürlich"? Du könntest die Dokumente ebensogut aus dem Dateisystem des Servers holen und so ausliefern.

      Jop, geht auch - aber ich will:

      1. was in PHP und MySQL lernen
      2. den echten Dateinamen bis zum Schluss "verstecken"
      3. ich mir das so in den Kopf gesetzt habe

      Ansonsten würde ja nen Link auf die Datei reichen - ich will aber header, SQL, PHP und Dateihandling usw. üben...

      $SQL_Ergebniss = mysql_query("$SQL_Abfrage");

      "Ergebnis" mit Doppel-s zu schreiben, ist anscheinend eine sehr verbreitete Unsitte. Nebenbei: Warum bettest du $SQL_Abfrage erst noch in einen String ein und machst dem Parser damit unnötig mehr Arbeit?

      Weil ich es so in einem PHP-Tut gelernt habe und ca. 75% der TuT's die ich gefunden habe, das auch so machen...
      Irgendwie dort abgeschaut und unbewusst übernommen...
      Hast aber natürlich Recht, dass hier eine Var unnütze belegt wird...

      $Details_zum_File = mysql_fetch_array(SQL_Ergebniss);
      Danach bekomm ich die Fehlermeldung:
      Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in ***/FileDownload.php on line 55

      Das wundert mich nicht. Ein Klassiker:
      Zu wenig Geld. Investier hier mal ein paar Dollar.

      Mhhhh, das war das Problem... Soll ich sagen, dass ich bestimmt 4 Stunden probiert habe bevor ich hier gepostet habe? So ein sinnloser Fehler...

      DANKE an Euch Beide - freut mich, dass man hier so schnell Hilfe findet und solche Probleme so schnell gelöst werden können...

      1. Hi dor_neue,

        "Ergebnis" mit Doppel-s zu schreiben, ist anscheinend eine sehr verbreitete Unsitte. Nebenbei: Warum bettest du $SQL_Abfrage erst noch in einen String ein und machst dem Parser damit unnötig mehr Arbeit?

        Weil ich es so in einem PHP-Tut gelernt habe und ca. 75% der TuT's die ich gefunden habe, das auch so machen...
        Irgendwie dort abgeschaut und unbewusst übernommen...
        Hast aber natürlich Recht, dass hier eine Var unnütze belegt wird...

        Deine Tutorials schreiben ernsthaft $foo = "$bar"? Dann solltest du dir lieber bessere Tutorials suchen ;-) Denn $foo = $bar ist ganz klar die bevorzugte Methode, während ersteres gemeinhin als schlechter Stil bezeichnet wird.

        Anders sieht das natürlich aus, wenn du Strings verknüpfen willst, dann hast du im Prinzip 3 Möglichkeiten:

        $foo = "ein Text und $bar";
        $foo = "ein Text und " . $bar;
        $foo = 'ein Text und ' . $bar;

        Die erste und die letzte Methode halte ich für vernünftig. Bei der zweiten kann man sich streiten, das läuft dann wahrscheinlich auf eine grundsätzliche Diskussion zum Thema double- or single-quoted Strings hinaus ;-)

        Mhhhh, das war das Problem... Soll ich sagen, dass ich bestimmt 4 Stunden probiert habe bevor ich hier gepostet habe? So ein sinnloser Fehler...

        Ein bisschen error_reporting(E_ALL); kann einem Stunden von Arbeit ersparen, wie du nun selber erfahren hast. Deshalb gewöhne dir an, zum Entwickeln immer alle Fehlermeldungen zu aktivieren.

        Viele Grüße,
          ~ Dennis.

  2. $SQL_Abfrage =  'SELECT * FROM files WHERE physical\_filename LIKE 'f8b071da2be98f6dd4f1c454f3ca888b' LIMIT 1 ';

    der Einsatz von LIKE ohne Wildcard dürfte wenig Mehrwert bringen - im Gegenteil. Geh auf ein normales = zurück.

    MfG
    Rouven

    --
    -------------------
    sh:| fo:} ch:? rl:( br:& n4:{ ie:| mo:} va:) js:| de:] zu:| fl:( ss:) ls:& (SelfCode)
    Unser Problem ist, dass wir eine Demokratie entwickelt haben, was nicht immer der richtige Weg ist  --  Bernie Ecclestone zu den lästigen Diskussionen um Regeländerungen in der Formel 1