Bewahrer: In php gd rechnen?

Servus!

Ich versuche gerade mit der Gd library ein Bild zu errechnen. Dabei gehe ich folgendermaßen vor:

1. stats.php errechnet ein Diagramm basierend auf ein paar Werten, die stats.php per sql aus ner Datenbank ausliest.
2. Das Bild möchte ich einbinden und tue das bisher mit <img src="stats.php" />.
3. Da die ausgelesenen Daten stark variieren, ist ne For Schleife in stats.php enthalten, die ungefähr so aussieht:

for($i=0;$i<count($Data['Kortison']);$i++) {  
	if($i==0) {  
		// We're at the start of the diagramm, so we obviously start at the beginning of it with drawing  
		$AX = 0;  
	}  
	else {  
		$AX = $i * $DayStep;  
	}  
	$BX = $AX + $DayStep;  
	$AY = $CourseData['A'][$i]['Value'];  
	$BY = $CourseData['A'][$i+1]['Value'];  
     imageline($Img,$AX,$AY,$BX,$BY,$Color);  
}

Jetzt gibt es das folgende Problem: Wenn ich die Schleife benutze, wie ich sie hier gepostet habe, funktioniert es nicht und es gibt mir einfach nur das normale "Bild nicht gefunden" Bild aus. Keine Fehlermeldung kein garnichts - trotz error_reporting(E_ALL) etc.

Wenn ich aber statt dem $i+1 bei $BY = ... einfach ein $i nehme, also das +1 falscherweise weglasse, funktioniert es. Das hat mich stark gewundert, ich hab dann mal das ganze in eine Variable $test ausgelagert, wo ich dann innerhalb der Schleife einfach $test = $i+1; "errechnet" habe und es ging auch nicht.

Wieso ist das so? Darf man innerhalb eines PHP GD Codes nicht normale Rechenoperationen durchführen? Ich hab am Anfang natürlich mit header() auf image/png gestellt etc. - aber eigentlich dürfte das nicht der Grund dafür sein.

