PHP bereitet mir immer wieder Kopfschütteln

  • PHP

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von Paul-Jeschke.

    PHP bereitet mir immer wieder Kopfschütteln

    Ich habe mir zwei Klassen geschrieben in PHP. Eine die mit Daten aus einer MYSQL-Datenbank rechnen und speichert seine Ergebnisse in einer Memory-Database in MYSQL wieder ab.
    Die andere Klasse baut aus der Memory Tabelle ein Diagramm.
    Jetzt habe ich mir eine index.php gemacht die zuerst die Daten sammelt und danach führt sie die Grafik-Klasse aus.
    Das funktioniert soweit ganz gut aber jetzt das Problem:

    Wenn ich jetzt in meiner index.php irgendetwas "ausprinte"/"ausecho" (Denglisch ist doch schön) dann zerschießt es mir mein Bild mit der Begründung der Header wurde schon gesendet dies ist ja aber nicht war da ich den Header ja nur für die index.php geschickt habe aber nicht die des Bildes.
    Kann mir irgendjemand helfen.

    PHP-Quellcode

    1. #Bindet die Datei Daten ein.
    2. #In dieser Datei befindet sich meine Datensammlerklasse
    3. include('Daten.php');
    4. #Ruft die Klasse auf
    5. $test = new Daten();
    6. #Stellt eine Verindung mit der Datenbank her
    7. $test->Datenbankverbindung_herstellen();
    8. #Beginnt die Daten zu sammeln und zu berechnen
    9. $test->Datenbank_abfrage(10);
    10. #Bindet die Datei mit der Grafik-Klasse ein
    11. include('Grafik.php');
    12. #Ruft die Grafik-Klasse auf
    13. $test = new Grafik();
    14. #Zerschießt meinen Header
    15. print "Hello World";
    16. #zeichent das Bild
    17. print "<img src=".$test->datenholen()." />";


    Für Hilfe wäre ich sehr Dankbar :thumbsup:



    PS: Leider kann ich nicht viel Quellcode veröffentlichen da es Betriebsintern ist.

    Ahoi,

    ​Beachten Sie, dass Sie die Funktion header() aufrufen müssen, bevor Sie irgendeine andere Art von Ausgabe (seien es normale HTML-Tags, Leerzeilen in einer Datei oder von PHP) zum Client schicken.

    Quelle

    Paul-Jeschke schrieb:

    #Zerschießt meinen Header
    print "Hello World";


    findest du den Zusammenhang ?
    Grüße Manu

    Was Gott dem Menschen erspart hat, kann der Computer.
    Billy ©, (*1932), Schweizer Aphoristiker
    Quelle: www.Aphorismen.de
    Hi,

    wie sieht denn deine Methode datenholen() aus?

    Überhaupt, wieso includest du oben Grafik.php und wofür ist dann datenholen() noch da? Macht doch irgendwie keinen Sinn.

    Btw:

    PHP-Quellcode

    1. ImageString($img, $font_size, $image_center_x, $image_center_y, $text, $font_color);
    2. ImagePNG($img);
    3. ImageDestroy($img);

    so schaut's doch bei dir auch aus in etwa oder?

    Link :thumbup:
    Hello World
    Das Problem ist ja in der Klasse Grafik hab ich ja ni einen Header geschickt :O

    Mein datenholen() hat in wirklichkeit viele optionale parameter. (Die ich leider nicht hier schreiben kann)
    Sie stellt dann anhand der Parameter eine Datenbankverbindung her und ruft die berechneten Werte der Datenklasse ab.
    Dann Zeichnet sie ein paar Linien und Säulen und polygone und gibt dann ein das Bild aus.

    Und ja Link275 so sieht es bei mir aus ungefähr ;)
    Die Fehlermeldung sagt doch alles; du versuchst einen HTTP-Header nach einer Ausgabe zu senden.
    Wenn du nicht direkt die header Funktion verwendest, rufst du evtl. eine Funktion auf, die das intern macht. Die üblichen Verdächtigen sind hier Sessions (z.B. session_start) und Cookies (setcookie).

    Was ist eigentlich genau falsch? Du schreibst, dass dein Bild zerschossen ist. Und das heißt konkret was? Ist es trotzdem zu sehen?
    Ich frage deshalb, weil deine Ausgabe etwas "seltsam" ist...
    Bei HTML wird beim Image-Tag für das Source-Attribute eine URL erwartet. Logischerweise gibt $test->datenholen() dann entweder den Pfad zum Bild an, d.h. du speicherst es vorher auf dem Server, oder die Methode gibt eine Data-Url aus.
    Kann es sein, dass du einfach imagepng (o.ä.) ohne $filename-Parameter aufrufst, so dass das Bild direkt zum Client gesendet wird?

    PS: Auch wenn print "<img src=".$test->datenholen()." />"; je nach Verhalten der aufgerufenen Methode unter Umständen gültiges HTML produziert, ist es doch etwas... argh...

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „3daycliff“ () aus folgendem Grund: Typo

    Ich habe das Problem jetzt etwas spartanich gelöst ich werde es jetzt versuchen an einen Beispiel zu erläutern.

    Also mein erster Fall sa in etwa so aus:


    Meine index.php

    PHP-Quellcode

    1. include('Grafik.php');
    2. #Ruft die Grafik-Klasse auf
    3. $test = new Grafik();
    4. #Zerschießt meinen Header
    5. print "Hello World";
    6. #zeichent das Bild
    7. print "<img src=".$test->datenholen()." />";


    Und nun zu der Grafik-Klasse (natürlich sehr vereinfacht):

    PHP-Quellcode

    1. function datenholen()
    2. {
    3. $Bild = imagecreate(500,500);
    4. $schwarz = imagecolorallocate($Bild, 0, 0, 0);
    5. imagefill($Bild, 0, 0, $schwarz);
    6. header('Content-type: image/png');
    7. imagepng($this->Bild);
    8. imagedestroy($this->Bild);
    9. }


    Das Problem ist nun folgendes gewesen (und ich hasse mich schun wieder für meine Dummheit):
    Die Grafik-Klasse hat natürlich keinen eigenen Header weswegen sie versucht den Header der index.php zu verändern da sie ja von da aufgerufen wurde. Da index.php aber schon einen Header mithilfe des print´s geschickt hat konnte die Grafik-Klasse diese nicht mehr manipulieren.

    Also hab ich mich daran gemacht dieses Problem zu lösen.

    Und die Lösung sieht wie folgt aus(etwas umfangreicher da ich ja die Vorteile von Klassen und von Parametern nutzen möchte):

    index.php:

    PHP-Quellcode

    1. session_start();
    2. $Grafik = array("bereich" => "grün", "subbereich" => "blau");
    3. $Grafik2 = implode("~", $Grafik);
    4. $_SESSION["Grafik"] = $Grafik2;
    5. <img src= Grafik.php />


    Grafik.php

    PHP-Quellcode

    1. $Grafik = new Grafik();
    2. if(!isset($_SESSION["Grafik"]))
    3. {
    4. $Grafik->datenholen();
    5. }
    6. else
    7. {
    8. $parameter = explode("~", $_SESSION["Grafik"]);
    9. call_user_func_array(array($Grafik, 'datenholen'), $parameter);
    10. }
    11. class Grafik
    12. {
    13. function datenholen($bereich = "lila", $subbereich = "gelb")
    14. {
    15. $Bild = imagecreate(500,500);
    16. $lila = imagecolorallocate($Bild, 150, 0, 255);
    17. $gelb = imagecolorallocate($Bild, 0, 255, 255);
    18. $grün = imagecolorallocate($Bild, 0, 0, 255);
    19. $blau = imagecolorallocate($Bild, 0, 0, 255);
    20. if($bereich == "lila")
    21. {
    22. imagefill($Bild, 0, 0, $lila);
    23. }
    24. elseif($bereich == "grün")
    25. {
    26. imagefill($Bild, 0, 0, $gelb);
    27. }
    28. if($subbereich == "gelb")
    29. {
    30. imagerectangle($Bild, 0, 0, 50, 50, $gelbe);
    31. }
    32. elseif($subbereich =="blau")
    33. {
    34. imagerectangle($Bild, 0, 0, 50, 50, $blau);
    35. }
    36. header('Content-type: image/png');
    37. imagepng($this->Bild);
    38. imagedestroy($this->Bild);
    39. }
    40. }



    Keine frage ein relativ sinnfreies Beispiel aber leider darf ich mein eigentliches Projekt nicht veröffentlichen.
    Deswegen ein wenig verständniss dafür bitte.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Paul-Jeschke“ ()