php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Fragen zu Laravel, YII oder anderen PHP-Frameworks.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 23-10-2006, 17:33
alex88
 Newbie
Links : Onlinestatus : alex88 ist offline
Registriert seit: Oct 2006
Ort: NY
Beiträge: 5
alex88 ist zur Zeit noch ein unbeschriebenes Blatt
alex88 eine Nachricht über ICQ schicken
Standard 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
Mit Zitat antworten
  #2 (permalink)  
Alt 23-10-2006, 18:06
penizillin
 PHP Guru
Links : Onlinestatus : penizillin ist offline
Registriert seit: Feb 2004
Beiträge: 10.166
penizillin ist zur Zeit noch ein unbeschriebenes Blatt
Standard

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.
Mit Zitat antworten
  #3 (permalink)  
Alt 23-10-2006, 19:01
alex88
 Newbie
Links : Onlinestatus : alex88 ist offline
Registriert seit: Oct 2006
Ort: NY
Beiträge: 5
alex88 ist zur Zeit noch ein unbeschriebenes Blatt
alex88 eine Nachricht über ICQ schicken
Standard

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?

Geändert von alex88 (23-10-2006 um 20:42 Uhr)
Mit Zitat antworten
  #4 (permalink)  
Alt 24-10-2006, 14:15
jonas01
 Registrierter Benutzer
Links : Onlinestatus : jonas01 ist offline
Registriert seit: Feb 2005
Beiträge: 114
jonas01 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

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.
Mit Zitat antworten
  #5 (permalink)  
Alt 24-10-2006, 18:05
Phoenix666
 Newbie
Links : Onlinestatus : Phoenix666 ist offline
Registriert seit: Sep 2006
Beiträge: 25
Phoenix666 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

probiers doch mal mit LIMIT 1
...
$sql4 = $sql4."'"."irgendeine nachricht"."') LIMIT 1";
Mit Zitat antworten
  #6 (permalink)  
Alt 25-10-2006, 19:36
alex88
 Newbie
Links : Onlinestatus : alex88 ist offline
Registriert seit: Oct 2006
Ort: NY
Beiträge: 5
alex88 ist zur Zeit noch ein unbeschriebenes Blatt
alex88 eine Nachricht über ICQ schicken
Standard

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!
Mit Zitat antworten
  #7 (permalink)  
Alt 25-10-2006, 21:38
3DMax
 PHP Senior
Links : Onlinestatus : 3DMax ist offline
Registriert seit: Jan 2004
Beiträge: 1.916
3DMax ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
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/
Mit Zitat antworten
  #8 (permalink)  
Alt 26-10-2006, 00:24
Phoenix666
 Newbie
Links : Onlinestatus : Phoenix666 ist offline
Registriert seit: Sep 2006
Beiträge: 25
Phoenix666 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

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.
Mit Zitat antworten
  #9 (permalink)  
Alt 26-10-2006, 04:47
Slava
 PHP Senior
Links : Onlinestatus : Slava ist offline
Registriert seit: Nov 2002
Ort: Köln->Karlsruhe
Beiträge: 1.589
Slava befindet sich auf einem aufstrebenden Ast
Standard

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.
__________________
Slava
bituniverse.com

Geändert von Slava (26-10-2006 um 04:50 Uhr)
Mit Zitat antworten
  #10 (permalink)  
Alt 27-10-2006, 14:59
alex88
 Newbie
Links : Onlinestatus : alex88 ist offline
Registriert seit: Oct 2006
Ort: NY
Beiträge: 5
alex88 ist zur Zeit noch ein unbeschriebenes Blatt
alex88 eine Nachricht über ICQ schicken
Standard

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

Geändert von alex88 (27-10-2006 um 15:11 Uhr)
Mit Zitat antworten
  #11 (permalink)  
Alt 02-11-2006, 16:15
alex88
 Newbie
Links : Onlinestatus : alex88 ist offline
Registriert seit: Oct 2006
Ort: NY
Beiträge: 5
alex88 ist zur Zeit noch ein unbeschriebenes Blatt
alex88 eine Nachricht über ICQ schicken
Standard

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!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

ADSMAN V3 - Werbe-Manager ansehen ADSMAN V3 - Werbe-Manager

ADSMAN V3 - mehr als nur ein Bannermanager! Banner, Textanzeigen und PagePeel Manager! Mit ADSMAN PRO haben Sie die Marketinglösung für eine effektive und effiziente Werbeschaltung mit messbaren Ergebnissen. Unterstützt werden Bannerformate in beliebi

25.10.2018 virtualsystem | Kategorie: PHP/ Bannerverwaltung
PHP News und Artikel Script V2

News schreiben, verwalten, veröffentlichen. Dies ist jetzt mit dem neuen PHP News & Artikel System von virtualsystem.de noch einfacher. Die integrierte Multi-User-Funktion und der WYSIWYG-Editor (MS-Office ähnliche Bedienung) ermöglichen...

25.10.2018 virtualsystem | Kategorie: PHP/ News
Top-Side Guestbook

Gästebuch auf Textbasis (kein MySQL nötig) mit Smilies, Ip Sperre (Zeit selbst einstellbar), Spamschutz, Captcha (Code-Eingabe), BB-Code, Hitcounter, Löschfunktion, Editierfunktion, Kommentarfunktion, Kürzung langer Wörter, Seiten- bzw. Blätterfunktion, V

22.10.2018 webmaster10 | Kategorie: PHP/ Gaestebuch
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 21:34 Uhr.