befehl session_start führt zu bug

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

  • befehl session_start führt zu bug

    hallo leute!

    ich möchte im voraus sagen, dass ich mich nicht zum ersten mal mit php beschäftige, aber bei diesem bug bin ich total ratlos:

    ich codiere gerade ein forum mit php und seit dem ich bei der insert.php, also jener seite, die beiträge in die sql datenbank einträgt (mittels insert into befehl) die session id funktion hinzugefügt habe, gibt es einen sehr seltsamen bug: der beitrag wird doppelt in der sql datenbank gespeichert, was mir totales kopfzerbrechen beschert. schließlich ist in dieser insert.php nur ein einziger insert into befehl (die anderen habe ich zur auffindung des bugs rausgelöscht) und auch keine schleife, was zu einer zweimaligen erfassung des datensatzes führen könnte.

    lösche ich jedoch das session_start(); einfach raus, funktioniert es auf einmal, also der datensatz wird nur einmal erfasst (was erwünscht ist), und nicht zweimal.

    im code schaut das so aus: (all der restliche code, der nicht zu diesem problem beiträgt, habe ich entfernt. ebenfalls habe ich anstatt der flexiblen werte wie zB $_REQUEST['threadid'] im insert into befehl fixe werte wie 99 genommen, um fehlerquellen zu reduzieren)

    Code:
    <?php
        session_start();
    
        include ("verbindung/dbconnect.php");
    
        $sql4 = "INSERT INTO tbl_posts(threadid,userid,posttopic,posttime,message) VALUES(";
        $sql4 = $sql4."'"."99"."',";
        $sql4 = $sql4."'"."99"."',";
        $sql4 = $sql4."'"."irgendein topic"."',";
        $sql4 = $sql4."'"."99"."',";
        $sql4 = $sql4."'"."irgendeine nachricht"."')";
        $result4 = mysql_query($sql4, $link) or die("Fehler4!: ".mysql_error());
    ?>
    
    <html>
    <head>
    <title>project::forum</title>
    <link rel="stylesheet" href="css/main.css" type="text/css">
    </head>
    <body>
    ... wird eingetragen
    </body>
    </html>
    führe ich diesen code aus, kommen zwei (!) neue (gleiche) datensätze in die tbl_post hinzu:

    102, 99, 99, 'irgendein topic', 99, 'irgendeine nachricht'
    103, 99, 99, 'irgendein topic', 99, 'irgendeine nachricht'

    (102 und 103 ist die postid --> autowert)

    es sollte jedoch nur EIN solcher datensatz hinzugefügt werden, nirgendwo steht, dass dies zwei mal geschehen soll. interessant ist auch, dass der zweite (unerwünschte) datensatz nicht sofort hinzugefügt wird, sondern erst nach 5 sekunden oder manchmal sogar mehr, was mir total rätselhaft ist.

    nach einigem ausprobieren bin ich jedoch wie gesagt drauf gekommen, dass wenn ich ganz am anfang einfach das session_start(); rauslösche, die zweifacherfassung des datensatzes nicht passiert, was ich ebenfalls überhaupt nicht verstehe, aber tatsache ist.

    das session_start(); benötige ich übrigens zur speicherung der userid des users, der gerade eingeloggt ist. diese würde dann beim insert into befehl unter userid abgerufen und abgespeichert. die habe ich jedoch beim obrigen code wie gesagt der einfachheit halber durch den fixen wert 99 ersetzt.

    also meine frage: warum führt das session_start(); zu einer zweifachausführung des insert into befehls und wie kann ich das beheben?

    ich bin für jede antwort dankbar!

    mfg

  • #2
    das hängt nicht direkt mit der session zusammen, das problem liegt woanders. wo genau, musst du selbst herausfinden. schaue dir z.b. die http headers an, die mit dem server ausgetauscht werden, mache testausgaben, etc. der code würde (so wie er da steht, vorausgesetzt die include datei beinhaltet _nur_ die mysql_connect()-geschichte) bei mir wie erwartet nur einen eintrag in der db erzeugen.

    Kommentar


    • #3
      vielen dank für deine antwort!

      ich habe mir natürlich alle möglichen testausgaben ausgeben lassen (also den ganzen sql string, das $result ...) und das passt auch alles. er springt auch nicht in der adressleiste irgendwie hin und her. nein im gegenteil, er steht total still. es ist ja auch seeehr interessant, dass der zweite eintrag erst 5-10 sekunden nach dem ersten eingetragen wird.

      irgendwas spiest sich da...

      fakt ist, dass wenn ich einfach das session_start() entferne, es einwandfrei funktioniert. aber ich brauch das session_start eben.

      an was könnt das liegen?
      Zuletzt geändert von alex88; 23.10.2006, 18:42.

      Kommentar


      • #4
        Woher weißt Du, dass der 2., unerwünschte, Eintrag 10 Sekunden später kommt?

        Trage doch mal ein time() in die Spalte "posttopic" ein.

        Was DU noch überprüfen kannst:
        1. lass mal die Zeile mit dem Stylesheet weg.

        2. mach mal ein Echo auf $sql4.
        Wenn das sql 2x ausgeführt wird, sollte es Dir via echo auch 2x angezeigt werden.

        Kommentar


        • #5
          probiers doch mal mit LIMIT 1
          ...
          $sql4 = $sql4."'"."irgendeine nachricht"."') LIMIT 1";

          Kommentar


          • #6
            hallo leute,

            vielen dank, jonas01 und phoenix666 für eure antworten!

            @ jonas01
            dass das ca. 5-10 sekunden später passiert, weis ich eben daher, weil ja normalerweise in meinem code bei posstime eh - genau wie du auch geschrieben hast - der time() befehl steht.

            stylesheet weglassen hat leider auch nichts gebracht. das echo auf den sql string gibt auch immer nur den sql befehl auf den ersten datensatz aus - nie über den zweiten.

            @ phoenix666
            sehr gute idee, habe ich auch sofort probiert, jedoch kam eine sql-syntax fehlermeldung. hab jetzt nachgesehen und ich glaube, der limit befehl fuktioniert nur bei select abfragen.

            bin auf was neues drauf gekommen, was jedoch glaub ich die fehlerquelle nicht unbedingt einschränkt: führe ich die insert aus und mache sie sofort danach zu (also keine 5 sekunden zeit), fügt er nur einen datensatz an.

            was könnte es noch haben, bitte helft mir.

            danke!

            Kommentar


            • #7
              Original geschrieben von penizillin
              schaue dir z.b. die http headers an, die mit dem server ausgetauscht werden
              hast du das mal gemacht? für den ff gibt es da ein plugin "Live HTTP Headers".

              ich vermute auch mal, da laufen zwei requests. auf php.net findet sich in diesem zusammenhang auch "favicon" als evt. ursache.
              oder das hier geht auch in etwa in die richtung: http://cakebakery.de/2006/09/18/favi...ebenwirkungen/

              Kommentar


              • #8
                oder probier doch mal den insert befehl in eine function zu schreiben, die du dann aufrufst. und evtl in der function bevor er den insert befehl ausführt eine überprüfung ob der eintrag schon vorhanden ist wenn nicht dann eintragen!

                oder in der function eine var definieren mit zb. true oder false
                wenn false dann eintragen wenn true dann nix unternehmen.

                Kommentar


                • #9
                  Navigator oder Firefox ?
                  PHP-Code:
                  <?php
                      session_start
                  ();

                      include (
                  "verbindung/dbconnect.php");

                      
                  $sql4 "INSERT INTO tbl_posts(threadid,userid,posttopic,posttime,message) VALUES(";
                      
                  $sql4 $sql4."'"."99"."',";
                      
                  $sql4 $sql4."'"."99"."',";
                      
                  $sql4 $sql4."'"."irgendein topic"."',";
                      
                  $sql4 $sql4."'"."99"."',";
                      
                  $sql4 $sql4."'"."irgendeine nachricht"."')";

                  if(!isset(
                  $_SESSION['GESENDET'])){
                  $result4 mysql_query($sql4$link) or die("Fehler4!: ".mysql_error());
                  $_SESSION['GESENDET']="gesendet";
                  }
                  ?>
                  //$_SESSION['GESENDET'] muss vor dem nechstem insert  wieder gelöscht werden.
                  Zuletzt geändert von Slava; 26.10.2006, 02:50.
                  Slava
                  bituniverse.com

                  Kommentar


                  • #10
                    es gibt interessante news: führe ich die selbe site mit firefox aus, kommt es nicht zu dem doppeleintrag!!! (mit internet explorer kommt es zum doppeleintrag). woran liegt das? warum führt der eine browser den selben code anders aus als der andere?

                    mein interesse liegt natürlich darin, dass der code auch mit internet explorer funktioniert.

                    @ 3dmax
                    guter tipp, aber ich habe kein favicon eingebunden.

                    habe jetzt die http headers mit dem tool wireshark aufgenommen (bei verwendung von internet explorer). hier kommt eindeutig zur sicht, dass die site zwei mal aufgerufen wird. warum, weiß ich jedoch noch nicht.

                    hier die protokolldatei von wireshark: http://www.ljneuhofen.com/alex88/son...2_capture.pcap

                    hier nochmal der code von insert_debug2.php, jener site, die ausgeführt wurde.

                    PHP-Code:
                    <?php
                        session_start
                    (); 

                        include (
                    "verbindung/dbconnect.php");
                                
                            
                    $sql4 "INSERT INTO tbl_posts(threadid,userid,posttopic,posttime,message) VALUES(";
                            
                    $sql4 $sql4."'"."99"."',";
                            
                    $sql4 $sql4."'"."99"."',";
                            
                    $sql4 $sql4."'"."irgendein thema"."',";
                            
                    $sql4 $sql4."'".time()."',";
                            
                    $sql4 $sql4."'"."irgendeine nachricht"."')";
                            
                    $result1 mysql_query($sql4$link) or die("Fehler!4: ".mysql_error());

                    ?>

                    <html>
                    <head>

                    <title>project::forum</title>
                    </head>
                    <body>
                    <br>

                    ... wird eingetragen<br>

                    <?php echo($sql4)?>">


                    </body>
                    </html>
                    ich hoffe, jemand von euch kann die protokolldatei näher interpretieren.

                    vielen dank auf jeden fall!

                    mfg
                    Zuletzt geändert von alex88; 27.10.2006, 13:11.

                    Kommentar


                    • #11
                      hab jetzt einfach eine primitive prüfung mittels if reingegeben, ob auf der vorigen seite der button zum absenden geklickt wurde. funzt jetzt prima.

                      danke für den support!

                      Kommentar

                      Lädt...
                      X