Portal > Foren > PHP > PHP-Programmierung > Mehrfacheintrag durch aktualisieren :)
Antwort
 
Themen-Optionen Thema durchsuchen
Alt 16.01.2006, 19:05 Nach oben    #1
Neuer Benutzer
 
Benutzerbild von didi
 
Registriert seit: 14.01.2006
Ort: Datteln
Beiträge: 22
Standard 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']) > ) {

            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! &nbsp;&nbsp;&nbsp;<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']) <= ) {
        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&auml;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&nbsp;&nbsp;";
        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.
didi ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 16.01.2006, 19:12 Nach oben    #2
Johannes Schlichenmaier
 
Benutzerbild von Jojo
 
Registriert seit: 26.08.2005
Ort: Mannheim
Beiträge: 403
Standard

ä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)
Jojo ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 16.01.2006, 19:23 Nach oben    #3
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.516
Standard

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
Ben ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 16.01.2006, 19:32 Nach oben    #4
Neuer Benutzer
 
Benutzerbild von didi
 
Registriert seit: 14.01.2006
Ort: Datteln
Beiträge: 22
Standard

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.
didi ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 16.01.2006, 19:35 Nach oben    #5
Johannes Schlichenmaier
 
Benutzerbild von Jojo
 
Registriert seit: 26.08.2005
Ort: Mannheim
Beiträge: 403
Standard

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
Jojo ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 16.01.2006, 19:40 Nach oben    #6
Neuer Benutzer
 
Benutzerbild von didi
 
Registriert seit: 14.01.2006
Ort: Datteln
Beiträge: 22
Standard

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.
didi ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 16.01.2006, 19:42 Nach oben    #7
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.516
Standard

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
Ben ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 16.01.2006, 19:42 Nach oben    #8
Johannes Schlichenmaier
 
Benutzerbild von Jojo
 
Registriert seit: 26.08.2005
Ort: Mannheim
Beiträge: 403
Standard

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
Jojo ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 17.01.2006, 13:29 Nach oben    #9
Neuer Benutzer
 
Benutzerbild von didi
 
Registriert seit: 14.01.2006
Ort: Datteln
Beiträge: 22
Standard

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