Marc: Alternatives Bild auswählen

Hallo zusammen,

ich habe da ein kleines Problem.
Und zwar erstelle ich grad ein Skript das aus einer MySql-Datenbank ein Bild und eine Beschreibung ausgeben soll.
Alelrdings ist nicht immer ein Bild zu jedem Datensatz vorhanden. Dann soll ein alternatives Bild erscheinen.
Nur irgentwie bekomm ich das nicht hin! Ich bekomme die Meldung das er das .JPG nicht erkennt.

Hier mal ein kurzer Ausschnitt:

while($zeile = mysql_fetch_object($result)){

echo "<table width='618' border='0' height='386'>";
echo "  <tr>";
echo "    <td rowspan='12' width='66%'>";
echo " <img src='bilder/$zeile->com.JPG' width='399' height='300' ></td>";
if ($zeile->com.JPG=="0") {
echo " <img src='bilder/gabelhinten.GIF' width='399' height='300' ></td>";}

Ich bedanke mich im voraus für alle Antworten!:))

  1. Moin!

    ich habe da ein kleines Problem.
    Und zwar erstelle ich grad ein Skript das aus einer MySql-Datenbank ein Bild und eine Beschreibung ausgeben soll.
    Alelrdings ist nicht immer ein Bild zu jedem Datensatz vorhanden. Dann soll ein alternatives Bild erscheinen.

    Wie ist dieser Sachverhalt in der Datenbank gekennzeichnet? Woran erkennst du, dass kein Bild gespeichert ist?

    Nur irgentwie bekomm ich das nicht hin! Ich bekomme die Meldung das er das .JPG nicht erkennt.

    Wie lautet die Meldung wortwörtlich?

    Hier mal ein kurzer Ausschnitt:

    while($zeile = mysql_fetch_object($result)){

    echo "<table width='618' border='0' height='386'>";
    echo "  <tr>";
    echo "    <td rowspan='12' width='66%'>";
    echo " <img src='bilder/$zeile->com.JPG' width='399' height='300' ></td>";
    if ($zeile->com.JPG=="0") {
    echo " <img src='bilder/gabelhinten.GIF' width='399' height='300' ></td>";}

    Ich vermute, PHP hat Probleme mit deiner "sehr kreativen" Art, Variablennamen zu referenzieren.

    - Sven Rautenberg

    --
    ss:) zu:) ls:[ fo:} de:] va:) ch:] sh:) n4:# rl:| br:< js:| ie:( fl:( mo:|
    1. Moin!

      Wie ist dieser Sachverhalt in der Datenbank gekennzeichnet? Woran erkennst du, dass kein Bild gespeichert ist?

      echo " <img src='bilder/$zeile->com.JPG' width='399'
      Mit diesem Befehl rufe ich das Foto auf. com ist die ID-Nummer des Datensatzes.
      Die Anzeige der verschieden Bilder funktioniert.
      Ich möchte allerdings dass ein anderes Bild einfügt wird, wenn kein Foto existiert.

      Wie lautet die Meldung wortwörtlich?

      Notice: Use of undefined constant JPG - assumed 'JPG' in C:\Programme\Apache Group\Apache2\htdocs\Bsp\nummer1.php on line 44

      1. Moin!

        Wie ist dieser Sachverhalt in der Datenbank gekennzeichnet? Woran erkennst du, dass kein Bild gespeichert ist?

        Ich möchte allerdings dass ein anderes Bild einfügt wird, wenn kein Foto existiert.

        Ja, du hast aber immer noch nicht erzählt, woran du erkennen willst, dass es kein Bild gibt.

        Wie lautet die Meldung wortwörtlich?

        Notice: Use of undefined constant JPG - assumed 'JPG' in C:\Programme\Apache Group\Apache2\htdocs\Bsp\nummer1.php on line 44

        Logisch. Dein Zugriff auf die Datenbankobjekte ist nicht korrekt.

        Ich vermute mal, Zeile 44 lautet so:

        if ($zeile->com.JPG=="0")

        Das ist dein Code. Du greifst auf die Variable $zeile->com zu, verkettest diese Variable (.-Operator) noch mit der Konstanten JPG und vergleichst dann, ob das Resultat dem String "0" entspricht.

        Da die Konstante JPG nicht existiert (siehe Fehlermeldung), PHP aber so nett ist, nichtexistente Konstanten in Strings mit dem Inhalt des Konstantennamens zu übersetzen (eine recht dumme Eigenschaft von PHP, aber wenigstens wird das als Notice ausgegeben), passiert also folgendes: Deine Bildnummer "123" wird mit dem String "JPG" verkettet: "123JPG". Das vergleichst du dann mit "0" - ist nicht identisch, also trifft die IF-Abfrage nicht zu.

        - Sven Rautenberg

        --
        ss:) zu:) ls:[ fo:} de:] va:) ch:] sh:) n4:# rl:| br:< js:| ie:( fl:( mo:|
        1. Ja, du hast aber immer noch nicht erzählt, woran du erkennen willst, dass es kein Bild gibt.

          Naja...ich dachte das funktioniert ähnlich wie eine Variable.
          Soll heissen: Ich ich sag ihm er soll jenes Bild öffnen. Wenn es da ist, tut er es und bekomme einen so gesehen "true". Oder er er gibt mir ein false zurück, wenn es nicht da ist (meistens ja null). Und diesen wollte ich eigentlich in einen IF-Befehl abfragen und ihm dann sagen wenn "0" dann tu jenes.

          Logisch. Dein Zugriff auf die Datenbankobjekte ist nicht korrekt.

          Ich vermute mal, Zeile 44 lautet so:

          if ($zeile->com.JPG=="0")

          Das ist dein Code. Du greifst auf die Variable $zeile->com zu, verkettest diese Variable (.-Operator) noch mit der Konstanten JPG und vergleichst dann, ob das Resultat dem String "0" entspricht.

          Naja...das vertsteh ich jetzt etwas...aber ich weiss nicht genau, wenn ich den nicht mit einer Abfrage auf den Pelz rücken kann wie dann?

          Grüße

          Marc

          1. Moin!

            Ja, du hast aber immer noch nicht erzählt, woran du erkennen willst, dass es kein Bild gibt.

            Naja...ich dachte das funktioniert ähnlich wie eine Variable.
            Soll heissen: Ich ich sag ihm er soll jenes Bild öffnen. Wenn es da ist, tut er es und bekomme einen so gesehen "true". Oder er er gibt mir ein false zurück, wenn es nicht da ist (meistens ja null). Und diesen wollte ich eigentlich in einen IF-Befehl abfragen und ihm dann sagen wenn "0" dann tu jenes.

            Falsch gedacht.

            Dein Code macht folgendes: Die Datenbank wird befragt, um einen Datensatz zu erhalten.

            Dann wird ein wenig Text an den Browser geschrieben. Unter anderem auch welcher, der einen Bildlink <img src="..."> enthält.

            _Dann_ fragst du ab, ob die Datenbankvariable (inklusive des Anhängsels "JPG", vgl. mein voriges Posting) dem String "0" entspricht, was nicht der Fall ist.

            Aber selbst wenn das der Fall wäre, würdest du dann zusätzlich einen weiteren Bildlink zum Browser schicken.

            Eine Prüfung, ob irgendeines der Bilder tatsächlich vorhanden ist, findet hier aber nirgendwo statt. Du kannst beliebig ungültige Bildlinks an den Browser schicken. Er wird versuchen, die angegebenen Bilder zu laden und ggf. mit dem "broken image"-Icon den gescheiterten Versuch anzeigen.

            Deshalb meine ständige Nachfrage: Wie ist in der Datenbank verzeichnet, dass es kein Bild gibt? Das wäre nämlich der eleganteste Weg, weil er am schnellsten realisiert werden kann.

            Du könntest beispielsweise für nichtexistente Bilder die Nummer Null speichern, für alle anderen Bilder eine von Null verschiedene Nummer. Dann kannst du _vor_ der Ausgabe eines Bildes entscheiden, welcher Bildlink generiert werden soll.

            Also:

            Abfrage der DB
            Ausgabe HTML
            Abfrage: Gibts das Bild?
              Ja? Ausgabe des speziellen Bildlinks
              Nein? Ausgabe des allgemeinen Bildlinks
            Ausgabe HTML
            ...

            Natürlich kannst du auch explizit nachgucken, ob das in der DB genannte Bild tatsächlich auf dem Server gespeichert ist. Dazu gibts in PHP die Funktion "file_exists()". Allerdings dauert die Ausführung dieser Funktion eine kleine Weile, insbesondere bei Verzeichnissen mit vielen Dateien darin. Insofern erhälst du zwar den Vorteil, dass du immer dann das allgemeine Bild erhälst, wenn entweder keines gespeichert wurde oder das in der DB angegebene irgendwie verlorengegangen ist (vielleicht aus Versehen gelöscht wurde), aber du bezahlst diesen Service mit einem nicht unerheblichen Zeitaufwand, um die Existenz festzustellen.

            Die Funktion ist in http://www.php.net/file-exists beschrieben.

            Abgesehen davon halte ich deinen Code für etwas sehr verwirrend für dich, was die Variablen angeht. PHP erlaubt, dass man in Strings, die mit "" eingegrenzt sind, Variablen direkt angibt und deren Inhalt dann anstelle des Variablennamens dort eingesetzt wird. Das funktioniert mit einfachen Variablen wie $irgendwas ganz gut und ist recht eindeutig. Aber wie in diesem Beispiel deutlich wird, ist auch da eine Grenze gesetzt:

            $beer = "Budweiser";
            echo "Ich habe 3 $beers getrunken"; - ergibt NICHT "Ich habe 3 Budweisers getrunken", weil eine Variable $beers nicht definiert wurde

            Deine Textausgabe ist also wirklich nur mit Glück korrekt:

            echo " <img src='bilder/$zeile->com.JPG' width='399' height='300' ></td>";

            PHP erkennt das $-Zeichen als Variablenbeginn. $zeile ist ein Objekt, deshalb geht die Variablenbezeichnung mit "->" noch weiter bis "com". Der nachfolgende Punkt kann nicht Teil eines Variablennamen sein, also endet der Variablenname vorher und ergibt "$zeile->com". Da steht deine Nummer drin.

            Aber diesen Stil, Variablen in Strings zu verstecken, halte ich persönlich für nicht sehr schön.

            PHP erlaubt auf eine sehr einfache Weise, Variablennamen ordentlich abzugrenzen, indem man entweder:

            • geschweifte Klammern drum herum macht:
              echo " <img src='bilder/{$zeile->com}.JPG' width='399' height='300' ></td>";

            • oder den String zusammenbaut:
              echo " <img src='bilder/".$zeile->com.".JPG' width='399' height='300' ></td>";

            Die zweite Methode hat auch noch den Vorteil, dass sie schneller ist.

            Ich habe mir angewöhnt, komplexe Variablen (also Arrays und Objekte) mindestens in geschweiften Klammern einzuschließen. Ich bevorzuge aber die zweite Methode, weil mein Texteditor den Quelltext farblich hervorhebt und so den Variablennamen im String deutlicher hervorhebt. Das vermindert Fehler.

            Logisch. Dein Zugriff auf die Datenbankobjekte ist nicht korrekt.

            Ich vermute mal, Zeile 44 lautet so:

            if ($zeile->com.JPG=="0")

            Das ist dein Code. Du greifst auf die Variable $zeile->com zu, verkettest diese Variable (.-Operator) noch mit der Konstanten JPG und vergleichst dann, ob das Resultat dem String "0" entspricht.

            Naja...das vertsteh ich jetzt etwas...aber ich weiss nicht genau, wenn ich den nicht mit einer Abfrage auf den Pelz rücken kann wie dann?

            Das Problem ist, dass PHP nicht so funktioniert, wie du glaubst. Und dass du auch etwas ganz anderes beabsichtigt hattest, als ich deinem Code entnommen habe. Ich hatte gedacht, die Null wäre in deiner DB eben das Kennzeichen für "kein Bild vorhanden" (das macht nämlich durchaus Sinn).

            Aber wenn du irgendeinen Wahrheitswert abfragen willst (file_exists() gibt beispielsweise so einen zurück), dann vergleiche so einen Wert gleich direkt mit "true" oder "false", und nicht mit irgendwelchen Strings, die PHP auch irgendwie als wahr oder falsch ansieht.

            Beispiel:

            if (file_exists("bilder/" . $zeile->com . ".JPG"))
            {
              echo "Bildlink...";
            }
            else
            {
              echo "Allgemeines Bild...";
            }

            IF wertet den Ausdruck in runden Klammern aus und ermittelt, ob er wahr oder falsch ist, und verzweigt dann entsprechend in die eine oder andere geschweifte Klammer.

            Entsprechend reicht es vollkommen aus, wenn eine Funktion einfach nur einen Wahrheitswert zurückgibt, ein expliziter Vergleich ist nicht erforderlich.

            Beispiel:

            $zeile->com == "0" -> Da wird ein String mit einem anderen verglichen. Wenn sie gleich sind, ist das Ergebnis "true".

            if ($zeile->com == "0")  <- IF erhält dieses Ergebnis und verzweigt.

            file_exists($dateiname) -> Wenn die Funktion die Datei finden, ist das Ergebnis "true".

            if (file_exists($dateiname)) <- gleiche Funktionsweise wie oben: Wenn IF ein "true" erhält, wird die erste geschweifte Klammer ausgeführt, ansonsten (sofern vorhanden) der ELSE-Teil.

            - Sven Rautenberg

            --
            ss:) zu:) ls:[ fo:} de:] va:) ch:] sh:) n4:# rl:| br:< js:| ie:( fl:( mo:|
            1. Hmm ich versuche das mal!

              Ich danke Dir für Deine Hilfe!

              Grüße

              Marc