x-plosiv: gd lib problem

Hallo liebes forum :-)
ich wollte mich mit der gd lib anfreunden, aber bereits bei der einfachsten übung, werden wir feinde.

im ersten schritt geht es darum bilder aus einem ordner als thums darzustellen und mit einem link zu versehen auf das original bild.

dazu habe ich folgenden code:

1. datei: imgs.php

<HTML><HEAD><TITLE>Bildvorschau</TITLE></HEAD>
<BODY BGCOLOR="#FFFFFF">
<?php
  $verz = dir(".");
  while ($datei = $verz->read()) {
    if (eregi(".jpg$", $datei)) {
      echo("<a href="$datei">");
      echo("<img hspace=10 vspace=10 ");
      echo("src="thumb.php?image=$datei">");
      echo("</a>\n");
    }
  }
?>
</BODY></HTML>

und

2. datei: thumb.php

<?php
// Bilderzeugung - thumb.php

header("Content-type: image/jpeg");
  $scale = 3; // Ein Drittel
  $size = getimagesize($image);
  $width = round($size[0]/$scale);
  $height = round($size[1]/$scale);
  $src = imagecreatefromjpeg($image);
  $dest = imagecreate($width,$height);
  imagecopyresized($dest,$src,0,0,0,0,$width,$height,$size[0],$size[1]);
  imagejpeg($dest,100);
  imagedestroy($dest);
  imagedestroy($src);
?>

wenn ich nun das imgs.php aufrufe erstellt er zwar die links auf die bilder (die funktionieren auch) aber die thumbs werden nicht angezeigt.

laut hosting provider ist die gd lib freigeschaltet!

kann mir da jemand helfen?

besten dank für eure hilfe

  1. Moin!

    ich wollte mich mit der gd lib anfreunden, aber bereits bei der einfachsten übung, werden wir feinde.

    Faustregel: Ein mit header() generiertes Bild ist gänzlich ungeeignet, im Browser irgendwelche Skriptfehlertexte anzuzeigen. Im Gegensatz dazu ist ein erfolgreich generiertes Bild, welches als text/html ausgeliefert wird, recht einfach zu identifizieren.

    Deshalb: Entweder hast du auf deinem Server, auf dem du gewisse weitergehende Rechte besitzt, die Möglichkeit, von deinem Bildgeneratorskript aus Meldungen in eine Logdatei zu schreiben, oder du änderst dein Skript so, dass du die Textmeldungen des Generierungsprozesses erhälst, um Fehler zu beheben.

    Mit Fehlermeldungen gibts dann hier auch wieder mehr Hilfe.

    - Sven Rautenberg

    --
    "Habe den Mut, dich deines eigenen Verstandes zu bedienen!" (Immanuel Kant)
    1. hi,

      Faustregel: Ein mit header() generiertes Bild ist gänzlich ungeeignet, im Browser irgendwelche Skriptfehlertexte anzuzeigen. Im Gegensatz dazu ist ein erfolgreich generiertes Bild, welches als text/html ausgeliefert wird, recht einfach zu identifizieren.

      bei direktaufruf des "bild"-URLs im browser genügt es schon, den header()-befehl erst direkt vor dem imagejpeg() zu machen.
      treten vorher fehler auf, wird das script mit dem (hoch wahrscheinlichen) content-type für php-scripte, nämlich text/html ausgeliefert, und die fehlermeldungen sind "sichtbar".

      gruss,
      wahsaga

      1. danke für deinen tip...leider hat es nicht geklappt..er hat keine fehler ausgespuckt :-(

        aber ich habe jetzt die fehlermeldungen von apache gefunden..siehe oberes posting

        dank für deine hilfe

    2. danke..jetzt bin ich schon ein kleines stück weiter....ich habe die fehlermeldungen gefunden. nur hilf mir dies nicht wirklich weiter.... im forum habe ich bis jetzt noch nicht die antwort gefunden.

      hier mal die fehlermeldung:

      [Wed Feb 18 14:49:09 2004] [error] PHP Notice: Undefined variable: image in /home/xy/public_html/test/thumb.php on line 6
      [Wed Feb 18 14:49:09 2004] [error] PHP Notice: Undefined variable: image in /home/xy/public_html/test/thumb.php on line 9
      [Wed Feb 18 14:49:09 2004] [error] PHP Warning: imagecopyresized(): supplied argument is not a valid Image resource in /home/xy/public_html/test/thumb.php on line 11
      [Wed Feb 18 14:49:09 2004] [error] PHP Warning: imagedestroy(): supplied argument is not a valid Image resource in /home/xy/public_html/test/thumb.php on line 15

      danke für eure hilfe...falls ich die lösung finden würde, poste ich sie natürlich hier...

      1. Moin!

        hier mal die fehlermeldung:

        Die sprechen doch für sich! Oder nicht?

        [Wed Feb 18 14:49:09 2004] [error] PHP Notice: Undefined variable: image in /home/xy/public_html/test/thumb.php on line 6

        Undefinierte Variable "image" in Zeile 6

        [Wed Feb 18 14:49:09 2004] [error] PHP Notice: Undefined variable: image in /home/xy/public_html/test/thumb.php on line 9

        Undefinierte Variable "image" in Zeile 9

        [Wed Feb 18 14:49:09 2004] [error] PHP Warning: imagecopyresized(): supplied argument is not a valid Image resource in /home/xy/public_html/test/thumb.php on line 11

        Das angegebene Funktionsargument ist keine gültige Bild-Ressource in Zeile 11.

        [Wed Feb 18 14:49:09 2004] [error] PHP Warning: imagedestroy(): supplied argument is not a valid Image resource in /home/xy/public_html/test/thumb.php on line 15

        Das angegebene Funktionsargument ist keine gültige Bildressource in Zeile 15.

        So, und jetzt denkst du mal scharf nach, was da wohl schiefgegangen sein konnte. Beginne mit: "Warum ist $image undefiniert, und wie soll ich sichere PHP-Skripte schreiben?"

        - Sven Rautenberg

        --
        "Habe den Mut, dich deines eigenen Verstandes zu bedienen!" (Immanuel Kant)
        1. danke für deine hilfe und geduld...aber sorry ich glaube ich stehe auf dem schlauch. ich finde den fehler einfach nicht.

          ich habe jetzt den code der thumb.php mit

          $image = $HTTP_GET_VARS[image];

          erweitert.

          aber es klappt immer noch nicht...

          der fehler jetzt:

          [Wed Feb 18 19:55:32 2004] [error] PHP Notice: Use of undefined constant image - assumed 'image' in /home/xy/public_html/test/thumb.php on line 4

          aber warum $image nicht definiert ist, verstehe ich nicht.

          ev. kannst du mir ja noch einen tip geben....wahrscheinlich sehe ich den wald vor lauter bäumen nicht

          1. Moin!

            ich habe jetzt den code der thumb.php mit

            $image = $HTTP_GET_VARS[image];

            erweitert.

            Das ist im Prinzip in die richtige Richtung gedacht. Nur einen Schritt zu kurz. PHP hat seit eh (also mindestens Version 3.x) die $HTTP_*_VARS-Variablen, in denen die Daten des Requests drinstehen (für * kann man GET, POST, COOKIES, FILES, ENV und SERVER einsetzen).

            Seit PHP Version 4.1 hat sich hier was geändert, und man kann $_* nehmen. Der Zugriff auf diese neuen Variablen ist von überall, auch aus Funktionen heraus, ohne "global $_*" möglich.

            Nimm also, wenn du PHP ab Version 4.1 einsetzt, einfach $_GET, um an URL-Parameter heranzukommen.

            aber es klappt immer noch nicht...

            der fehler jetzt:

            [Wed Feb 18 19:55:32 2004] [error] PHP Notice: Use of undefined constant image - assumed 'image' in /home/xy/public_html/test/thumb.php on line 4

            Sehr schön, bei dir sind Notices eingeschaltet. Die zwingen dich, wirklich sauber zu programmieren, und sie sind auch bei Fehlern eine große Hilfe.

            Das Problem ist schlicht deine Zugriffsform. Du willst in $_GET, welches ein Array ist, das Element mit dem namen "image" haben.

            Preisfrage: Wie gibt man in PHP einen konstanten String an, beispielsweise, um ihn als Text mit echo auszugeben? Genau, man setzt ihn in Anführungszeichen.

            Während du dies bei
            echo "Image";
            wie selbstverständlich tust, läßt du es bei $_GET[image] wie selbstverständlich weg. Warum?

            $_GET['image'] oder $_GET["image"] ist richtig. 'image' ist ein String mit dem Namen des URL-Parameters.

            image (ohne Anführungszeichen) hingegen _kann_ eine definierte Konstante sein. Und wenn das keine definierte Konstante ist, dann weist PHP freundlich darauf hin, und setzt als kleinen Service statt der unbekannten Konstante einfach den Namen der Konstante als String ein.

            aber warum $image nicht definiert ist, verstehe ich nicht.

            Weil bei dir register_globals auf off sind. Es ist der erste und tödlichste Fehler von PHP-Anfängern, dass sie glauben, alles, was sie in der URL als "var1=x&var2=y" übergeben, erscheint wie gottgegeben im Skript als $var1 und $var2. Dem ist nicht so, und man kann sich auf diese Weise herrlich weitreichende Sicherheitslücken einbauen.

            Dass register_globals also ausgeschaltet ist, ist erstens zu deinem eigenen Schutz und zweitens sowieso die empfohlene Standardeinstellung für alle PHP-Versionen. Besser, du gewöhnst dich dran - so riesig ist die Umstellung auf $_GET, $_POST, $_FILES, $_COOKIES, $_ENV und $_SERVER ja nun nicht.

            - Sven Rautenberg

            --
            "Habe den Mut, dich deines eigenen Verstandes zu bedienen!" (Immanuel Kant)
            1. hallo sven

              wow, danke...das ist ja unglaublich wieviel zeit du dir genommen hast für mich und mir alles erklärt hast. daaaaaaaaaaaanke vielmals

              es klappt jetzt sogar :-) danke