poison: Zufallsbild in Datenbank oder Datei schreiben

Hallo Zusammen,

ich habe folgendes Problem:

Für das Lösen eines Rätsels sollen meine Besucher Sammelkarten erhalten, die sie später auch tauschen können (Tauschbörse im Forum). Die Sammelkarten sollen in SQL oder einer separaten Datei gespeichert werden, um sie später zur Übersicht für den Sammler auszugeben.

Mit folgendem Codeschnipsel habe ich es geschafft, ein Zufallsbild aus einem Ordner zu generieren:

  
$foto = array();  
$ordner = "../schokofroesche";  
$handleordner=opendir ($ordner);  
while (false != ($file = readdir ($handleordner)))  
{  
if ($file != "." && $file != "..")  
{  
array_push($foto,"<img src = '../schokofroesche/$file' border = '0'>");  
}  
}  
closedir($handleordner);  
shuffle($foto);  
echo $foto[0];  

Damit das Rätsel nur einmal in der Woche gemacht werden kann, soll in einer Spalte der Datenbank der Wert 0 durch 1 ersetzt werden.

  
$aendern = "UPDATE rustleoaks Set  
schuettelraetsel=1 WHERE benutzername='" . mysql_real_escape_string($_SESSION["username"]) . "'";  
$update = mysql_query($aendern);  

Es funktioniert soweit alles. Das Bild wird angezeigt und es wird wirklich zufällig ausgegeben. Auch das mit der 1 läuft.

Nur will PHP mir das ausgewählte Bild nicht in die Datenbank schreiben.
Ich habe folgendes eingegeben:

  
$aendern = "UPDATE rustleoaks Set  
schokofrosch1='$foto[0]' WHERE benutzername='" . mysql_real_escape_string($_SESSION["username"]) . "'";  
$update = mysql_query($aendern);  

Ich bekomme keine Fehlermeldung, aber in SQL kommt auch nichts an. Weder der Wert der Variablen, also die URL oder der Pfad des Bildes, noch die Eingabe in PHP ($foto[0]).
Über Google habe ich versucht, herauszufinden, ob ich es einfach nur falsch geschrieben, bzw. die Anführungszeichen o.ä. vergessen habe. In den meisten Beispielen sah es so aus, wie bei mir.

Liegt es daran, dass ich den Wert der Variablen vorher nicht ausgelesen habe oder kann man ein Zufallsbild gar nicht in die Datenbank schreiben? Wie sieht es mit einer Datei aus? Wohl eher auch nicht, oder?

Wäre echt dankbar, wenn mir jemand sagen könnte, was ich falsch mache.

Liebe Grüße
Poison

  1. Hallo Poison,

    Du hast die nächste Runde in der Kontextproblematik eingeläutet :-)

    Mit folgendem Codeschnipsel habe ich es geschafft, ein Zufallsbild aus einem Ordner zu generieren:

    Einrücken macht Deinen Code lesbarer.

    while (false != ($file = readdir ($handleordner)))
    {
        if ($file != "." && $file != "..")
        {
            array_push($foto,"<img src = '../schokofroesche/$file' border = '0'>");

    Einfacher mit gleicher Wirkung:

    #         foto[] = "<img src = '../schokofroesche/$file' border = '0'>";

    Warum willst Du statt des Pfades zur Datei gleich das ganze

    img-Element abspeichern. Speichertest Du nur den Pfad, würde

    Dir das Kontextproblem gar nicht auffallen.

    Beachte: Jeder Eintrag in Deinem Array enthält eine Zeichenkette,

    #          die einfache Anführungszeichen enthält.

    #          Bei der Syntax des img-Elementes hast Du übrigens auch
    #          noch einen Fehler drin: zuviele Leerzeichen.

    }
    }

    [...]

    Nur will PHP mir das ausgewählte Bild nicht in die Datenbank schreiben.
    Ich habe folgendes eingegeben:

    [code lang=php]
    $aendern = "UPDATE rustleoaks Set
    schokofrosch1='$foto[0]' WHERE benutzername='" . mysql_real_escape_string($_SESSION["username"]) . "'";

    hier an dieser Stelle könntest Du Dir Dein SQL-Statement, das heißt den

    Inhalt der Variablen $aendern anzeigen lassen. Du solltest Dein Problem

    sofort erkennen, denn die Zeichenkette sieht wie folgt aus:

      
    ~~~sql
      
    UPDATE rustleoaks Set schokofrosch1='<img src = '../schokofroesche/dateiname.des.bildes' border = '0'>' WHERE benutzername = ...
    

    Damit in Deinem Statement das einfache Anführungszeichen richtig maskiert wird, musst Du - wie Du schon gelernt haben solltest - den Inhalt von $foto[0] ebenfalls mit mysql_real_escape_string() behandeln.

    Du bringst den Inhalt dieser Variablen in einen SQL-Kontext. Diesen Wechsel hast Du nicht beachtet.

    Freundliche Grüße

    Vinzenz

    1. Hi Vinzenz,

      Du bringst den Inhalt dieser Variablen in einen SQL-Kontext. Diesen Wechsel hast Du nicht beachtet.

      Ach, menno. Ist das normal, dass man als Anfänger immer so viele Fehler macht und ständig über die gleichen Dinge stolpert?

      Jetzt habe ich mir schon so eine Art Leitfaden zusammengeschrieben, auf was ich dringend beim Schreiben achten muss und falle trotzdem wieder darauf herein.

      Habe mir die letzten zwei Tage überlegt, ob ich überhaupt noch weiter machen soll. Ich glaube, ich lerne das nie (Frust, heul, grummel).

      Warum willst Du statt des Pfades zur Datei gleich das ganze

      img-Element abspeichern. Speichertest Du nur den Pfad, würde

      Dir das Kontextproblem gar nicht auffallen.

      Was genau meinst Du damit? Etwa so:

        
      schokofrosch1='../schokofroesche/$file'  
      
      

      Wie müsste ich das dann wieder ausgeben? So:

        
      echo '<img src=".htmlspecialchars($row->spaltenname).">'  
      
      

      Dann habe ich da noch ein eine andere Frage dazu.

      Ich hatte mir ja überlegt, alle diese Bilder (jedes Set=7 Bilder, bis jetzt ungefähr 7 Sets und es werden noch mehr) in die Datenbank zu schreiben. Wäre es nicht besser, dass für jeden Benutzer, der an dieser Sammelkarten-Aktion teilnimmt in eine Datei zu packen? Jeder soll ja eine Übersicht über seine Karten haben. Dann müsste ich mit SELECT aus der Datenbank (bis jetzt) 49 Spalten ausgeben. Nicht zielführend, oder?

      Was müsste ich dann für eine Datei nehmen? Normaler Text oder csv?

      Liebe Grüße
      Poison