Bei "reload" gleicher Eintrag

nordi

Erfahrenes Mitglied
Hi, ich hab ne kurze Frage bzgl. meiner Shoutbox - also es klappt alles wunderbar - aber ich hab da einen "kleinen" Fehler gefunden, den man noch beheben könnte - dann wär's perfekt ;)

Also, wenn Leute in meine Shoutbox was reinschreiben und auf den "Abschicken-Button" klicken, wird der Eintrag in die Datenbank abgespeichert. Teilweise bleiben die Leute auf der Seite (lassen Browser offen) gucken dann ne halbe Stunde später, ob was neues gepostet worden ist und aktualisieren dann die Seite - dann wird der Eintrag erneut in die Datenbank eingetragen.

Der ganze Kram läuft über " method="POST" " - kann man das irgendwie ändern? Wenn nicht, ist jetzt auch kein Problem!

Grüße aus Köln

Marius
 
Generiere einfach auf der Formularseite einen eindeutigen Schlüssel, der einmal in der Sitzung und im Formular übergeben wird. Bei der Verarbeitung der Shoutbox-Nachricht prüfst du einfach, ob beide Schlüssel übereinstimmen. Wenn der Eintrag erfolgreich war, muss der Schlüssel in der Sitzung natürlich gelöscht werden.
 
Was ist denn ein "Schlüssel" und wie generiert man diesen?

PHP:
<?

function format_title($post) {
    $post= addslashes($post);
    $post= stripslashes($post);
    $post= htmlspecialchars($post);

    return $post;
	
	 function foobar( $url )
    {
        return '[ url]' . str_replace('http://http://', 'http://', 'http://'.$url) . '[ /url]';
    }

    $urlPatterns = array(
        // @link   <url:http://www.foad.org/~abigail/Perl/url2.html>
        'http'   => "(?:(?:https?://)?(?:(?:(?:(?:(?:[a-zA-Z\d](?:(?:[a-zA-Z\d]|-)*[a-zA-Z\d])?)\.)*(?:[a-zA-Z](?:(?:[a-zA-Z\d]|-)*[a-zA-Z\d])?))|(?:(?:\d+)(?:\.(?:\d+)){3}))(?::(?:\d+))?)(?:/(?:(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(?:%[a-fA-F\d]{2}))|[;:@&=])*)(?:/(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(?:%[a-fA-F\d]{2}))|[;:@&=])*))*)(?:\?(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(?:%[a-fA-F\d]{2}))|[;:@&=])*))?)?)",
        'ftp'    => "(?:[ url]ftp://(?:(?:(?:(?:(?:[ /url][a-zA-Z\d$\-_.+!*'(),]|(?:%[a-fA-F\d]{2}))|[;?&=])*)(?::(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(?:%[a-fA-F\d]{2}))|[;?&=])*))?@)?(?:(?:(?:(?:(?:[a-zA-Z\d](?:(?:[a-zA-Z\d]|-)*[a-zA-Z\d])?)\.)*(?:[a-zA-Z](?:(?:[a-zA-Z\d]|-)*[a-zA-Z\d])?))|(?:(?:\d+)(?:\.(?:\d+)){3}))(?::(?:\d+))?))(?:/(?:(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(?:%[a-fA-F\d]{2}))|[?:@&=])*)(?:/(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(?:%[a-fA-F\d]{2}))|[?:@&=])*))*)(?:;type=[AIDaid])?)?)",
        'mailto' => "(?:mailto:(?:[a-zA-Z\d$\-_.+!*'(),;/?:@&=]|(?:%[a-fA-F\d]{2}))+)"
    );
    $pattern = '<(' . $urlPatterns['http'] . '|' . $urlPatterns['ftp'] . '|' . $urlPatterns['mailto'] . ')>';


    $string = preg_replace($pattern, 'foobar("\1")', $string);
    $string = preg_replace('<\[url\](.+?)\[/url\]>iUms', '<a href="\1">\1</a>', $string); 
}

$ip ="$REMOTE_ADDR"; 
$link = mysql_connect($dbhost, $dbuser, $dbpass);
mysql_select_db($dbtable, $link);

if($txtMessage!="" && $txtNickname!=""){
	$txtMessage=format_message($txtMessage);
	$txtNickname=format_title($txtNickname);
	mysql_query("INSERT INTO $shoutbox (time, nick, txt,ip) VALUES('".time()."', '$txtNickname', '$txtMessage','$ip')");
}

$ausgabe = mysql_query("SELECT * FROM $shoutbox ORDER BY time DESC LIMIT 6");
?>

Das ist quasi die Quellcode von der Shoutbox - hab den oben etwas gekürzt..
 
Ein Schlüssel ist einfach ein beliebiger zufälliger Wert wie ihn etwa der Hash-Wert eines rand()-Rückgabewerts.
 
wie wärs bei erfolgreichem DB Eintrag die Seite mittels Header zu laden. Somit sind bei F5 die Formulardaten nicht mehr da und es wird kein neuer Eintrag hinzugefügt wenn der User später aktualisiert.

Quasi
PHP:
if(mysql_query("INSERT INTO $shoutbox (time, nick, txt,ip) VALUES('".time()."', '$txtNickname', '$txtMessage','$ip')")){
 header("Location: http://www.example.com/"); 
}
 
Zuletzt bearbeitet:
Zurück