Was mache ich falsch?

  1. Kurzer Nachtrag (kann meinen ersten nicht editieren):

    1. Das mit dem Rechnen innerhalb eines PHP GD Abschnittes sollte kein Problem sein, auf http://www.schattenbaum.net/php/kerze_mit_gd-lib_schmelzend.php funktioniert es ja auch...
    2. Beim Kopieren des Codes ist ein Fehler aufgetreten, habe was falsches mitkopiert. So sieht es richtig aus:

    for($i=0;$i<count($Data['A']);$i++) {  
            if($i==0) {  
                    // We're at the start of the diagramm, so we obviously start at the beginning of it with drawing  
                    $AX = 0;  
            }  
            else {  
                    $AX = $i * $DayStep;  
            }  
            $BX = $AX + $DayStep;  
            $AY = $Data['A'][$i]['Value'];  
            $BY = $Data['A'][$i+1]['Value'];  
         imageline($Img,$AX,$AY,$BX,$BY,$Color);  
    }
    
  2. Hi,

    Wieso ist das so? Darf man innerhalb eines PHP GD Codes nicht normale Rechenoperationen durchführen?

    Es gibt keinen „PHP GD Code“.

    Du kannst *alles* in deinem Code machen.

    Ich hab am Anfang natürlich mit header() auf image/png gestellt etc. - aber eigentlich dürfte das nicht der Grund dafür sein.

    Was mache ich falsch?

    Du debuggst nicht vernünftig. Header wieder auskommentieren und Bild direkt im Browser aufrufen (also nicht per <img> eingebunden), und schauen welche Fehlermeldungen ausgegeben werden.

    MfG ChrisB

    --
    RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
    1. Du debuggst nicht vernünftig. Header wieder auskommentieren und Bild direkt im Browser aufrufen (also nicht per <img> eingebunden), und schauen welche Fehlermeldungen ausgegeben werden.

      Ah interessant. Ich wusste garnicht, dass er mir keine vorhandenen Fehlermeldungen mehr ausgibt, sobald ich auf image/png gestellt habe. Das erklärt natürlich einiges. Hier war es einfach ein nicht vorhandener Offset... Danke!

      1. Hallo,

        Ah interessant. Ich wusste garnicht, dass er mir keine vorhandenen Fehlermeldungen mehr ausgibt, sobald ich auf image/png gestellt habe.

        das ist aber logisch - wie sollen Fehlermeldungen angezeigt werden, wenn du den Browser anweist, alles was da kommt als Bilddaten zu interpretieren? Dann stellt er höchstens fest, dass die ersten paar Bytes keinen gültigen PNG-Header ergeben und verweigert folgerichtig die Anzeige des "defekten" Bildes.
        Die PHP-Fehlermeldung steckt dann in den vom Browser verworfenen Daten.

        Dasselbe Ergebnis würdest du bekommen, wenn du versuchst, eine andere x-beliebige Datei als Bild einzubinden, etwa ein zip-Archiv.

        Hier war es einfach ein nicht vorhandener Offset... Danke!

        Das ist ein typischer Fehler, der oft auftritt, wenn man Indexwerte berechnet. Gerade Ausdrücke wie +1 oder -1 in Indexen[*] sind Merkmale, wo man höllisch aufpassen und die Grenzwerte bedenken muss.

        So long,
         Martin

        [*] Ja, ich weiß, der korrekte Plural ist Indices. Na und? ;-)

        --
        Lieber blau machen, als sich schwarz ärgern.
        Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
        1. Om nah hoo pez nyeetz, Der Martin!

          [*] Ja, ich weiß, der korrekte Plural ist Indices. Na und? ;-)

          Nach alter Rechtschreibung Indizes. Aber Sprache wandelt sich.

          Matthias

          --
          Der Unterschied zwischen Java und JavaScript ist größer als der zwischen Waffe und Waffeleisen.

          1. Hallo,

            [*] Ja, ich weiß, der korrekte Plural ist Indices. Na und? ;-)
            Nach alter Rechtschreibung Indizes.

            huch, die Variante mit 'z' kannte ich noch gar nicht. Das sieht irgendwie kaputt aus.

            Mir hat man auch vor der Rechtschreibdeform schon beigebracht, der Plural von Index sei Indices wegen der lateinischen Wortherkunft, und ich habe festgestellt, dass abweichend davon im technischen Bereich auch gern die Pluralform Indexe verwendet wird.
            All das sowohl nach alter als auch nach neuer Rechtschreibung.

            Aber Sprache wandelt sich.

            Das ist unbestritten. Ich staune dennoch, dass "Indexe" mittlerweile auch schon als richtig akzeptiert wird.

            Ciao,
             Martin

            --
            Er:  Mit wem warst du gestern abend aus?
            Sie: Du bist mal wieder eifersüchtig wie immer!
            Er:  Wer ist Immer?
            Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
  3. hi,

    Wieso ist das so? Darf man innerhalb eines PHP GD Codes nicht normale Rechenoperationen durchführen? Ich hab am Anfang natürlich mit header() auf image/png gestellt etc. - aber eigentlich dürfte das nicht der Grund dafür sein.

    Optimiere Deine Entwicklungsarbeit, nutze das Exceptionmodell. Im try-Block darf ein header image/gif und die Binary ausgegeben werden, wenn jedoch was schiefgeht (das kann beim Entwicklen...) dann werfe eine Exception, wobei dann im catch-Block immer ein header text/plain oder text/html ausgegeben wird, so dass Du im Browser gleich sehen kannst, was da passiert.

    Horst H.

    1. Tach!

      Optimiere Deine Entwicklungsarbeit, nutze das Exceptionmodell.

      Das Problem ist jetzt nur noch, die PHP-Fehlermeldungen in Exceptions umzuwandeln. Das mag für einige Meldungstypen mit einem eigenen Error-Handler ja vielleicht noch gehen, aber wenn es fatale Fehler gibt, dann fängt der die nicht und man muss doch wieder händisch auf text/plain, um die Meldung sehen zu können. (Quelltextansicht im Browser hilft auch, um die Meldungen trotz image/... zu sehen.)

      dedlfix.

      1. Tach!

        Optimiere Deine Entwicklungsarbeit, nutze das Exceptionmodell.

        Das Problem ist jetzt nur noch, die PHP-Fehlermeldungen in Exceptions umzuwandeln. Das mag für einige Meldungstypen mit einem eigenen Error-Handler ja vielleicht noch gehen, aber wenn es fatale Fehler gibt, dann fängt der die nicht und man muss doch wieder händisch auf text/plain, um die Meldung sehen zu können. (Quelltextansicht im Browser hilft auch, um die Meldungen trotz image/... zu sehen.)

        Schreib doch mal darüber, wie Du sowas löst.

        Hotti

        1. Tach!

          Schreib doch mal darüber, wie Du sowas löst.

          Ganz simpel ohne Content-Type-Header solange das Script noch in Entwicklung ist, und bei weiterer Fehlersuche den header()-Aufruf auskommentieren oder Quelltextansicht des Browsers verwenden. Im Produktivsystem nützt einem ein Fehlerabfangen mit Content-Type-Tausch nicht mehr viel. Eine mit img eingebunde Fehlermeldung (oder Bildresource mit Fehlermeldungstext drin) wird vom Browser auch nicht angezeigt. Fehler in eine Datei zu loggen (mit dem in PHP eingebauten Mechanismus) ist da noch am hilfreichsten.

          dedlfix.

    2. Hi,

      Optimiere Deine Entwicklungsarbeit, nutze das Exceptionmodell. Im try-Block darf ein header image/gif und die Binary ausgegeben werden, wenn jedoch was schiefgeht (das kann beim Entwicklen...) dann werfe eine Exception, wobei dann im catch-Block immer ein header text/plain oder text/html ausgegeben wird, so dass Du im Browser gleich sehen kannst, was da passiert.

      Oder spare dir solchen Nonsense, und schau dir einfach im Netzwerk-Tab der Entwicklertools deines Browsers an, welche Daten er als Antwort auf einen Request erhalten hat …

      MfG ChrisB

      --
      RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?