Ankündigung

Einklappen
Keine Ankündigung bisher.

Session-Problem?, Daten über HTTP-Request verschickt landen im Nirvana

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Session-Problem?, Daten über HTTP-Request verschickt landen im Nirvana

    Hallo,

    habe so eine Art Notizen-, Terminverwaltung webbasiert mit HTML5+PHP 7.2, Datenhaltung in MySQL-DB fürs Handy. Die Einzelaktionen wie

    - einen neuen Eintrag erstellen

    - bestehenden Eintrag ändern

    - bestehenden Eintrag löschen

    werden per AJAX-Request übertragen.

    Ein Login ist involviert, danach wird auf https umgeleitet.

    Ich lasse die Seite eigentlich immer auf, so dass clientseitig die Session bestehen bleibt

    Das klappt soweit auch. Allerdings passiert mir hin und wieder, dass, wenn ich bspw. nach 2 Tagen Nichtbenutzung den Browser öffne (die Seite wird dann angezeigt) und einen neuen Eintrag generiere, dieser in der DB nicht angelegt wurde, obwohl ein ajax.readyState == 4 && aj.status == 200 zurück kam und damit verbundene Aktionen wie das Overlay ausblenden ausgeführt wurden:
    Code:
    ajax.readyState == 4 && aj.status == 200 zurück kam und damit verbundene Aktionen ausgeführt wurden.
    var aj = new XMLHttpRequest();
    aj.onreadystatechange = function () {
      if (aj.readyState == 4 && aj.status == 200) {
         ...
         document.getElementById("overlay").style.display = "none";
      }
    };
    aj.open("GET", "ajax.php?...", true);
    aj.send();

    die Ajax.php sieht so aus:
    PHP-Code:
    <?php
    include('auth.php');
    ...
    mysql_query($sql);
    echo 
    'true';
    ?>
    darin die auth.php:
    PHP-Code:
    <?php
    session_start
    ();
    if (!isset(
    $_SESSION['angemeldet'])) {header('Location: https://...'); exit;}
    ?>

    Ziel ist, dass, wenn ich nach einer längeren Zeit im Browser eine Aktion vornehme, in AJAX.php geprüft wird, ob die Anmeldung noch besteht und im Falle der Nicht-Anmeldung auf das Login-Formular weitergeleitet wird. Genau das habe ich aus dem AJAX-Script heraus noch nie erlebt, ergo irgendwas ist da nicht richtig.

    Ich hoffe, Ihr könnt mir auf die Sprünge helfen.

    PS: Nicht wundern über mysql_query($sql);, zwischenzeitlich musste ich umstellen auf 7.2

    Gruß

  • #2
    dieser in der DB nicht angelegt wurde,
    Da musst du ansetzen.

    PS: Nicht wundern über mysql_query($sql);, zwischenzeitlich musste ich umstellen auf 7.2
    Wir wundern uns hier über gar nichts, nicht mal dass es die Funktion mysql_query gar nicht mehr gibt.
    Diesen Hinweis ernst nehmen, siehe rosa Kasten unter http://php.net/manual/en/function.mysql-query.php

    Die Fehlersuche, also debugging unbedingt durchlesen.

    Was ein http Statuscode ist solltest du dir noch mal ansehen.
    200 - Die Anfrage wurde erfolgreich bearbeitet und das Ergebnis der Anfrage wird in der Antwort übertragen.
    Die Anwert kann auch eine Fehlermeldung beinhalten.



    Kommentar


    • #3
      Moin,
      doch, die gibt es noch , wenn der Provider ältere Versionen weiter unterstützt .
      PS sollte mit einem Augenzwinkern verstanden werden. Ich denke , dass war klar zu verstehen, dass diese Funktion mittlerweile durch mich eliminiert wurde. Diesbezüglich mich an ein forum zu wenden, stand bereits vor der versionsumstellung vor 3 Wochen auf der Agenda. Und so habe ich den Code einfach übernommen und mich damit unkorrekt ausgedrückt. Dafür möchte ich mich entschuldigen.

      liest man Dokumentationen zu ajax , dann ist dort immer die von mir genutzte Kombination der Status Codi erwähnt . Warum sollte ich dann davon ausgehen , dass diese nicht richtig ist?

      Fehler Meldungen sind zumindest zum Browser nicht übermittelt wurden. Ob der Server und die Datenbank noch Protokoll führen, weiß ich nicht, bin bei 1&1.

      Meine Frage ging dahin , ob ich die die session betreffenden Funktionalitäten richtig angewandt habe und ob auf diesem Wege meine Zielsetzung überhaupt erreicht werden kann.

      Gruß

      Kommentar


      • #4
        Die Fehlersuche, also debugging unbedingt durchlesen
        Das schau ich mir an!

        Kommentar


        • #5
          Schau in die php_error.log von PHP.
          Fehler in Javsscript siehst du in der Konsole vom Browser.

          Kommentar


          • #6
            Hi
            ich suche gerade die php error log. kann nichts finden.
            In der php.ini steht log_errors=deaktiviert

            wenn dort die Fehler ,die auch im Browser angezeigt werden, protokolliert sind, dann kann ich sagen, diesbezüglich keine Fehler.

            Javascript ebenfalls keine Fehler.

            Gruß

            Kommentar


            • #7
              Schreib mal in deine ajax.php ganz an den Anfang
              PHP-Code:
                error_reporting(-1); ini_set('display_errors'1); 
              Des weiteren prüfe deine Schreibweise
              HTML-Code:
                aj.open("GET", "ajax.php?...", true);
              .
              ist die ajax.php klein geschrieben?
              Weil
              die Ajax.php sieht so aus:
              Das sorgt nicht gerade für Klarheit.

              Das mit der Session ist noch mal eine ganz andere Baustelle.

              Erst mal solltest du die Datenbank API umstellen auf Mysqli mit i am Ende oder PDO.


              Kommentar


              • #8
                Hi protestix

                Error report habe ich eingefügt.
                Dann habe ich den ajax-request ausgeführt .nun sehe ich unter logs Protokolle access.log. ....
                In die heutigen geschaut , sehe ich auch Einträge bezüglich des letzten ajax request. Kein Hinweis auf Fehler.

                Der Dateiname ist im Code richtig geschrieben.

                Vor 3 Wochen habe ich auf 7.2 konforme Funktionen wie mysqli umgestellt.

                Gruß

                Kommentar


                • #9
                  Schau Dir die Requests und die Antworten in der Entwicklerkonsole des Browsers an.

                  Kommentar


                  • #10
                    PHP-Code:
                    if (!isset($_SESSION['angemeldet'])) {header('Location: https://...'); exit;} 
                    Setz doch mal selber einen HTTP Code...
                    Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

                    Kommentar


                    • #11
                      Emtwicklerkonsole keine Fehler.

                      Gruß

                      Kommentar


                      • #12
                        Hi , was meinst du mit selbst http Code setzen?

                        Kommentar


                        • #13
                          Na, vor dem Redirect (der vom AJAX call ignoriert wird) einen HTTP-Status Code setzen, den du dann im Javascript prüfen kannst.

                          Oder anders gefragt: Wie stellst du einen Fehler fest im Ajaxhandler?
                          Und wie verfährst du mit Fehlern im PHP Script?
                          Der von mir gequotete PHP Teil macht jedenfalls keine Fehlerbehandlung, die ein Ajaxcall mitbekommen könnte... der Request wird ordnungsgemäß bedient (Code 200), macht aber eine Umleitung (ohne den dafür passenden HTTP Header zu setzen) und beendet sich ohne "body" (nur Header)... Für deinen Ajaxhandler heisst das, erfolgreich, aber keine Daten.

                          Setz einen HTTP Status Code vor dem Redirect, und dann setz einen Breakpoint im Javascript und guck auf den Status code.
                          Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

                          Kommentar


                          • #14
                            Moin,
                            bevor ich das probiere, muss ich mich korrigieren.

                            Ich hatte anfangs geschildert, das Phänomen bestünde sowohl bei Einfüge-, Ändern- und Löschen-Aktionen. Das war so nicht richtig. Es betraf in der Vergangenheit nur Einfüge-Aktionen, was dadurch auffiel, dass ich einen Termin verpasst hatte dadurch, dass er nicht mit aufgeführt wurde, obwohl ich sicher war, diesen angelegt zu haben.

                            Ich habe mir gestern noch mal die SQL-Strings angeschaut, die in den jeweiligen Fällen in der Ajax.php aus den GET-Parametern erstellt werden und der DB übergeben werden. Löschen und Ändern beziehen sich auf die vom Browser übermittelte Datensatz-ID, Einfügen allerdings wird dem aktuellen Nutzer der aktuellen Session zugeordnet und bezieht sich daher auf eine Sessionvariable "Nutzer". Wenn, so meine Vermutung, die Session mittlerweile nicht mehr existiert, dann ist ja auch die Sessionvariable nicht existent (oder leer?) und der Datensatz wird in der DB angelegt mit dem User = Null oder ''. Mir werden aber nur die Termine zu User = 'yxz' angezeigt. Werde ich mal checken, ob tatsächlich Termine mit User = Null existieren.

                            Da ich eingangs der Ajax.php die auth.php include, glaubte ich, die Sessionvariable nicht separat prüfen zu müssen.
                            Ist denn die auth.php logisch richtig?

                            Gruß

                            Kommentar


                            • #15
                              Im Beitrag #2 hats einen Link zum Debugging, den solltest du Dir dringend durchlesen. Ich hab das Gefühl du versuchst einfach irgendwas ohne richtig zu prüfen was es tut und was nicht.

                              In den Dev-Tools Deines Browsers hats einen Reiter Netzwerk (Oder Network), dort siehst du die Requests die du verschickst, so wohl auch ajax.php. Wenn du dann dort ajax.php anklickst siehst du Anfrage und Antwort (Response). Damit kannst du debuggen. Dir Variablen ausgeben lassen und anschauen was du da so programmierst. Nicht nur die Konsole anschauen.

                              Der
                              PHP-Code:
                              header('Location: https://...'
                              ist sinnfrei und wird nicht funktionieren. Wenn Dein User nicht eingeloggt ist musst du das als Antwort von ajax.php zurückgeben, z.b. mit einem Statuscode oder einfach einer Antwort im Body und dann den Redirect cleintseitig ausführen.

                              Kommentar

                              Lädt...
                              X