Enrico: Problem mit Pfadangaben?

Hallo,

ich habe das Anzeigeproblem jetzt anderweitig, über eine Tabelle, gelöst.

Ist zwar vielleicht nicht unbedingt die eleganteste Lösung, aber sie funktioniert.

Nun beschäftigt mich aber ein anderes Problem.

Ich habe folgende, auf mein Problem reduzierte, Ordnerstruktur:

|
+-> Ordner "GRAFIKEN"
|   |
|   +-> Ordner "SORTIMENT"
|       |
|       +-> Datei "GewandungMuetzen1.png"
|           Datei "GewandungMuetzen2.png"
|           ...
|
+-> Ordner "SEITEN"
|   |
|   +-> Datei "Sortiment.php"
|       Ordner "INC"
|       |
|       +-> Ordner "PHP"
|           |
|           +-> Datei "BildVerkleinern.php"
|               Datei "LogErzeugen.php"

In die Datei "Sortiment.php" binde ich zunächst die Datei "LogErzeugen.php" ein:

include ("INC/PHP/LogErzeugen.php");

Die Datei "LogErzeugen.php" protokolliert etwaige Fehlermeldungen der Datei "BildVerkleinern.php" in einer Textdatei, da ich hier ja nichts über den echo-Befehl ausgeben lassen kann.

Desweiteren will ich in der Datei "Sortiment.php" zu verkleinernde Grafiken über folgenden Code anzeigen lassen:

echo '<img src="INC/PHP/BildVerkleinern.php?Bild=' . ($Datei . ($i + 1)) . '&Breite=90">';

Die Anweisung $Datei . ($i + 1) liefert mir beispielsweise "GewandungMuetzen6".

In der Datei "BildVerkleinern.php" arbeite ich dann mit der Variablen "Bild" weiter:

if (isset ($_GET['Bild']) && preg_match ("/^[a-z]+[0-9]+$/i", $_GET['Bild']))  
{  
   $Bild = "../GRAFIKEN/SORTIMENT/" . $_GET['Bild'] . ".png";  
  
   if (file_exists ($Bild))  
   {  
      if (isset ($_GET['Breite']) && is_numeric ($_GET['Breite']))  
         GroesseBerechnen ($Bild, $_GET['Breite'], "");  
      else  
         if (isset ($_GET['Hoehe']) && is_numeric ($_GET['Hoehe']))  
            GroesseBerechnen ($Bild, "", $_GET['Hoehe']);  
         else  
            LogErzeugen ('Variable "Breite" oder "Hoehe" fehlt oder ist ungültig');  
   }  
   else  
      LogErzeugen ('Datei "' . $Bild . '" wurde nicht gefunden');  
}  
else  
   LogErzeugen ('Variable "Bild" fehlt oder ist ungültig');

Leider werden die Grafiken aber nicht angezeigt, die über PHP ermittelten Dateinamen stimmen mit tatsächlich existenten Grafiken im Ordner "GRAFIKEN/SORTIMENT" überein.

Da die Ordner "SEITEN" und "GRAFIKEN" auf gleicher Ebene liegen, muss ich in der Datei "BildVerkleinern.php" die Pfadangaben der Bilder ja um "../" ergänzen, da ich eine Ordnerebene zurück gehen muss.

Trotz dass die Grafiken nicht angezeigt werden, wird aber auch keine Log-Datei angelegt. Auch dann nicht, wenn ich gleich zu Beginn der Datei "BildVerkleinern.php" einen Testeintrag in der Textdatei anlegen lassen will.

Es wird nur dann etwas "geloggt", wenn ich den Log-Befehl direkt in der Datei "Sortiment.php" aufrufe.

Da ich nicht weiß, ob mein Problem mit Pfad-Angaben oder der Datei "BildVerkleinern.php" selber zusammenhängt, hier der komplette Code dieser Datei:

if (isset ($_GET['Bild']) && preg_match ("/^[a-z]+[0-9]+$/i", $_GET['Bild']))  
{  
   $Bild = "../GRAFIKEN/SORTIMENT/" . $_GET['Bild'] . ".png";  
  
   if (file_exists ($Bild))  
   {  
      if (isset ($_GET['Breite']) && is_numeric ($_GET['Breite']))  
         GroesseBerechnen ($Bild, $_GET['Breite'], "");  
      else  
         if (isset ($_GET['Hoehe']) && is_numeric ($_GET['Hoehe']))  
            GroesseBerechnen ($Bild, "", $_GET['Hoehe']);  
         else  
            LogErzeugen ('Variable "Breite" oder "Hoehe" fehlt oder ist ungültig');  
   }  
   else  
      LogErzeugen ('Datei "' . $Bild . '" wurde nicht gefunden');  
}  
else  
   LogErzeugen ('Variable "Bild" fehlt oder ist ungültig');  
  
