Zitat
Wenn jemand Verbesserungsvorschläge hat nur raus damit
Wo soll ich anfangen... 
PDO DSN für MySQL-Treiber:
In dem DSN sollte bereits das Encoding gesetzt werden und der Verbindungsaufbau kontrolliert werden:
try {
$pdo = new PDO(
'mysql:host=localhost;dbname=tutorial;charset=utf8' // <-- DSN ( DataSourceName )
, 'root' // <-- MySQL-Benutzername
, '' // <-- MySQL-Passwort
, array(
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ, // <-- Standard Datentyp für die Rückgabe von fetch(), hier: Object
PDO::ATTR_EMULATE_PREPARES => false, // <-- PreparedStatements NICHT nur emulieren!
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION // <-- Standard Fehlermodus, hier: Exceptions
)
);
} catch ( PDOException $pex ) {
echo $pex->getMessage();
}
Alles anzeigen
Nachzulesen hier: http://www.php-rocks.de/thema/49-ein-k…statements.html
Statement Platzhalter
Die Platzhalter funktionieren glaube ich auf Deine Weise nicht. $name usw. werden innerhalb der Zeichenkette von Interpreter mit Ihren Werten ersetzt, so dass execute() mit seinen Parametern fehlschlägt.
Ich vermute, dass bei entsprechendem ErrorReporting dies auch in Form einer Meldung, wenn nicht sogar eines Fehlers dargestellt wird.
Verwende für NamedPlaceholder die standardisierten Doppelpunkte und übergebe ein entsprechend assoziatives Array:
$statement = $pdo->prepare( "INSERT INTO formulardaten ( name, email, betreff, nachricht ) VALUES ( ':name', ':email', ':betreff', ':nachricht' )" );
$statement->execute(
array(
'name' => $name
, 'email' => $email
, 'betreff' => $betreff
, 'nachricht' => $nachricht
)
);
Auch das ist hier zu finden...
Die falschen Daten in der Tabelle kommen allerdings daher, dass Du die Variablen in execute() in SingleQuotes setzt, die gehören da nicht hin!
Scope bzw. EVA
Du verwendest allerdings für den Insert Variablen, die im Scope an der Stelle noch gar nicht verfügbar sind!
$name usw. definierst Du erst nach dem Datenbankzugriff. Du musst die Daten zuvor aufbereiten und dann erst die Datenbank-Query absenden.
Dieser Fehler wird Dir auch mit Notices quittiert, siehe Dein zweiter Screenshot! Weitere Infos dazu findest Du hier: http://www.php-rocks.de/thema/66-undef…in-on-line.html
Neue ID für jeden Datensatz
Das kannst Du relativ leicht erreichen, in dem Du in phpMyAdmin der Spalte einfach ein AUTO_INCREMENT verpasst, dann macht MySQL das zuverlässig für Dich...
EDIT: Dinge, die nach "einer Nacht drüber schlafen" noch aufgefallen sind... 
Ist zwar technisch bzw. funktionell nichts anderes/besseres, aber Du kannst Deinen Code "übersichtlicher" halten, wenn Du die Abfragen der POST-Daten ternär verarbeitest:
$name = isset( $_POST['name'] )? htmlspecialchars( $_POST['name'] ): null;
$email = isset( $_POST['email'] )? htmlspecialchars( $_POST['email'] ): null;
$betreff = isset( $_POST['betreff'] )? htmlspecialchars( $_POST['betreff'] ): null;
$nachricht = isset( $_POST['nachricht'] )? htmlspecialchars( $_POST['nachricht'] ): null;
$sicherheitsabfrage = isset( $_POST['sicherheitsabfrage '] )? htmlspecialchars( $_POST['sicherheitsabfrage '] ): null;
Das Schreiben bzw. Anhängen Deiner erstellten Ausgabe kannst Du mit Hilfe des dritten Parameter von file_put_contents() auch quasi als Einzeiler abfrühstücken:
if ( !file_put_contents('auswertung.txt', $ausgabe, FILE_APPEND|LOCK_EX) ) {
echo 'Fehler beim Schreiben in die Datei...';
}
Aktueller Stand:
Dein Script würde nach Berücksichtigung der oberen Hinweise aktuell so aussehen:
if ( isset($_POST['absenden']) ) {
$name = isset( $_POST['name'] )? htmlspecialchars( $_POST['name'] ): null;
$email = isset( $_POST['email'] )? htmlspecialchars( $_POST['email'] ): null;
$betreff = isset( $_POST['betreff'] )? htmlspecialchars( $_POST['betreff'] ): null;
$nachricht = isset( $_POST['nachricht'] )? htmlspecialchars( $_POST['nachricht'] ): null;
$sicherheitsabfrage = isset( $_POST['sicherheitsabfrage '] )? htmlspecialchars( $_POST['sicherheitsabfrage '] ): null;
try {
$pdo = new PDO(
'mysql:host=localhost;dbname=tutorial;charset=utf8' // <-- DSN ( DataSourceName )
, 'root' // <-- MySQL-Benutzername
, '' // <-- MySQL-Passwort
, array(
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ, // <-- Standard Datentyp für die Rückgabe von fetch(), hier: Object
PDO::ATTR_EMULATE_PREPARES => false, // <-- PreparedStatements NICHT nur emulieren!
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION // <-- Standard Fehlermodus, hier: Exceptions
)
);
} catch ( PDOException $pex ) {
echo $pex->getMessage();
}
$statement = $pdo->prepare( "INSERT INTO formulardaten ( name, email, betreff, nachricht ) VALUES ( ':name', ':email', ':betreff', ':nachricht' )" );
$statement->execute(
array(
'name' => $name
, 'email' => $email
, 'betreff' => $betreff
, 'nachricht' => $nachricht
)
);
}
// Die folgenden 3 Zeilen sind ebenfalls stark optimierbar, was ich mir an dieser Stelle aber spare, da es sonst vermutlich zu viel wird.
$sicherheitsantwort = 7;
$ausgabe = "-----------------------------------------\r\nName: ".$name ."\r\nE-Mail: ".$email ."\r\nBetreff: ".$betreff ."\r\nNachricht: ". $nachricht ."\r\n-----------------------------------------\r\n";
if ( (integer)$_POST['sicherheitsabfrage'] == 7 && htmlspecialchars($_POST['name']) && htmlspecialchars ($_POST['e-mail']) && htmlspecialchars ($_POST['betreff']) && htmlspecialchars ($_POST['nachricht']) ) {
echo "<p class='echos'>Formular wurde erfolgreich abgesendet!</p>";
if ( !file_put_contents('auswertung.txt', $ausgabe, FILE_APPEND|LOCK_EX) ) {
echo 'Fehler beim Schreiben in die Datei...';
}
} else {
echo "<p class='echos'>Ihre Angaben waren falsch. Bitte füllen sie das Formular nochmal aus!</p>";
}
Alles anzeigen