Seltsamer Fehler bei 2 Skripten

  • Hallo,

    ich habe hier eine Seite:

    http://www.raetselstunde.de/quizfrage-des-tages.html

    auf der ich 2 Skripte zum Einbinden anbiete. Jedes Skript für sich allein funktioniert einwandfrei. Nur wenn ich die beiden zusammen auf einer Seite einbinde, kommt es zu folgendem Fehler:

    Beim allerersten Aufruf, d. h. wenn die Seite zum ersten Mal geladen wird und ich auf eine Antwort klicke, fehlt im erscheinenden Alert die Lösung und es fehlen die Antworten. Wenn ich einen Reload der Seite mache funktioniert es so wie es soll. Da es ein bisschen schwierig zu erklären ist, hier mal ein Screenshot:

    [Blockierte Grafik: http://wishuload.de/images/thumbs/1222412112-87643quizfrage.jpg]

    Und hier sind die Codes:

    Quizfrage des Tages:

    Zufalls-Quizfrage:

    Hat jemand eine Idee, wo der Fehler liegen könnte?

  • Ich bin jetzt einen Schritt weiter gekommen.

    Ich habe herausgefunden, dass es was mit session_start() zu tun hat. Ursprünglich hatte ich session_start() in beiden php-Dateien drin. Dann kam allerdings eine Warnung, dass vorher schon eine Ausgabe erfolgt. Deshalb habe ich session_start() in den Dateien quizfrage.html und quizfrage-zufall.html ganz an den Anfang, noch vor den Doctype, gesetzt. Deshalb hat der Befehl auch im php-Code gefehlt. Die beiden html-Dateien haben jeweils ein include drin für die jeweilige php-Datei.

    Jetzt habe ich in die php.ini mal session.auto-start = 1 eingetragen und in den html-Dateien das session_start() rausgenommen.

    Die gute Nachricht ist, es funktioniert jetzt einwandfrei auf meiner Seite. Die schlechte Nachricht ist, die beiden Skripte stehen noch auf einer anderen Domain auf einer Seite. Dort tritt weiterhin der gleiche Fehler auf. Wer die andere Domain haben will --> PN.

    Hat noch jemand eine Idee, was ich tun könnte, damit es überall funktioniert?

  • Keine HTML-Dateien nehmen und überall session_start einbauen. Es bringt doch nichts, wenn du an einem Server an der php.ini rumfummelst (was ich schon nicht verstehe) und bei einem anderen Server das nicht machen kannst,

  • Keine HTML-Dateien nehmen und überall session_start einbauen. Es bringt doch nichts, wenn du an einem Server an der php.ini rumfummelst (was ich schon nicht verstehe) und bei einem anderen Server das nicht machen kannst,

    Es hat Warnungen gegeben, als ich es direkt in die php-Datei eingebaut hatte.

    Ich habe es jetzt aber nochmal reingesetzt. Seltsamerweise kommen jetzt keine Warnungen mehr, aber auf der anderen Domain geht es immer noch nicht. Auf meiner dagegen schon.

  • Also mit dem session_start() kann ich dir zwei Möglichkeiten geben (sind auch kombinierbar ;)):
    1. Erstelle eine Datei session_start.php, da schreibst du einfach hinein:

    PHP
    <?
    session_start();
    ?>


    In allen Dateien, die auf die Session angewiesen sind, schreibst du dann oben:

    PHP
    include_once "session_start.php";


    Dann ist garantiert, dass das überall da ist und nicht doppeltaufgerufen wird.
    2. Du änderst etwas in der .htaccess:

    Code
    php_flag output_buffering on


    Dann kannst du, auch wenn es schon Ausgaben gab, header versenden und Cookies setzen (also auch sessions starten ;))

    Viele liebe Grüße
    The User

  • Zu 1. Warum soll ich dann nicht direkt session_start in die Datei reinschreiben?
    zu 2. Die denkbar schlechteste Lösung.

  • 1. Du packst das in jede Datei an den Anfang, die das braucht, also funzt dann auch jede Datei alleine, wenn die Datei jedoch includet wird, und schonmal das include_once gemacht worden ist, meckert der nicht über Ausgaben. ;)
    Oder weil man an die Session vielleicht auch einmal andere Vorgänge anknüpfen möchte, bei mir ist das so. ;)
    2. Aber praktisch, wenn man jeder Zeit header() aufrufen kann, ein cookie setzen kann... vorallem auch zum debuggen, gibst was kleines aus, oder es kommt ne fehlermeldung, und schon funktioniert der header nicht, das ist doch doof. ;)

  • Zu 1. Naja, ob das wirklich Sinn macht, aber egal
    Zu 2. Man kann immer einen header senden oder einen Keks setzen, wenn man ordentlich programmiert. Das Output-Buffering einzuschalten ist definitiv die schlechtere Lösung und maximal für unfähige Programmierer zu empfehlen.

  • Was ist denn schlimm dadran?


    Weil das komplett unnötig ist. Das Output-Buffering ist auch nicht dafür gedacht, fehlerhafte Programmierung auszubügeln.

    In den html-Dateien steht es nicht mehr drin.


    Wieso überhaupt HTML-Dateien?

    Zusätzlich habe ich in der php.ini session.auto-start = 1 stehen


    Warum? Das ist unnötig, wenn session_start überall drinsteht.

    auf der anderen Domain nicht.


    Was bedeutet funktioniert nicht? Wie sieht das Script aus? Stehen diese Zeilen am Anfang:

    PHP
    error_reporting(E_ALL);
      ini_set("display_errors", true);



    Richtig debuggen
    1. Man bemerkt, dass ein Skript nicht das tut, was es soll.
    2. Man schreibt an den Anfang des Scriptes die Zeile: error_reporting(E_ALL); und ini_set("display_errors", true);
    3. Man versucht, die Stelle die daran Schuld sein kann, schonmal einzugrenzen. Falls dies nicht geht, wird zunächst das komplette Skript als fehlerhaft angesehen.
    4. An markanten Stellen im Skript lässt man sich wichtige Variableninhalte ausgeben und ggf. auch in bedingten Anweisungen eine kurze Ausgabe machen, um zu überprüfen, welche Bedingung ausgeführt wurde (oder auch nicht).
    5. Schritt 3 wird so lange wiederholt, bis Unstimmigkeiten im Skript auffallen
    6. Damit hat man das Problem (Unstimmigkeit) gefunden und kann versuchen diese zu beheben. Hierzu dienen dann die PHP-Dokumentation und andere Quellen als Ratgeber.
    7. Lässt sich das konkrete Problem trotzdem nicht beheben, kann man in Foren um Rat fragen.
    8. Das Programm läuft und man kann die Debug-Ausgaben wieder entfernen.


  • Wieso überhaupt HTML-Dateien?

    Warum? Das ist unnötig, wenn session_start überall drinsteht.

    Was bedeutet funktioniert nicht? Wie sieht das Script aus?

    Bitte lies dir den Thread mal von Anfang an durch. Dann wirst du auch die Antworten auf deine Fragen finden :)

    Zitat

    Stehen diese Zeilen am Anfang:

    PHP
    error_reporting(E_ALL);
      ini_set("display_errors", true);

    Noch nicht, ich probier's mal aus.

  • Zitat

    Stehen diese Zeilen am Anfang:

    PHP
    error_reporting(E_ALL);
      ini_set("display_errors", true);

    Ich habe die Zeilen eingebaut. Es kommt aber keine Fehlermeldung.

    Ich habe jetzt mal eine Testseite auf einem anderen Server erstellt. Es tritt der Fehler auf, das, wenn man auf Prüfen drückt, beim erstenmal die Lösung fehlt oder/und dass danach die 4 Antworten fehlen. Hier ist der Link:

    http://cujo.bplaced.net/quizfrage-des-tages.html

    Könnt ihr es euch bitte nochmal angucken? Es wäre mir sehr wichtig, dass ich den Fehler finde.

  • Ich habe in einem anderen Forum den Tipp bekommen, nicht SESSION zu verwenden, sondern versteckte Felder.


    Das ist zu umständlich. Aber da du ja anscheinend "Richtig debuggen" nicht umgesetzt hast, stehst du ja wohl auf umständlichere Sachen. ;)

  • Das ist zu umständlich. Aber da du ja anscheinend "Richtig debuggen" nicht umgesetzt hast, stehst du ja wohl auf umständlichere Sachen. ;)

    Das Problem war ja, dass jedes Skript für sich allein einwandfrei funktioniert hat. Und die Ausgabe der Variablen mit Echo habe ich xmal gemacht. Es hat allerdings nicht viel gebracht, da ich zwar gesehen habe, wo der Fehler entstanden ist, aber nicht warum.

    Und wenn du eine Lösung hast, die weniger umständlich ist, kannst du sie gerne posten. Gerade bei diesen beiden Skripten bin ich für jede Optimierung froh. Wenn sie nämlich von vielen Webmastern eingesetzt werden, was ich mir natürlich erhoffe, belasten sie ganz schön den Server. Ich hatte nämlich auch schon Probleme mit fehlendem Script-RAM deswegen.