function GroesseBerechnen ($Bild, $xNeu, $yNeu)  
{  
   if ($Groesse = getimagesize ($Bild))  
   {  
      $x = $Groesse[0];  
      $y = $Groesse[1];  
  
      if ($xNeu != "")  
      {  
         $yNeu = round ($y / ($x / $xNeu));  
         $xNeu = round ($x / ($y / $yNeu));  
  
         BildErzeugen ($Bild, $x, $y, $xNeu, $yNeu);  
      }  
      else  
         if ($yNeu != "")  
         {  
            $xNeu = round ($x / ($y / $yNeu));  
            $yNeu = round ($y / ($x / $xNeu));  
  
            BildErzeugen ($Bild, $x, $y, $xNeu, $yNeu);  
         }  
         else  
            LogErzeugen ("Breiten- oder Höhenangabe fehlt");  
   }  
   else  
      LogErzeugen ('"getimagesize" ist fehlgeschlagen');  
}  
  
function BildErzeugen ($Bild, $x, $y, $xNeu, $yNeu)  
{  
   if (! $Bild = imagecreatefrompng ($Bild))  
      LogErzeugen ('"imagecreatefrompng" ist fehlgeschlagen');  
  
   if (! $Thumbnail = imagecreatetruecolor ($xNeu, $yNeu))  
      if (! $Thumbnail = imagecreate ($xNeu,$yNeu))  
         LogErzeugen ('"imagecreatetruecolor" und "imagecreate" als Fallback sind fehlgeschlagen');  
  
   if (! imagecopyresampled ($Thumbnail, $Bild, 0, 0, 0, 0, $xNeu, $yNeu, $x, $y))  
      if (! imagecopyresized ($Thumbnail, $Bild, 0, 0, 0, 0, $xNeu, $yNeu, $x, $y))  
         LogErzeugen ('"imagecopyresampled" und "imagecopyresized" als Fallback sind fehlgeschlagen');  
  
   $Farbcode = imagecolorallocate ($Thumbnail, 255, 0, 0);  
   imagecolortransparent ($Thumbnail ,$Farbcode);  
  
   header("Content-type:image/png");  
  
   imagepng ($Thumbnail, "", 9);  
}

Ich hoffe sehr, dass ihr mir hier weiterhelfen könnt, da es ganz essentiell für unseren Webshop ist, dass die verkleinerte Anzeige von Grafiken reibungslos funktioniert.

Vielen Dank und Gruß,
Enrico

  1. Hallo,

    ich würde mich wirklich sehr über Hilfestellungen freuen, da es, wie bereits geschrieben, sehr wichtig ist, dass die verkleinerte Darstellung von Grafiken funktioniert.

    Gruß,
    Enrico

    1. Om nah hoo pez nyeetz, Enrico!

      ich würde mich wirklich sehr über Hilfestellungen freuen, da es, wie bereits geschrieben, sehr wichtig ist, dass die verkleinerte Darstellung von Grafiken funktioniert.

      Offensichtlich möchtest du ein kommerzielles Projekt vorantreiben. Dafür mit dieser Vehemenz unentgeltlich Hilfe einzufordern, finde ich schon ganz schön dreist.

      Matthias

      --
      Der Unterschied zwischen Java und JavaScript ist größer als der zwischen Schwerin und Schwerindustrie.

      1. Hallo Matthias,

        ich _wünsche_ mir Hilfe, mir war aber nicht klar, dass mein Ersuchen falsch aufgefasst werden könnte.

        "Kommerziell" ist mein Projekt unter dem Aspekt, als dass wir schauen, dass der WebShop etwas Gewinn abwirft, zumindest aber die auf uns zukommenden Unkosten gedeckt sind.

        Gruß,
        Enrico

  2. |
    +-> Ordner "GRAFIKEN"
    |   |
    |   +-> Ordner "SORTIMENT"
    |       |
    |       +-> Datei "GewandungMuetzen1.png"
    |           Datei "GewandungMuetzen2.png"
    |           ...
    |
    +-> Ordner "SEITEN"
    |   |
    |   +-> Datei "Sortiment.php"
    |       Ordner "INC"
    |       |
    |       +-> Ordner "PHP"
    |           |
    |           +-> Datei "BildVerkleinern.php"
    |               Datei "LogErzeugen.php"

    echo '<img src="INC/PHP/BildVerkleinern.php?Bild=' . ($Datei . ($i + 1)) . '&Breite=90">';

    Leider werden die Grafiken aber nicht angezeigt, die über PHP ermittelten Dateinamen stimmen mit tatsächlich existenten Grafiken im Ordner "GRAFIKEN/SORTIMENT" überein.

    Da die Ordner "SEITEN" und "GRAFIKEN" auf gleicher Ebene liegen, muss ich in der Datei "BildVerkleinern.php" die Pfadangaben der Bilder ja um "../" ergänzen, da ich eine Ordnerebene zurück gehen muss.

    Du solltest mal gucken, in welchem Verzeichnis du dich wirklich befindest innerhalb der BildVerkleinern.php

    Wenn du mit "../GRAFIKEN/SORTIMENT/bla" nicht an dein Ziel kommst, bist du wahrscheinlich im falschen Ordner.

    Momentant befindest du dich in SEITEN/INC/PHP, mit "../" gehst du aus PHP raus, fügst dann GRAFIKEN/SORTIMENT/bla an, was in SEITEN/INC/GRAFIKEN/SORTIMENT/bla endet. Da aber SEITEN/INC/GRAFIKEN schon gar nicht existiert, landest du nie beim eigentlichen Ziel.

    Also entweder du arbeitest mit zig "../" bis du wirklich zum richtigen Verzeichnis gelangst (also in dem Falle DocumentRoot) und musst immer aufpassen welches dein aktuelles Verzeichnis ist,
    ODER
    (und das würde ich empfehlen)
    generell mit absoluten Pfaden arbeiten. Also Angaben im Sinne von $_SERVER['DOCUMENT_ROOT'] . 'GRAFIKEN/SORTIMENT/bla' (bei der Ausgabe für den Client natürlich dann $_SERVER['HOST_NAME'])

    MfG
    bubble

    --
    If "god" had intended us to drink beer, he would have given us stomachs. - David Daye
    1. Hallo bubble,

      dass es in zig Verzeichniswechseln enden würde, war mir nicht bewusst.

      Danke für Deine Anregung mit den absoluten Pfaden, die vielleicht auch noch ein Stückchen mehr Sicherheit mit sich bringen können.

      Gruß,
      Enrico

      1. Hallo bubble,

        kann es sein, dass unterschiedliche header-Angaben in den Dateien "___TEST___Sortiment.php" und "BildVerkleinern.php" vielleicht schuld daran könnten, dass die Grafiken nicht angezeigt werden?

        In der Datei "___TEST___Sortiment.php" habe ich header ("Content-Type: text/html; charset=utf-8"), während ich in der Datei "BildVerkleinern.php" unmittelbar vor dem Ausliefern header ("Content-type:image/png")habe.

        Nachwievor finde ich es seltsam, dass in der Datei "BildVerkleinern.php" gar nicht geloggt wird, selbst wenn ich direkt nach dem öffnenden <?php-Tag einen Eintrag in die Log-Datei festlege.

        Auch die feste Definierung der Variablen $_GET["Bild"] führt nicht zu einer verkleinerten Anzeige.

        Es ist echt zum Mäusemelken...

        Gruß,
        Enrico

  3. Hallo,

    direkt zu Beginn der Datei "BildVerkleinern.php", gleich nach dem öffnenden <?php-Tag, habe ich folgenden Code notiert, um einen direkten Zugriff zu vermeiden:

    if (!defined ("START") || constant ("START") != "1")  
       die ("Zugriff verboten");
    

    Kommentiere ich diesen nun Code aus, dann klappt die verkleinerte Darstellung wie gewünscht.

    Jetzt funktioniert es.

    In der, die Datei "BildVerkleinern.php" aufrufenden Datei "___TEST___Sortiment.php" habe ich die Konstante zwar definiert, aber durch die fehlende Übergabe an die Datei "BildVerkleinern.php" wurde diese nicht abgefragt und das Skript hat abgebrochen.

    Und das war die Ursache...

    Danke euch für eure Hilfe :-)

    Gruß,
    Enrico

    1. if (!defined ("START") || constant ("START") != "1")

      die ("Zugriff verboten");

      Da könnt man ruhig noch ein `header("HTTP/1.0 403 Forbidden");`{:.language-php} bzw. `header("Status: 403 Forbidden");`{:.language-php} dazu ;p  
        
      MfG  
      bubble
      
      -- 
      If "god" had intended us to drink beer, he would have given us stomachs. - David Daye
      
      1. Hallo bubble,

        es ist echt der Wahnsinn.

        Da vermutet man den Fehler im eigentlichen Code, durchforstet die Eingaben immer und immer und immer wieder, dabei lag die Ursache an ganz anderer Stelle ^^

        Gruß,
        Enrico

        1. Da vermutet man den Fehler im eigentlichen Code, durchforstet die Eingaben immer und immer und immer wieder, dabei lag die Ursache an ganz anderer Stelle ^^

          Manchmal sieht man halt den Wald vor lauter Bäumen nicht ;)
          Wie war es nun eigentlich mit den Pfadangaben? Hatten die dann doch gestimmt und ich mich geirrt?

          MfG
          bubble

          --
          If "god" had intended us to drink beer, he would have given us stomachs. - David Daye
          1. Manchmal sieht man halt den Wald vor lauter Bäumen nicht ;)

            Du sagst es... :-)

            Wie war es nun eigentlich mit den Pfadangaben?
            Hatten die dann doch gestimmt und ich mich geirrt?

            Die Pfadangaben waren von Anfang an richtig. Du glaubst gar nicht, was ich alles umgestellt hatte, um dahinter zu kommen, dass das, was ich falsch wähnte, doch richtig war bzw. dann was anderes vor lauter Auskommentierungen und Umstellungen zum eigentlichen Problem auch nicht mehr funktionierte... ^^

            Jetzt habe ich auch gleich noch die Erhaltung der Transparenz umgesetzt.

            Läuft ja (jetzt) wie am Schnürchen :-)

            Gruß,
            Enrico

          2. Ach verdammt, zu schnell auf absenden geklickt ;p

            3 Sachen noch:

            1. GroesseBerechnen ($Bild, "", $_GET['Hoehe']);
              mMn. sollte da eher ein null hin statt "", wäre irgendwie sauberer.
              Davon abgesehen kannst auch allgemein auf if($xNeu) testen. "", "0", null, 0, 0.0 und false sind alles falsy-Werte.

            2. Dann solltest du wohl auch unbedingt noch den Größenbereich eingrenzen. Nicht, dass da jemand nen auf 10.000 x irgendwas Pixel skalliert haben will und mit so einer Anfrage dann vielleicht noch im 500ms Takt über diverse Proxies schickt.

            3. Je nach dem, wie viel Platz der Webspace bietet, wäre vielleicht ein Caching angebracht, damit nicht immer neu skalliert werden muss. (das sollte definitiv nicht ohne 2. zu berücksichtigen geschehen)

            MfG
            bubble

            --
            If "god" had intended us to drink beer, he would have given us stomachs. - David Daye
            1. Ah, ok, interessante Denkanstösse, v.a. Punkt 3.

              Das muss ich mir im Detail ergoogeln.

              Gruß,
              Enrico

            2. Hallo,

              10.000 x irgendwas Pixel skalliert
              damit nicht immer neu skalliert werden muss

              gibt's die 'l' im Doppellpack billiger oder was? ;-)

              Ciao,
               Martin

              --
              Auf jeden Menschen auf der ganzen Welt entfallen statistisch gesehen etwa 3000 Spinnen, wie Wissenschaftler jetzt festgestellt haben.
              Wer will meine haben? Denn ich will sie bstimmt nicht.
              Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
              1. 10.000 x irgendwas Pixel skalliert
                damit nicht immer neu skalliert werden muss
                gibt's die 'l' im Doppellpack billiger oder was? ;-)

                Manchmal kommen die Schreibfehler halt auch gleich im Doppelpack :'D
                (War das 'll' in deinem Doppelpack nun eigentlich Absicht war oder nicht?)

                MfG
                bubble

                --
                If "god" had intended us to drink beer, he would have given us stomachs. - David Daye
                1. Hi,

                  10.000 x irgendwas Pixel skalliert
                  damit nicht immer neu skalliert werden muss
                  gibt's die 'l' im Doppellpack billiger oder was? ;-)
                  Manchmal kommen die Schreibfehler halt auch gleich im Doppelpack :'D

                  ach so ist das ...

                  (War das 'll' in deinem Doppelpack nun eigentlich Absicht war oder nicht?)

                  Ich wollte es einfach mal ausprobieren. Gefiel mir aber nicht. :-)

                  Ciao,
                   Martin

                  --
                  Letztlich basiert alles auf dem Feuer, dem Rad, der Eins und der Null.
                    (Gernot Back)
                  Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(