Fehler bei php Formular
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
adresse
auslese
benutzer
betrag
break
code
datum
eingabe
fehler
feld
formular
foto
karteninhaber
kreditkarte
match
spende
typ
vergessen
visum
zahl
-
.
anscheinend ist irgendwas bei adresse falsch, ich find aber nix...
spendenformular:
<html> <head> <title>Spendenformular für bedrohte Vögel</title> </head> <body> <form name="spende" action="spende.php" method="post" enctype="multipart/form-data"> <input type="hidden" name="ausgabeZeit" value="<?php echo time();?>"> <h1>Spendenformular</h1> Wir freuen uns, dass Sie spenden möchten! Bitte geben Sie Ihren Namen, Ihre Adresse, die Höhe der Spende und Ihre Kreditkartennummer ein. Drücken Sie dann auf "Spende abschicken!"</p> <p> <b>Name:</b> <input type="text" name="spenderName" size="80"></p> <p><b>Adresse</b><br> <textarea name="adresse" rows="4" cols="40"></textarea></p> <p><b>Höhe der Spende:</b> <select name="betrag"> <?php for($i=5;$i<101;$i=$i+5){ echo "<option value=\"".$i."\">".$i."€\n"; } ?> </select> <b>Spendenrhytmus</b> <select name="spendenRhytmus"> <option value="einmalig">einmalig <option value="wöchentlich">wöchentlich <option value="monatlich">monatlich <option value="jährlich">jährlich </select> <b>Ihr Foto</b> (optional): <input name="spenderFoto" type="file"></p> <p><b>Kreditkartentyp:</b> <input type="radio" name="kartenTyp" value="Visa">Visa <input type="radio" name="kartenTyp" value="Mastercard">Mastercard <input type="radio" name="kartenTyp" value="American Express">American Express </p> <p><b>Kreditkarteninhaber</b> <input type="text" name="Kreditkarteninhaber" size="80"></p> <p><b>Kreditkartennummer:</b> <input type="text" name="kreditKarte" size="20" maxlength="20"> <b>Ablaufdatum:</b> <input type"text" name="ablaufDatum" size="4" maxlength=24 ></p> <b>Klicken sie hier, wenn wir Ihren Namen veröffentlichen dürfen:</b> <input type="checkbox" name="oeffentlich" checked></p> <p><input type="submit" value="Spende abschicken!"></p> </form> </bod> </html>
das auswertungsskript:
<?php //Dieses Skript empfängt die Daten des Spendenformulars //Die Daten werden überprüft und dem benutzer zur Bestätigung angezeigt. $hack=false; //Daten der Bequemlichkeit aus $_Post auslesen $spenderName = $_POST["spenderName"]; $adresse = $_POST["adresse"]; $betrag = $_POST["betrag"]; $spendenRhytmus = $_POST["spendenRhytmus"]; $kartenTyp = $_POST["kartenTyp"]; $kreditKarte = $_POST["kreditKarte"]; $kartenInhaber =$_POST["kreditKartenInhaber"]; $ablaufDatum =$_POST["ablaufDatum"]; $oeffentlich =$_POST["oeffentlich"]; $ausgabeZeit =$_POST["ausgabeZeit"]; //Überprüfung der Daten //$spendername kann ein beliebiger String sein, sollte aber nicht leer sein if($spenderName ==""){$hack=true; $feld="Name";} //für Adresse gilt selbiges if($adresse ==""){$hack=true; $feld="Adresse";} //Betrag muss Ganze Zahl zwischen 5 und 100 if(!preg_match("/^\d*[05]$/", $betrag)){$hack=true;$feld="Betrag";} if(($betrag<5)||($betrag>100)){$hack=true;$feld="Betrag";} //Kartentyp Visa oder Mastercard switch($kartenTyp){case "Visa":break; case "Masercard":break; default: $hack=true; $feld="Kartentyp";} //Kartennummer 15 oder 16 Ziffern ohne Leerzeichen oder Sonderzeichen if(!preg_match("/^(\d[\s\-]?){15,16}$/",$kreditKarte)){$hack=true; $feld="Kartennummer";} //Ablaufdatum ersten zwei zwischen 01und12 die dritte 1oder2 und die vierte zwischen 11und20 if(!preg_match("/^(\d{2})[1,2][11-20]$/", $ablaufDatum, $match)){$hack=true; $feld="Ablaufdatum";} else{if(($match[1]<1)||($match[1]>12)) {$hack=true; $feld="Ablaufdatum";}} //Checkbox leer, on oder gehackt if(($oeffentlich!="")&&($oeffentlich!="on")){$hack=true; $feld="öffentliche Spende";} //Ausgabezeit muss eine ganze Zahl sein if(!preg_match("/^\d+$/", $ausgabeZeit)){$hack=true; $feld="ausgabeZeit";} //Wurde ein Foto verschickt if($_FILES["spenderFoto"]["size"]>0){$foto=true; preg_match("/^\.\w+)$/", $_FILES["spenderFoto"]["name"],$match); $typ=$match[1]; //es sind nur Bilddateien erlaubt, damit keine Skripte eingeschmuggelt werden können if(in_array(strlolower($typ),array(".gif",".bmp",".jpg",".jpeg"))){$dateiName=uniqid("").$typ; $bildPfad= preg_replace("/\/[^\/]+$/","", $_SERVER["SCRIPT_FILENAME"]) ."/Bilder/"; copy($_FILES["spenderfoto"]["tmp_name"], $bildPfad.$dateiName);}} else{$foto=false;} //Fehlermeldung anzeigen if($hack){?> <html> <head> <title>fuck you</title> </head> <body> <h1>Eingabefehler</h1> Ihre Eingabe im Feld <b><?php echo $feld; ?></b> war inkorrekt. </body> </html> <?php exit(); //Skript beenden } //Platzhalter für Skrpt zur Datenverarbeitung ?> //Daten zur Bestätigung an den Benutzer ausgeben <html> <head> <title>Eingabefehler</title> </head> <body> <h1>Liebe(r)<?php echo $spenderName;?></h1> <p>Haben sie vielen Dank für Ihre Spende über <?php echo $betrag;?>€. Eine Spendenquittung schicken wir an Ihre Adresse:</p> <p><b><?php echo stripslashes(preg_replace("/\r?\n","<br>",$adresse));?></b></p> <p>Die Spende wird in einem <?php echo $spendenRhytmus;?>Rhytmus von Ihrer <b><?php echo $kartenTyp;?>-Kreditkarte mit Nummer:</p> <p><b><?php echo $kreditKarte;?></b> gültig bis <b><?php echo $ablaufDatum;?></b>abgebucht</p> <p>Karteninhaber ist <?php echo $kreditKartenInhaber;?></p> <?php}?> <p>Wir nehmen zur Kenntnis, dass wir Ihren Namen <? php if ($oeffentlich==""){echo "nicht"}?> veröffentlichen dürfen.</p> <p>Sie haben <?php echo (time()-$ausgabeZeit);?> Sekunden zum ausfüllen unseres Formulars gebraucht.</p> </body> </html>
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Öhm joah, was soll eigentlich das Script machen? Außerdem finde ich das PHP-Verarbeitungsscript ein bisschen schlecht. Sachen wie
<head>
oder
<title>fuck you</title>
</head>
<body> mit </bod>
zuzumachen ist nicht besonders vielsagend.
Erzähl uns doch ein bisschen was du genau damit machen willst. -
it-heberle schrieb:
anscheinend ist irgendwas bei adresse falsch, ich find aber nix...
Naja, wenn du dir nicht die Mühe machst genau zu beschreiben, was nicht wie gewünscht funktioniert, wird sich hier keiner die Mühe machen nach Fehlern zu suchen... -
ich versuche mir hier gerade mithilfe eines buches php beizubringen.
den titel bitte ich zu entschuldigen!
wie gesagt lerne ich gerade erst den umgang mit dieser sprache, weshalb mir die fehlersuche etwas schwerfällt.
ich habe im endeffekt ein formular erstellt, mit textfeldern, auswahlfeldern, und textarea.das zweite skript soll die daten, die in dieses formular eingegeben werden auswerten und bei eingabefehlern diese zurückgeben oder bei reichtigkeit eine bestätigung abschicken.
leider gibt es mir immer wieder andere fehler aus.
erst war das datum falsch obwohl das ja hidden ist, und jetzt heißt es eben, die adresse ist falsch obwohl ich mit sicherheit weiß, dass ich diese richtig eingegeben habe.
danke schonmal für den tipp mit </bod(y)>!
hoffe das ist jetzt was ihr benötigt, ansonsten gerne nochmal nachfragen!
DANKE -
Was ich gleich zu Anfang loswerden will: dein Code ist ziemlich unübersichtlich. Du solltest Code-Teile einrücken und jedem Befehl eine eigene Zeile spendieren, das macht dein Script dann wesentlich lesbarer. Auch ist es üblich vor und nach einem Operator ein Leerzeichen zu setzten.
Zudem brauchst du in einem if-Statement einzelne Ausdrücke nicht extra einklammern (if($betrag < 5 || $betrag > 100) reicht anstatt if(($betrag < 5) ||( $betrag > 100))).
Ich habe deinen Code jetzt ein wenig gegliedert und ein paar gefundene Fehler korrigiert (und mit Kommentaren darauf hingewiesen):
<html> <head> <title>Spendenformular für bedrohte Vögel</title> </head> <body> <form name="spende" action="spende.php" method="post" enctype="multipart/form-data"> <input type="hidden" name="ausgabeZeit" value="<?php echo time();?>"> <h1>Spendenformular</h1> Wir freuen uns, dass Sie spenden möchten! Bitte geben Sie Ihren Namen, Ihre Adresse, die Höhe der Spende und Ihre Kreditkartennummer ein. Drücken Sie dann auf "Spende abschicken!"</p> <p> <b>Name:</b> <input type="text" name="spenderName" size="80"> </p> <p> <b>Adresse</b><br> <textarea name="adresse" rows="4" cols="40"></textarea> </p> <p> <b>Höhe der Spende:</b> <select name="betrag"> <?php for($i=5;$i<101;$i=$i+5) { echo "\t\t\t<option value=\"".$i."\">".$i."€\n"; } ?> </select> <b>Spendenrhytmus</b> <select name="spendenRhytmus"> <option value="einmalig">einmalig <option value="wöchentlich">wöchentlich <option value="monatlich">monatlich <option value="jährlich">jährlich </select> <b>Ihr Foto</b> (optional): <input name="spenderFoto" type="file"> </p> <p> <b>Kreditkartentyp:</b> <input type="radio" name="kartenTyp" value="Visa">Visa <input type="radio" name="kartenTyp" value="Mastercard">Mastercard <input type="radio" name="kartenTyp" value="American Express">American Express </p> <p> <b>Kreditkarteninhaber</b> <!-- Achtung PHP-ist Case-Sensitiv (unterscheidet zwischen Groß- und Kleinschreibung) --> <input type="text" name="kreditKartenInhaber" size="80"> </p> <p> <b>Kreditkartennummer:</b> <input type="text" name="kreditKarte" size="20" maxlength="20"> <b>Ablaufdatum <i>(Fromat: TT.MM.JJ ??)</i>:</b> <!-- '=', und Anführungszeichen Vergessen: --> <input type="text" name="ablaufDatum" size="4" maxlength="24" > </p> <p><!-- p-Tag vergessen! --> <b>Klicken sie hier, wenn wir Ihren Namen veröffentlichen dürfen:</b> <input type="checkbox" name="oeffentlich" checked> </p> <p><input type="submit" value="Spende abschicken!"></p> </form> </body> </html>
Was mir noch immer nicht klar ist, ist wie das Datum aussehen soll. Dein Regex hat mich da eher verwirrt und im Formular ist kein Hinweis darauf, wie das Datum aussehen soll! Abgesehen vom Datum sollte jetzt aber alles richtig verarbeitet werden.<?php //Dieses Skript empfängt die Daten des Spendenformulars //Die Daten werden überprüft und dem benutzer zur Bestätigung angezeigt. $hack = false; //Daten der Bequemlichkeit aus $_Post auslesen $spenderName = $_POST["spenderName"]; $adresse = $_POST["adresse"]; $betrag = $_POST["betrag"]; $spendenRhytmus = $_POST["spendenRhytmus"]; $kartenTyp = $_POST["kartenTyp"]; $kreditKarte = $_POST["kreditKarte"]; $kartenInhaber = $_POST["kreditKartenInhaber"]; $ablaufDatum = $_POST["ablaufDatum"]; $oeffentlich = $_POST["oeffentlich"]; $ausgabeZeit = $_POST["ausgabeZeit"]; //Überprüfung der Daten //$spendername kann ein beliebiger String sein, sollte aber nicht leer sein if($spenderName == "") { $hack = true; $feld = "Name"; } //für Adresse gilt selbiges if($adresse == "") { $hack = true; $feld = "Adresse"; } //Betrag muss Ganze Zahl zwischen 5 und 100 if(!preg_match("/^\d*[05]$/", $betrag)) { $hack = true; $feld = "Betrag"; } if($betrag < 5 || $betrag > 100) { $hack = true; $feld = "Betrag"; } //Kartentyp Visa oder Mastercard switch ($kartenTyp) { case "Visa": break; case "Masercard": break; default: $hack=true; $feld="Kartentyp"; } //Kartennummer 15 oder 16 Ziffern ohne Leerzeichen oder Sonderzeichen if(!preg_match("/^(\d[\s\-]?){15,16}$/", $kreditKarte)) { $hack = true; $feld = "Kartennummer"; } //Ablaufdatum ersten zwei zwischen 01und12 die dritte 1oder2 und die vierte zwischen 11und20 // Wie soll das Datum aussehen?? if(!preg_match("/^(\d{2})[1,2][11-20]$/", $ablaufDatum, $match)) { $hack = true; $feld = "Ablaufdatum 1"; } else { if($match[1] < 1 || $match[1] > 12) { $hack = true; $feld = "Ablaufdatum"; } } //Checkbox leer, on oder gehackt if($oeffentlich != "" && $oeffentlich != "on") { $hack = true; $feld = "öffentliche Spende"; } //Ausgabezeit muss eine ganze Zahl sein if(!preg_match("/^\d+$/", $ausgabeZeit)) { $hack = true; $feld = "ausgabeZeit"; } //Wurde ein Foto verschickt if($_FILES["spenderFoto"]["size"] > 0) { $foto = true; // Fehler in Regex: '^' passt nicht, da nicht am Anfang suchen, und '(' vergessen preg_match("/(\.\w+)$/", $_FILES["spenderFoto"]["name"], $match); $typ = $match[1]; //es sind nur Bilddateien erlaubt, damit keine Skripte eingeschmuggelt werden können // Tippfehler bei strtolower(): if(in_array(strtolower($typ), array(".gif", ".bmp", ".jpg", ".jpeg"))) { $dateiName = uniqid() . $typ; // leeren String übergeben sinnlos -> ist Standard in uniqid() // zerlegen mit Regex ungeeignet; replace generell unpassend (wieso soll der Pfad ersetzt werden?) //$bildPfad = preg_replace("/\/[^\/]+$/", "", $_SERVER["SCRIPT_FILENAME"]) . "/Bilder/"; // besser mit: $bildPfad = dirname($_SERVER["SCRIPT_FILENAME"]); copy($_FILES["spenderfoto"]["tmp_name"], $bildPfad . "/Bilder/" . $dateiName); } } else { $foto = false; } //Fehlermeldung anzeigen if($hack) { ?> <html> <head> <!-- wir wollen zu unseren Benutzern doch nett sein ;-) --> <title>Fehler bei der Eingabe</title> </head> <body> <h1>Eingabefehler</h1> Ihre Eingabe im Feld <b><?php echo $feld; ?></b> war inkorrekt. </body> </html> <?php // exit() nicht nötig -> else ist sauberer } //Platzhalter für Skrpt zur Datenverarbeitung // Fehlt da was? //Daten zur Bestätigung an den Benutzer ausgeben (Kommentar war auserhaulb des php-Tags!) else // Wenn kein Fehler aufgetreten ist, und nur DANN soll das Ergebnis ausgegeben werden! { ?> <html> <head> <!-- Wieso Fehler ?! --> <title>Eingabefehler</title> </head> <body> <h1>Liebe(r)<?php echo $spenderName; ?></h1> <p> Haben sie vielen Dank für Ihre Spende über <?php echo $betrag; ?>€. Eine Spendenquittung schicken wir an Ihre Adresse: </p> <p> <b><?php //echo stripslashes(preg_replace("/\r?\n/","<br>", $adresse)); // '/' im Regex vergessen! // nl2br-Methode ist besser geiegnet: echo nl2br($adresse); ?></b> </p> <p> Die Spende wird in einem <?php echo $spendenRhytmus; ?> Rhytmus von Ihrer <b><?php echo $kartenTyp; ?>-Kreditkarte mit Nummer: </p> <p> <b><?php echo $kreditKarte; ?></b> gültig bis <b><?php echo $ablaufDatum; ?></b> abgebucht </p> <p>Karteninhaber ist <?php echo $kartenInhaber; // Achtung: falschen Variablen-Namen verwendet! ?></p> <!-- Was soll das hier? --> <?php // } ?> <p> Wir nehmen zur Kenntnis, dass wir Ihren Namen <?php // Achtung: Leerzeichen im PHP-Tag! if ($oeffentlich == "") { echo "nicht"; // Strichpunkt vergessen! } ?> veröffentlichen dürfen. </p> <p> Sie haben <?php echo (time()-$ausgabeZeit); ?> Sekunden zum ausfüllen unseres Formulars gebraucht. </p> </body> </html> <?php } // else-Zweig schließen ?>
EDIT:
Hab' den Dateiupload vergessen. Ist jetzt auch korrigiert.
Beitrag zuletzt geändert: 30.1.2011 15:09:30 von metalmachine -
Du fragst das Datum so ab:
<b>Ablaufdatum <i>(Fromat: TT.MM.JJ ??)</i>:</b>
Erstmal gibt es beim Kreditkarten-Ablaufdatum keinen Tag, sondern nur Monat und Jahr.
Zweitens empfehle ich dir die Auswahl per HTML-Select zu machen.
Also ein Select von 01 bis 12 für den Monat, und eins mit 2011 bis z.b. 2030 für das Jahr.
Dann hättest du schonmal eine einheitliche Ausgabe und müsstest nicht sowas wie 3/12 umständlich auswerten.
Dann die Auswertung:
//Ablaufdatum ersten zwei zwischen 01und12 die dritte 1oder2 und die vierte zwischen 11und20
die dritte 1 oder 2?
die vierte zwischen 11 und 20?
hä?
Mach es am besten wie oben beschrieben mit Select.
Ansonsten nimm gleich die letzten 4 Ziffern und prüfe ob es zwischen 2011 und 2020 liegt.
Das war jetzt der einzige Fehler der mir auffiel.
EDIT:
Sorry habe gerade gesehen dass der o.g. Fehler in deinem Script garnicht auftritt sondern nur in der korrektur über mir.
Beitrag zuletzt geändert: 30.1.2011 21:37:00 von eu-b99 -
wow, vielen dank!
allerdings stehe ich vor einem kleinen problem und zwar löscht es mir die eingaben im formular, wenn ich auf "abschicken" drücke.
what can i do? -
Du könntest zum Beispiel das Textfeld so schreiben:
<?php echo "<input type='text' name='feld' value=$feld />"; ?>
Beim auslesen empfehle ich dann, die Variablen der Auslese denen der Value-Variable anzupassen. Nun bleibt bei mir der Inhalt erhalten.
Bei der Auslese empfehle ich außerdem die verwendung von:
$feld = htmlspecialchars(trim($_POST["feld"]));
Diese Funktionen "entschärfen" potenziell gefährliche Eingaben. -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage