Hi und Danke erstmal!
Du bist hier noch am Scriptanfang und weißt gar nicht, ob du überhaupt eine Datenbankverbindung brauchst. Im Falle eines Fehlers nämlich drehst du ja noch eine Formularausfüllrunde ohne das DBMS zu behelligen. Trotzdem öffnest du die Verbindung. Und ohne zu prüfen, ob das geklappt hat, versuchst du gleich darauf die zu verwendende Datenbank zu selektieren. Bau doch mal einen Tippfehler in die Zugangsdaten ein oder fahr den MySQL-Server runter. Dann siehst du, dass das Selektieren der Datenbank einen Folgefehler bringt. Erst viel weiter unten prüfst du, ob die Verbindung erfolgreich war.
Ok, verstanden, aber dann muss ich die Verbindung nochmals neu öffnen wenn ich zur Datenbankabfrage (und dem Auslesen der Tabelle), da die Verbindung nur aufgebaut wird, wenn die Eingaben geprüft und behandelt wurden (und fehlerfrei sind), richtig? Das Auslesen soll ja aber in jedem Fall geschen.
»» // alle Slashes in superglobalen arrays löschen
Diesen Vorgang solltest du ganz am Scriptanfang einfügen. Eingabedaten in eine brauchbares Format (Rohform) zu bringen, sollte der erste Schritt sein (EVA-Prinzip)
Ok.. danke für den Link :).
Und noch viel besser: Du kannst auch direkt auf das Array prüfen, denn ein leeres Array ergibt auch false.
if (! $form_error) {
cool :). Eigentlich super logisch, aber ich wär nie von selbst drauf gekommen.
Außerdem hast du vergessen, $form_error definitiv anzulegen. Wenn kein Fehler auftritt, schreibst du nichts rein, wodurch es nicht implizit angelegt wird. Ein Lesezugriff auf etwas nicht vorhandenes ist normalerweise ein Fehler. PHP informiert darüber aber nur, wenn man es explizit darum bittet: mit auf E_ALL gestelltem error_reporting. Das ist beim Entwickeln immer empfehlenswert, bekommt man doch damit auch fehlerhafte Zugriffe aufgrund von Schreibfehlern angezeigt. Bevor du also die Prüfungen beginnst:
$form_error = array();
Ok, hab ich gemacht und error_reporting hab ich auf E_ALL gestellt. Danke.
Außerdem ist es besser, statt das Script sterben zu lassen und dabei noch alle Welt mit technischen Details zu behelligen, wenn du im Fehlerfall einen alternativen Weg gehst (if-else) und damit zum einen das Script ordentlich beendest und zum anderen die Fehlermeldung nur an den Administrator leitest.
Das versteh ich nicht. Wie soll man das script denn ordentlich beenden?
Meinst Du zum Beispiel anstelle des die() eine neue variable in das error-array schreiben und ausgeben lassen?
»» else {
»» $sql = "INSERT INTO agenda (Datum, Zeit, Ort, Adresse) VALUES ('".$_POST['Datum']."', '".$_POST['Zeit']."', '".$_POST['Ort']."', '".$_POST['Adresse']."')";Hier fehlt die kontextgerechte Behandlung der Werte. Wenn jemand als Ort D'dorf eingibt, bekommst du nur einen Syntaxfehler. Wenn jemand diese SQL-Injection-Lücke gezielter ausnutzt, ...
mysql_real_escape_string() heißt das Stichwort.
Die Behandlung müsste mit der Überprüfung der Eingaben geschehen, oder? (Also direkt vor dem Datenbankeintrag)
Auch hier wieder: Vor der Schleife sollte $arr explizit als leeres Array angelegt werden. Wenn es nämlich nichts zu Fetchen gibt, wird $arr nicht angelegt und ...
Thanks!
»» [code lang=php]<form action="<?php htmlspecialchars($_SERVER['PHP_SELF'])?>" method="post">
Hier fehlt ein echo.
Hm, danke... hat aber auch ohne funktioniert?! *kopfkratz
Besser ist es class zu verwenden. Dass du es hier schon mit "text" belegt hast, macht nichts, class kann man mehrere Werte durch Leerzeichen getrennt zuweisen.
Danke, das mit dem Leerzeichen wusste ich nicht.
Und dann möchtest du vielleicht das value-Attribut der input-Elemente mit dem Wert aus der Eingabe vorbelegen, so dass im Falle eines Fehlers in einem Feld der Anwender nicht alles noch einmal einzugeben hat.
Jap, macht Sinn. Werde ich am Ende noch versuchen hinzuzufügen.
Für die Syntax-Prüfung kann man einen Regulären Ausdruck verwenden. Dann gibt es aber immer noch die Möglichkeit, ungültige Werte einzugeben wie 25:90. Eine Uhrzeit zu prüfen ist ja noch relativ einfach. Man trennt die Angabe in Einzelwerte und vergleicht auf das Einhalten der Grenzen (für Stunden, Minuten und Sekunden). Prinzipiell kann man das bei einem Datum genauso machen, allerdings ist die Prüfung hier komplexer. Aber PHP macht es einfach, es gibt die Funktion checkdate().
Die zum Prüfen erzeugten Einzelwerte fügst du bei Fehlerfreiheit mit dem korrekten Trennzeichen so zusammen, wie MySQL sie haben will und fertig ist.
Ok, da muss ich wohl nochmals über die Bücher, aber werd das in Angriff nehmen, sobald ich den Rest gepackt hab ;).
Dankeschön
php-loser