 | |
16.01.2006, 19:05
| Nach oben
#1 | | Neuer Benutzer
Registriert seit: 14.01.2006 Ort: Datteln
Beiträge: 22
| Mehrfacheintrag durch aktualisieren :)
Hi, ich habe ein Problem mit meinem Gb und dessen Formularverarbeitung.
Der eine oder andere wird sagen , ist doch nicht schlimm, aber mich störts.
Wenn ich nach dem senden auf aktualisieren klicke sendet und speichert er mir den Eintrag wieder und wieder..
Ich habe nach Ben's Tip folgendes versucht. PHP-Code: <?php include 'inc.php';
$notes = array('success'=>array(), 'notice'=>array(), 'error'=>array());
function generateNoteList($type) {
global $notes; $return = '';
switch( $type ) { case 'success': case 'notice': case 'error': break; default: return null; } $return .= '<div><ul class="'.$type.'">'; foreach( $notes[$type] as $value ) { $return .= '<li>'.$value.'</li>'; } $return .= '</ul></div>';
return $return;
}
if( isset($_POST['submit']) ) {
if( !isset($_POST['vname']) || trim($_POST['vname'])=='' ) { $notes['error'][] = 'Bitte geben Sie Ihren Namen an!'; } if( !isset($_POST['email']) || trim($_POST['email'])=='' ) { $notes['error'][] = 'Bitte geben Sie Ihre E-Mail-Adresse an!'; } elseif(($_POST['email']) && !eregi("^[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-.]?[0-9a-zA-Z])*\\.[a-zA-Z]{2,4}$", ($_POST['email']))) { $notes['error'][] = 'Bitte geben Sie eine korrekte E-Mail-Adresse an!'; } if( !isset($_POST['beitrag']) || trim($_POST['beitrag'])=='' ) { $notes['error'][] = 'Bitte geben Sie eine Nachricht ein!'; }
if( count($notes['error']) > 0 ) {
echo generateNoteList('error');
} else { //Alles drin , dann E-mails schicken $additionalHeader = ''; $additionalHeaderFields = array( 'MIME-Version' => '1.0', 'Content-Type' => 'text/plain; charset=iso-8859-1', 'From' => 'Dieter Treffer <dietertreffer@dietrude.de>', 'Reply-To' => 'dietertreffer@dietrude.de', 'X-Sender-IP' => $_SERVER['REMOTE_ADDR'], 'X-Mailer' => 'PHP/'.phpversion() ); foreach( $additionalHeaderFields as $fieldName => $fieldValue ) { $additionalHeader .= $fieldName.': '.$fieldValue . chr(0x0D).chr(0x0A); }
$text = "Name: ".$_POST['vname']."\nOrt: ".$_POST['ort']."\nE-Mail: ".$_POST['email']."\n\n".$_POST['beitrag']."\n";
$subject = 'Gästebuch'; $body = "Folgender Eintrag erfolgte:\n\n"; $body .= $text; $body .= "\n\nLöschen: http://www.so-klappt-es.de/didi.php\n\n"; @mail('dietertreffer@dietrude.de', $subject, $body, $additionalHeader);
$body = "Sie haben in unser Gästebuch folgenden Eintrag vorgenommen:\n\n"; $body .= $text; $body .= "\n\nVielen Dank für Ihren Eintrag\nDieter Treffer\nwww.so-klappt-es.de"; @mail($_POST['email'], $subject, $body, $additionalHeader);
// Eintraege an DB gaestebuch senden $query = ' INSERT INTO `gaestebuch` SET `ip` = "'.$_SERVER['REMOTE_ADDR'].'", `vname` = "'.mysql_real_escape_string($_POST['vname']).'", `ort` = "'.mysql_real_escape_string($_POST['ort']).'", `email` = "'.mysql_real_escape_string($_POST['email']).'", `homepage` = "'.mysql_real_escape_string($_POST['homepage']).'", `beitrag` = "'.mysql_real_escape_string($_POST['beitrag']).'" '; $result = mysql_query($query, $conn) or die(mysql_error()); $notes['success'][] = 'Danke für den Eintrag! <a href="index.php?section=anzeigen">Einträge lesen >></a>'; //Felder leeren } //Anfang Doppelpostsicherung //=================================== include 'inc.php'; /* * selektiere die IP-Adresse und den Timestamp des * zuletzt eingetragenen Datensatzes */ $sql = 'SELECT ip, wann FROM gaestebuch ORDER BY id_gaesteb DESC LIMIT 0,1'; $resource = mysql_query($sql) or exit('File: ' . __FILE__ . '<br /> Line: ' . __LINE__ . '<br />' . mysql_error()); $tmp = mysql_fetch_assoc($resource); $lastIPAdress = $tmp['ip']; $lastInsertTime = $tmp['wann']; unset($tmp); /* * Wenn die aktuelle IP-Adresse mit der letzten IP-Adresse, die * gespeichert wurde übereinstimmt und der letzte Datensatz * vor weniger als x Sekunden eingetragen wurde, so werden * die Daten nicht in die Datenbanktabelle eingefügt. */ $seconds = 60; if($_SERVER['REMOTE_ADDR'] == $lastIPAddress AND (time() - $lastInserTime) < $seconds) { echo '<p>Du kannst nur einmal innerhalb von ' . $seconds . ' Sekunden das Formular abschicken.</p> <a href="index.php?section=anzeigen">Zu den Einträgen .. </a>'; } }
if( count($notes['error']) <= 0 ) { unset($_POST['vname']); unset($_POST['ort']); unset($_POST['email']); unset($_POST['homepage']); unset($_POST['beitrag']); echo generateNoteList('success'); } mysql_close($conn); ?> Das ist das Skript das in die Db schreibt und prüft
.
Und das hier ist die Ausgabe PHP-Code:
<div id="content_form"> <h2><a href="http://www.so-klappt-es.de/secure/index.php">Gästebuch</a></h2><br/> <br/><br/> <p class="absatz"><a href="index.php?section=gaestebuch">Eintrag schreiben >></a></p><br/> <?php include 'inc.php'; // Verbindung mit DB fuer Eintragungen anzeigen $query = "SELECT count(*) as anz FROM gaestebuch"; $res = mysql_query($query) or die(mysql_error()); $row = mysql_fetch_assoc($res); $gesamt = $row['anz']; unset($row); $maxproseite = 10; $i = 0; $epp = $maxproseite; $seiten = ceil($gesamt/$epp);
if (!isset($_GET['page'])) { $anfang = 0; } else { //Abfrage, wenn eine Seitenzahl gegeben ist. $anfang = ($_GET['page']-1)*$epp; } $laenge = $epp; $sql = "SELECT vname, ort, email, homepage, beitrag, DATE_FORMAT(wann,'%d.%m.%Y ') AS wann FROM gaestebuch ORDER BY id_gaesteb DESC LIMIT ".$anfang.", ".$laenge.""; $res = mysql_query($sql) or die(mysql_error()); while($row = mysql_fetch_assoc($res)) { #print_r($row); echo ' <table width="70%"> <tr> <td>'.$row['vname'].' aus: '.$row['ort'].'</td> </tr> <tr> <td>Mail:</td> <td class="bgweiss">'.$row['email'].'</td> <tr> <td>Homepage</td> <td class="bgweiss">'; if($row['homepage']) { echo " <a href=\"".$row['homepage']." \" target = \"_new\">homepage</a>"; } echo'</td></tr> </table><br/> schrieb am '.$row['wann'].' <p class="bgweiss">'.nl2br($row['beitrag']).'</p>'; } echo "Zeige mir Seite "; for($i = 1; ($i - 1)< $seiten; $i++) { //Ausgabe der Linkliste echo "<a href=\"index.php?section=anzeigen&page=".$i."\"> <img border=\"0\" src=\"img/seite.gif\" />".$i."</a> "; } mysql_close($conn); ?> <p class="absatz"><a href="index.php?section=gaestebuch">Eintrag schreiben >></a></p><br/> <br/><br/> <a class="top" href="">Top<img src="img/top.gif" alt="Top"/></a> </div> Es gibt keine Fehlermeldung und es funzt auch alles wunderbar..BIS AUF DIE Doppelpostsicherung.. 
Es ist sicher nur ne Kleinigkeit..aber ich finde es nicht.
.
.
__________________
Gruss Didi
--------------------------------------- ...guckst Du in Didis Welt... 
============================== Erst wenn die letzte Tankstelle geschlossen,
die letzte Bohrinsel versenkt und der letzte Tropfen Sprit verbrannt sind,
werdet Ihr merken, daß man bei Greenpeace nachts kein Bier kaufen kann. |
| |
16.01.2006, 19:12
| Nach oben
#2 | | Johannes Schlichenmaier
Registriert seit: 26.08.2005 Ort: Mannheim
Beiträge: 403
|
ähmmm.......
Also vielleicht blick ich grade nich richtig durch, aber dem oberen Script ist es grade egal, ob der Absender, innerhalb der letzten 60 Sekunden einen Eintrag gemacht hat.
Es gibt lediglich ne Fehlermeldung aus, aber verhindert das Eintragen nicht.
Überleg mal, welche Struktur dein Script haben müsste, wenn nur etwas eingetragen werden soll, wenn kein EIntrag innerhalb der letzten 60 Sekunden erfolgt ist.
Dann solltest du recht schnell selbst drauf kommen.
Grüße,
Jojo
//edit: Falsches Forum? Corvin, verschiebst du das?
__________________
In the beginning was the word
and the word was content-type: plain/text
heute code ich, morgen debug ich und uebermorgen cast ich die koenigin auf int
Geändert von Jojo (16.01.2006 um 19:19 Uhr)
|
| |
16.01.2006, 19:23
| Nach oben
#3 | | Benjamin Klaile
Registriert seit: 02.12.2004 Ort: Remagen
Beiträge: 4.516
|
Der Beitrag wurde verschoben, wegen...
... Postings im falschen Forum. Bitte beim nächsten Mal darauf achten..
(Ist ja im Prinzip nicht wirklich ein Problem mit der Datenbank.) verschoben |
| |
16.01.2006, 19:32
| Nach oben
#4 | | Neuer Benutzer
Registriert seit: 14.01.2006 Ort: Datteln
Beiträge: 22
|
Hi, das ging ja schnell.. verschoben? Na ja Ansichtssache, für mich hing das zusammen
Back to Topic..
ich muss hier auch erwähnen, dass ich erst vor ein paar Wochen mit php angefangen habe.
Im Mom weiss ich nicht, was ich aus meiner "Struktur" erkennen soll.
Ich hole die ip und die Zeit und sage innerhalb des PHP-Code: if( isset($_POST['submit']) ) {
das er diese checken soll??
Es gibt aber auch keine Fehlermeldung also stimmt ja ohnehin etwas nicht
.
.
.
__________________
Gruss Didi
--------------------------------------- ...guckst Du in Didis Welt... 
============================== Erst wenn die letzte Tankstelle geschlossen,
die letzte Bohrinsel versenkt und der letzte Tropfen Sprit verbrannt sind,
werdet Ihr merken, daß man bei Greenpeace nachts kein Bier kaufen kann. |
| |
16.01.2006, 19:35
| Nach oben
#5 | | Johannes Schlichenmaier
Registriert seit: 26.08.2005 Ort: Mannheim
Beiträge: 403
|
Naja, deine Struktur ist im Moment so: Code: Start
Checke, ob alle Felder korrekt ausgefüllt wurden.
Nein -> Gib Fehler aus
Ja -> Speichere Eintrag in MySQL
Checke, ob der Benutzer in den letzen 60 Sekunden eingetragen hat
Ja -> Gib Fehlermeldung aus
Nein -> Mach nix
Ende.
Nich sehr sinnvoll die Reihenfolge oder?
__________________
In the beginning was the word
and the word was content-type: plain/text
heute code ich, morgen debug ich und uebermorgen cast ich die koenigin auf int
|
| |
16.01.2006, 19:40
| Nach oben
#6 | | Neuer Benutzer
Registriert seit: 14.01.2006 Ort: Datteln
Beiträge: 22
|
Hi, stimmt! Zitat:
Checke, ob der Benutzer in den letzen 60 Sekunden eingetragen hat
Ja -> Gib Fehlermeldung aus
Nein -> Speichere nicht | So wäre sinnvoller nicht war.?
Dazu brauche ich aber einen Denkanstoss. PHP-Code: $seconds = 60; if($_SERVER['REMOTE_ADDR'] == $lastIPAddress AND (time() - $lastInserTime) < $seconds) { echo '<p>Du kannst nur einmal innerhalb von ' . $seconds . ' Sekunden das Formular abschicken.</p> <a href="index.php?section=anzeigen">Zu den Einträgen .. </a>'; }
hier muss noch ein "else" rein oder?
.
.
.
__________________
Gruss Didi
--------------------------------------- ...guckst Du in Didis Welt... 
============================== Erst wenn die letzte Tankstelle geschlossen,
die letzte Bohrinsel versenkt und der letzte Tropfen Sprit verbrannt sind,
werdet Ihr merken, daß man bei Greenpeace nachts kein Bier kaufen kann. |
| |
16.01.2006, 19:42
| Nach oben
#7 | | Benjamin Klaile
Registriert seit: 02.12.2004 Ort: Remagen
Beiträge: 4.516
|
Hab ich ja schon in einem anderen Forum gepostet: Zitat: |
Zitat von Ben Asoooooo .. *ploink*
Du musst mir aber dann noch erklären, warum Du mehrere Dateien hast?
Es ist doch viel simpler, wenn man das strukturiert in einer Datei unterbringt.
Nun. Ich habe mal was getippert .. ungetestet und somit ohne Gewähr PHP-Code: <?php
/* * Wenn das Formular abgeschickt wurde wird ... "gerechnet" :-) * Ansonsten wird das Formular angezeigt. */ if(array_key_exists('sent', $_POST)) { $connection = mysql_connect('localhost', 'db_username', 'db_password') or exit('mysql_connect() fehlerhaft: <br />' . mysql_error()); mysql_select_db('database', $connection) or exit('mysql_select_db() fehlerhaft: <br />' . mysql_error()); /* * selektiere die IP-Adresse und den Timestamp des * zuletzt eingetragenen Datensatzes */ $sql = 'SELECT ip_address, insert_time FROM testtable ORDER BY ID DESC LIMIT 0,1'; $resource = mysql_query($sql) or exit('File: ' . __FILE__ . '<br /> Line: ' . __LINE__ . '<br />' . mysql_error()); $tmp = mysql_fetch_assoc($resource); $lastIPAdress = $tmp['ip_address']; $lastInsertTime = $tmp['insert_time']; unset($tmp); /* * Wenn die aktuelle IP-Adresse mit der letzten IP-Adresse, die * gespeichert wurde übereinstimmt und der letzte Datensatz * vor weniger als x Sekunden eingetragen wurde, so werden * die Daten nicht in die Datenbanktabelle eingefügt. */ $seconds = 10; if($_SERVER['REMOTE_ADDR'] == $lastIPAddress AND (time() - $lastInserTime) < $seconds) { echo '<p>Du kannst nur einmal innerhalb von ' . $seconds . ' Sekunden das Formular abschicken.</p> <a href="irgendwo.html">Hier gelangst Du irgendwo hin .. </a>'; } else { /* * Die Nutzereingaben sollten auf jeden Fall behandelt werden. * Heißt: Überprüfung auf SQL-Injection und Co. * Weiterführendes dazu findet man am Ende des Postings. */ // Ohne Überprüfung .. !!! $name = $_POST['name']; $mail = $_POST['mail']; $message = $_POST['message']; $sql = "INSERT INTO testtable ( 'name', 'mail', 'message', 'ip_address', 'insert_time' ) VALUES ( '" . $name . "', '" . $mail . "', '" . $message . "', '" . $_SERVER['REMOTE_ADDR'] . "', '" . time() . "', )"; mysql_query($sql) or exit('File: ' . __FILE__ . '<br /> Line: ' . __LINE__ . '<br />' . mysql_error()); echo '<p>Nachricht erfolgreich gesendet.</p> <a href="' . $_SERVER['PHP_SELF'] . '">zurück zum Formular</a>'; } } else { echo '<form action="' . $_SERVER['PHP_SELF'] . '" method="post"> Name:<br /> <input type="input" name="name" size="25" /><br /> Mail:<br /> <input type="input" name="mail" size="25" /><br /> Nachricht:<br /> <textarea name="message" rows="15" cols="50"></textarea><br /> <input type="submit" name="sent" value="Senden" /> </form>'; }
?> Verweise zu SQL-Injection und Co.
--> http://forum.developers-guide.net/showthread.php?t=670
--> http://forum.developers-guide.net/showthread.php?t=159
Vielleicht hilft es ja wem.
Grüße Ben  | |
| |
16.01.2006, 19:42
| Nach oben
#8 | | Johannes Schlichenmaier
Registriert seit: 26.08.2005 Ort: Mannheim
Beiträge: 403
| Zitat: |
Zitat von didi Checke, ob der Benutzer in den letzen 60 Sekunden eingetragen hat
Ja -> Gib Fehlermeldung aus
Nein -> Speichere nicht | Extakt! 
nur wenn der Benutzer innerhalb der letzen 60 Sekunden nicht eingetragen hat, soll er eingetragen werden.
Was da jetzt genau nicht funktioniert mit der Überprüfung musst du mal gucken.
(erster Anlaufpunkt: am Ende des Scripts ein "echo mysql_error();")
__________________
In the beginning was the word
and the word was content-type: plain/text
heute code ich, morgen debug ich und uebermorgen cast ich die koenigin auf int
|
| |
17.01.2006, 13:29
| Nach oben
#9 | | Neuer Benutzer
Registriert seit: 14.01.2006 Ort: Datteln
Beiträge: 22
|
Hi, Zitat:
Nun. Ich habe mal was getippert .. ungetestet und somit ohne Gewähr | EDIT:::::::::::::::::::::::::::::::::::::
Ja, aber was soll ich denn mit dem halbfertigen Ding?
Weder passt es zu meinem Skript, noch könnte ich dies um meines erweitern. PHP-Code: <?php
include 'inc.php';
$notes = array('success'=>array(), 'notice'=>array(), 'error'=>array());
function generateNoteList($type)
{
global $notes;
$return = '';
switch( $type ) {
case 'success':
case 'notice':
case 'error':
break;
default:
return null;
}
$return .= '<div><ul class="'.$type.'">';
foreach( $notes[$type] as $value ) {
$return .= '<li>'.$value.'</li>';
}
$return .= '</ul></div>';
return $return;
}
if( isset($_POST['submit']) ) {
//DoppelPostCheck
$sql = 'SELECT
ip,
wann
FROM
gaestebuch
ORDER BY
id_gaesteb
DESC
LIMIT 0,1';
$resource = mysql_query($sql) or exit('File: ' . __FILE__ . '<br />
Line: ' . __LINE__ . '<br />' . mysql_error());
$tmp = mysql_fetch_assoc($resource);
$lastIPAdress = $tmp['ip'];
$lastInsertTime = $tmp['wann'];
unset($tmp);
$seconds = 30;
if($_SERVER['REMOTE_ADDR'] == $lastIPAddress AND (time() - $lastInserTime | |