Formular barrierefrei
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
adresse
angeben
anhang
betreff
code
date
dateiname
domain
eingabe
fehler
feld
formular
header
post
stil
string
teilnehmer
text
transfer
type
-
Hallo,
hab in letzter Zeit viel im Forum "PHP & MySQL" nachgefragt. Grund dafür ist ein privates Formular, dass einige nicht gängige Zusätze (unter gängig meine ich, dass ich nicht wusste wie es geht^^) enthält. Ich danke allen, die mir geholfen haben und möchte es jetzt mal für die anderen posten.
Es handelt sich um drei PHP-Seiten (mit Apache):
1. Man gibt eine Teilnehmerzahl ein.
2. Das eigentliche Formular mit Feldern für die Teilnehmer (laut Anzahl) und einem Feld für die E-Post Adresse.
3. Ausgabe in der Seite, Speichern als Excel, Verschicken der Excel per E-Mail
Die Skripte können natürlich erweitert und angepasst werden.
Fehler bitte posten. Hilft mir auch.
Sollte aber alles funktionieren
anzahl.php:
<?php //session_start zur einmaligen Eingabe. Wird in jeder folgenden Seite auch gestartet session_start(); $id = session_id(); //Eingabe Teilnehmerzahl echo "<form method='post' action='formular.php'>"; echo "<table border='1'>"; echo " <tr>"; echo " <td>Teilnehmer insgesamt:</td>"; echo " <td><input type='text' name='teilnehmeranzahl'></td>"; echo " </tr>"; echo " <tr>"; echo " <td align='center' colspan='2'><input type='submit' value='Abschicken'></td>"; echo " </tr>"; echo "</table>"; echo "</form>"; ?>
formular.php:
<?php //session_start (wie in jedem PHP) session_start(); //Überprüfung von welcher Seite man kommt (Falls man von bestaetigung.php kommt wird die Variable Teilnehmeranzahl nicht überschrieben) $referer = $_SERVER['HTTP_REFERER']; if ( $referer != "http://localhost/formular/bestaetigung.php" ) // WICHTIG: richtige URL angeben { $_SESSION[teilnehmeranzahl] = $_POST[teilnehmeranzahl]; } //Teilnehmerzahl überprüfen if ($_SESSION[teilnehmeranzahl] == "" or $_SESSION[teilnehmeranzahl] > 10 or $_SESSION[teilnehmeranzahl] == 0) //Leeres Feld, 0 verboten, bis 10 Teilnehmer { echo "<p align='center'><font size='6'color='red'>Bitte richtige Teilnehmeranzahl eingeben. Über 10 Teilnehmer verboten!<br><a href='anzahl.php'>Zurück</a></font></p>"; exit; } //Das eigentliche Formular echo "<br><h1>Bitte Felder ausfüllen:</h1><br><br>"; echo "<form method='post' action='bestaetigung.php'>"; echo "<table border='1'>"; echo "<tr>"; for ($i=1; $i <= $_SESSION[teilnehmeranzahl]; $i++) //Schleife für Teilnehmer-Eingabe { $a = "teilnehmer".$i; $b = "alter".$i; echo "<tr><td>Teilnehmer $i:</td><td><input type='text' name='teilnehmer$i' value='".$_SESSION[$a]."'></td>"; echo "<td>Alter:</td><td><input type='text' name='alter$i' value='".$_SESSION[$b]."'></td></tr>"; } echo "</tr>"; echo "<tr>"; echo "<td>E-Post:</td>"; echo "<td colspan='3'><input type='text' name='epost' size='40' value='".$_SESSION[epost]."'></td>"; echo "</tr>"; echo "<tr>"; echo "<td colspan='4' align='center'><input type='submit' value='Bestätigen' size='40'></td>"; echo "</tr>"; echo "</table>"; echo "</form>"; ?>
bestaetigung.php:
<?php //session_start (wie in jedem PHP) session_start(); //Variablen deklarieren $timestamp = time(); $akttag = date("d",$timestamp); $aktmonat = date("m",$timestamp); $aktjahr = date("Y",$timestamp); $_SESSION[epost] = $_POST[epost]; for($i=1; $i <= $_SESSION[teilnehmeranzahl]; $i++) { $a = "teilnehmer".$i; $b = "alter".$i; $_SESSION[$a] = $_POST[$a]; $_SESSION[$b] = $_POST[$b]; } //Variablen überprüfen for($i=1; $i <= $_SESSION[teilnehmeranzahl]; $i++) { $a = "teilnehmer".$i; $b = "alter".$i; if ($_SESSION[$a] == "" or !preg_match("/^[0-9]{1,}$/",$_SESSION[$b])) //Feld Alter eine Zahl? { echo "<p align='center'><font size='6'color='red'>Bitte alle Felder ausfüllen.<br><a href='formular.php'>Zurück</a></font></p>"; exit; } } if (!ereg("^([a-zA-Z0-9\.\_\-]+)@([a-zA-Z0-9\.\-]+\.[A-Za-z][A-Za-z]+)$", $_SESSION[epost])) //E-Mail gültig? { echo "<p align='center'><font size='6'color='red'>Bitte alle Felder ausfüllen.<br><a href='formular.php'>Zurück</a></font></p>"; exit; } //Ausgabe in der Seite echo "<br><br>Sie haben folgende Angaben gemacht:<br><br>"; echo "<table border='1'><colgroup><col width='100'><col width='150'><col width='100'><col width='50'></colgroup>"; for($i=1; $i <= $_SESSION[teilnehmeranzahl]; $i++) { $a = "teilnehmer".$i; $b = "alter".$i; echo "<tr><td>Teilnehmer ".$i.":</td><td>".$_SESSION[$a]."</td><td>Alter:</td><td>".$_SESSION[$b]."</td></tr>"; } echo "<tr><td>E-Post:</td><td colspan='3'>".$_SESSION[epost]."</td></tr>"; echo "</table>"; //Ausgabe in Excel-Datei $dateihandle1 = fopen($_SESSION[teilnehmer1]."_".$akttag.$aktmonat.$aktjahr.".xls","w"); fwrite($dateihandle1, "<table><colgroup><col width='100'><col width='150'><col width='100'><col width='50'></colgroup>"); fwrite($dateihandle1, "<tr><td></td></tr><tr><td colspan='4' align='center'>Formular</td></tr>"); fwrite($dateihandle1, "<tr><td></td></tr>"); for($i=1; $i <= $_SESSION[teilnehmeranzahl]; $i++) { $a = "teilnehmer".$i; $b = "alter".$i; fwrite($dateihandle1, "<tr><td style='border: 1px solid Black;'>Teilnehmer".$i.":</td><td style='border: 1px solid Black;'>".$_SESSION[$a]."</td><td style='border: 1px solid Black;'>Alter:</td><td style='border: 1px solid Black;'>".$_SESSION[$b]."</td></tr>"); } fwrite($dateihandle1, "<tr><td style='border: 1px solid Black;'>E-Post:</td><td colspan='3' style='border: 1px solid Black;'>".$_SESSION[epost]."</td></tr>"); fwrite($dateihandle1, "</table>"); //E-Mail mit Anhang der Excel-Datei (Geht nicht bei virtuellem PHP-Server (localhost)) $Empfaenger = "empfaenger@domain.de"; //WICHTIG: richtige Empfaenger E-Mail Adresse eingeben $Betreff = "Formular"; //Betreff $DateinameMail = $_SESSION[teilnehmer1]."_".$akttag.$aktmonat.$aktjahr.".xls"; $h = fopen($_SESSION[teilnehmer1]."_".$akttag.$aktmonat.$aktjahr.".xls", 'rb'); $filecontents = fread($h, filesize($_SESSION[teilnehmer1]."_".$akttag.$aktmonat.$aktjahr.".xls")); $Trenner = md5(uniqid(time())); $Header = "From: absender@domain.de\n"; //WICHTIG: richtige Absender E-Mail Adresse eingeben $Header .= "MIME-Version: 1.0\n"; $Header .= "Content-Type: multipart/mixed; boundary=$Trenner\n"; $text = "Anmeldung von ".$_SESSION[teilnehmer1]." im Anhang zu finden\n"; //E-Mail Text $text .= "--$Trenner\n"; $text .= "Content-Type: text/plain\n"; $text .= "Content-Transfer-Encoding: 8bit\n\n"; $text .= $text."\n"; $text .= "--$Trenner\n"; $text .= "Content-Type: application/msexcel; name=$DateinameMail\n"; $text .= "Content-Transfer-Encoding: base64\n"; $text .= "Content-Disposition: attachment; ". "filename=$DateinameMail\n\n"; $text .= chunk_split(base64_encode($filecontents)); $text .= "\n"; $text .= "--$Trenner--"; mail($Empfaenger, $Betreff, $text, $Header); ?>
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Hi,
ich hab mir dein Script angeschaut und denke du kannst noch einiges an deinem Stil verbessern.
Da du wohl noch nicht viel Erfahrung hast, ist das auch in Ordnung.
Es sind so Sachen wie "Warum erst etwas in eine Variable speichern ?" oder warum so viele "echos" wenn man Strings mit dem Punkt-Operator verbinden kann (.) in JS zb ist es ein (+).
Ich habe deinen Code etwas angepasst. Da ich gerade auf der Arbeit bin, habe ich ihn nicht getestet.
ZUdem habe ich einen Stil verwendet, den man Shorttags nennt. Eig kein schöner Stil für diese Anwendung,
aber man kann Synthaxhighlightning benutzen, welches man mit "echo" nicht mehr hat.
Du hast hier 3 Datein verwendet, mit meinem Code benötigst du nur eine. Formulare können nicht 2 mal abgeschickt werden,
da ein Timestamp (hiddenfeld) mitgesendet und in eine SESSION gespeichert wird.
Außerdem hab ich die Namen in den Formularen angepasst.
Der Titel lautet "Formular barrierefrei", dass ist so nicht ganz richtig.
Ich habe noch legend label fieldset etc
Die Fehler werden hier jetzt in ein Array geschrieben, damit sie schön gesammelt werden könne,
villeicht hätte man auch einen Try/Catch block machen können, aber
das erschien mir ein wenig überzogen.
Um rauszufinden ob es sich bei einem Wert um eine zahl handelt benutze "is_int($wert)" oder "ctype_digit()" versuche $wert==" " zu vermeiden,
!empty() bzw. isset()sind hier besser.
D
Wenn du Strings in Variablen speicherst, dann schau bitte, dass man die strings öfter verwenden muss.
Wenn der String lediglich in der nächsten Zeile benötigt wird, versuch den Wert dort direkt einzuschreiben.
Ein Formular das kein action="" hat schickt die Daten automatisch an die eigene Datei, ich habe mir angewöhnt <?=$_SERVER["PHP_SELF"]?> zu benutzen.
Wenn du date() benutzt, dann brauchst du nicht immer den $timestamp eintragen, der steht da unsichtbar als standardwert drin.
Du kannst statt date("d").date("m").date("Y") auch einfach date("dmY"); schreiben.
(hab ich net gemacht aber egal..)
Schau dir die Array Funktionen auf php.net an, damit kann man sich sehr viele IF-Abfragen sparen.
Hier ist auch schon der Code:
<?php session_start(); $referer = $_SERVER['HTTP_REFERER']; if(($_POST["stamp"]!=$_SESSION["stamp"] || empty($_SESSION["stamp"])) && empty($_SESSION["stamp"])) { $_SESSION["teilnehmeranzahl"] = $_POST["teilnehmeranzahl"]; $_SESSION["stamp"]==$_POST["stamp"]; } if(!empty($_POST["stamp2"]) && $_POST["stamp2"]!=$_SESSION["stamp2"]) { $_SESSION["stamp2"] = $_POST["stamp2"]; foreach($_POST["data"] as $value) if(empty($value["name"]) || !is_int($value["alter"])) array_push($error["second"]["empty"],"Bitte alle Felder ausfüllen!"); if (!ereg("^([a-zA-Z0-9\.\_\-]+)@([a-zA-Z0-9\.\-]+\.[A-Za-z][A-Za-z]+)$", $_SESSION[epost])) array_push($error["second"]["email"],"Bitte eine gültige E-Mail angeben!"); } ?> <?if(empty($_SESSION["teilnehmeranzahl"]) ||):?> <?if($_SESSION["teilnehmeranzahl"]>10 || $_SESSION["teilnehmeranzahl"]==0):?> <div class="error"> Bitte korrekte Teilnehmeranzahl angeben! </div> <?endif;?> <form method="post" action="<?=$_SERVER["PHP_SELF"]?>"> <fieldset> <legend>Teilnehmeranzahl angeben</legend> <div> <label for="anzahl">Teilnehmer insgesamt:</label> <input type="text" name="teilnehmeranzahl" id="anzahl" maxlength="20"/> </div> <input type="hidden" name="stamp" value="<?=time()?>"/> <input type="submit" name="senden" value="Abschicken"/> </fieldset> </form> <?elseif(!empty($_SESSION["teilnehmeranzahl"]) || $_SESSION["stamp2"] || !empty($error["second"])):?> <h1>Bitte Felder ausfüllen:</h1> <?if(!empty($error["second"])):?> <ul class="error"> <?foreach($error["second"] as $key => $value?> <li><?=$key`?>.) <?=$value?></li> <?endforeach;?> </ul> <?endif;?> <form method="post" action="<?=$_SERVER["PHP_SELF"]?>"> <fieldset> <legend>Details angeben</legend> <?for($i=1;$i<=$_SESSION["teilnehmeranzahl"];$i++):?> <div> <label for="name<?=$i?>">Teilnehmen <?=$i?>:</label> <input type="text" name="data[][name]" id="name<?=$i?>" value="<?=$_POST["data"][$i]["name"]?>" maxlength="50"/> </div> <div> <label for="alter<?=$i?>">Alter:</label> <input type="text" name="data[][alter]" id="alter<?=$i?>" value="<?=$_POST["data"][$i]["alter"]?>" maxlength="20"/> </div> <?endfor;?> <div> <label for="epost">E-Post:</label> <input type="text" name="epost" value="<?=$_POST["epost"]?>" maxlength="60"/> </div> <input type="hidden" name="stamp2" value="<?=time()?>"/> <input type="submit" name="senden" value="Bestätigen"/> </fieldset> </form> <?endif;?> <?if(empty($error["second"]) && empty($error["first"])):?> <h1>Sie haben folgende Angaben gemacht</h1> <? $eingabe = "<table> <colgroup> <col width=\"100\"/> <col width=\"100\"/> <col width=\"100\"/> <col width=\"100\"/> </colgroup> <tbody> "; foreach($_POST["data"] as $value) $eingabe .="<tr> <td>Teilnehmer</td> <td>".$value["name"]."</td> <td>Alter</td> <td>".$value[alter]."</td> </tr>"; $eingabe .= "<tr> <td>E-Post:</td> <td colspan=\"3\">".$_POST[epost]."</td> </tr> </tbody> </table> "; echo $eingabe; $Dateiname = $_POST["data"][0]["name"]."_".date("d").date("m").date("Y").".xls"; $dateihandle1 = fopen($Dateiname,"w"); fwrite($dateihandle1,$eingabe); $Empfaenger = "empfaenger@domain.de"; //WICHTIG: richtige Empfaenger E-Mail Adresse eingeben $Betreff = "Formular"; //Betreff $h = fopen($Dateiname, 'rb'); $filecontents = fread($h, filesize($Dateiname)); $Trenner = md5(uniqid(time())); $Header = "From: absender@domain.de\n"; //WICHTIG: richtige Absender E-Mail Adresse eingeben $Header .= "MIME-Version: 1.0\n"; $Header .= "Content-Type: multipart/mixed; boundary=".$Trenner."\n"; $text = "Anmeldung von ".$_POST["data"][0]["name"]." im Anhang zu finden\n"; //E-Mail Text $text .= "--".$Trenner."\n"; $text .= "Content-Type: text/plain\n"; $text .= "Content-Transfer-Encoding: 8bit\n\n"; $text .= $text."\n"; $text .= "--$Trenner\n"; $text .= "Content-Type: application/msexcel; name=".$Dateiname."\n"; $text .= "Content-Transfer-Encoding: base64\n"; $text .= "Content-Disposition: attachment; ". "filename=$DateinameMail\n\n"; $text .= chunk_split(base64_encode($filecontents)); $text .= "\n"; $text .= "--".$Trenner."--"; mail($Empfaenger, $Betreff, $text, $Header); ?> <?endif;?>
Haut mich net wenns Fehler hat, ich denke die findet ihr auch so raus
Grüsse
Color
Beitrag zuletzt geändert: 25.2.2010 15:56:56 von color -
WOW,
Ein dickes LOB an color!!!
Hallo,
habe mal dein Code ausprobiert, der geht aber nicht richtig. Bekomme irgendwie was falsches angezeigt.
Ich danke dir vielmals für deine Ausarbeitung. Habe gedacht mein Code wäre schon nahezu perfekt...^^. Aber das ist jetzt mal wirklich viel besser! Außerdem danke ich dir für die vielen Tips. Werde mich mal dran setzen und das Ganze lernen.
Ich hoffe mein Code ist aber nicht sooo falsch, der hat zumindest mal das gemacht, was ich vor hatte.
Die Seite sieht so aus, wenn ich sie öffne:
http://gerwald.lima-city.de/code_color.jpg
Werde versuchen den Code richtig zu machen, habe aber nicht das Know-How und deshalb wird das betimmt noch dauern. -
Mist ._.
hab das Ganze jetzt mit Eclipse nochmal bearbeitet.
Das zeigt mir wo gewisse leichtsinnsfehler sind.
Da fehleten ein paar klammern etc etc ...
<?php session_start(); $referer = $_SERVER['HTTP_REFERER']; if(($_POST["stamp"]!=$_SESSION["stamp"] || empty($_SESSION["stamp"])) && empty($_SESSION["stamp"])) { $_SESSION["teilnehmeranzahl"] = $_POST["teilnehmeranzahl"]; $_SESSION["stamp"]==$_POST["stamp"]; } if(!empty($_POST["stamp2"]) && $_POST["stamp2"]!=$_SESSION["stamp2"]) { $_SESSION["stamp2"] = $_POST["stamp2"]; foreach($_POST["data"] as $value) if(empty($value["name"]) || !is_int($value["alter"])) array_push($error["second"]["empty"],"Bitte alle Felder ausfüllen!"); if (!ereg("^([a-zA-Z0-9\.\_\-]+)@([a-zA-Z0-9\.\-]+\.[A-Za-z][A-Za-z]+)$", $_SESSION[epost])) array_push($error["second"]["email"],"Bitte eine gültige E-Mail angeben!"); } ?> <?if(empty($_SESSION["teilnehmeranzahl"])):?> <?if($_SESSION["teilnehmeranzahl"]>10 || $_SESSION["teilnehmeranzahl"]==0):?> <div class="error"> Bitte korrekte Teilnehmeranzahl angeben! </div> <?endif;?> <form method="post" action="<?=$_SERVER["PHP_SELF"]?>"> <fieldset> <legend>Teilnehmeranzahl angeben</legend> <div> <label for="anzahl">Teilnehmer insgesamt:</label> <input type="text" name="teilnehmeranzahl" id="anzahl" maxlength="20"/> </div> <input type="hidden" name="stamp" value="<?=time()?>"/> <input type="submit" name="senden" value="Abschicken"/> </fieldset> </form> <?elseif(!empty($_SESSION["teilnehmeranzahl"]) || $_SESSION["stamp2"] || !empty($error["second"])):?> <h1>Bitte Felder ausfüllen:</h1> <?if(!empty($error["second"])):?> <ul class="error"> <?foreach($error["second"] as $key => $value):?> <li><?=$key?>.) <?=$value?></li> <?endforeach;?> </ul> <?endif;?> <form method="post" action="<?=$_SERVER["PHP_SELF"]?>"> <fieldset> <legend>Details angeben</legend> <?for($i=1;$i<=$_SESSION["teilnehmeranzahl"];$i++):?> <div> <label for="name<?=$i?>">Teilnehmen <?=$i?>:</label> <input type="text" name="data[][name]" id="name<?=$i?>" value="<?=$_POST["data"][$i]["name"]?>" maxlength="50"/> </div> <div> <label for="alter<?=$i?>">Alter:</label> <input type="text" name="data[][alter]" id="alter<?=$i?>" value="<?=$_POST["data"][$i]["alter"]?>" maxlength="20"/> </div> <?endfor;?> <div> <label for="epost">E-Post:</label> <input type="text" name="epost" value="<?=$_POST["epost"]?>" maxlength="60"/> </div> <input type="hidden" name="stamp2" value="<?=time()?>"/> <input type="submit" name="senden" value="Bestätigen"/> </fieldset> </form> <?endif;?> <?if(empty($error["second"]) && empty($error["first"])):?> <h1>Sie haben folgende Angaben gemacht</h1> <? $eingabe = "<table> <colgroup> <col width=\"100\"/> <col width=\"100\"/> <col width=\"100\"/> <col width=\"100\"/> </colgroup> <tbody> "; foreach($_POST["data"] as $value) $eingabe .="<tr> <td>Teilnehmer</td> <td>".$value["name"]."</td> <td>Alter</td> <td>".$value[alter]."</td> </tr>"; $eingabe .= "<tr> <td>E-Post:</td> <td colspan=\"3\">".$_POST[epost]."</td> </tr> </tbody> </table> "; echo $eingabe; $Dateiname = $_POST["data"][0]["name"]."_".date("d").date("m").date("Y").".xls"; $dateihandle1 = fopen($Dateiname,"w"); fwrite($dateihandle1,$eingabe); $Empfaenger = "empfaenger@domain.de"; //WICHTIG: richtige Empfaenger E-Mail Adresse eingeben $Betreff = "Formular"; //Betreff $h = fopen($Dateiname, 'rb'); $filecontents = fread($h, filesize($Dateiname)); $Trenner = md5(uniqid(time())); $Header = "From: absender@domain.de\n"; //WICHTIG: richtige Absender E-Mail Adresse eingeben $Header .= "MIME-Version: 1.0\n"; $Header .= "Content-Type: multipart/mixed; boundary=".$Trenner."\n"; $text = "Anmeldung von ".$_POST["data"][0]["name"]." im Anhang zu finden\n"; //E-Mail Text $text .= "--".$Trenner."\n"; $text .= "Content-Type: text/plain\n"; $text .= "Content-Transfer-Encoding: 8bit\n\n"; $text .= $text."\n"; $text .= "--$Trenner\n"; $text .= "Content-Type: application/msexcel; name=".$Dateiname."\n"; $text .= "Content-Transfer-Encoding: base64\n"; $text .= "Content-Disposition: attachment; ". "filename=$DateinameMail\n\n"; $text .= chunk_split(base64_encode($filecontents)); $text .= "\n"; $text .= "--".$Trenner."--"; mail($Empfaenger, $Betreff, $text, $Header); ?> <?endif;?>
Jetzt müsste es gehn :/
Dein Code war nicht falsch, eben nur etwas nachhilfebedürftig
Grüsse
Color -
Hmm...
wenn ich diesen Code aufrufe kommt iwie das Gleiche wie mit dem Alten. Habs versucht zu verbessern... war das ganz kaputt^^.
Ich werd wohl noch 1 bis 2 .... Jahre brauchen bis ich das hinkriege.
Vielleicht kannst du nochma drüber schauen. -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage