Knut: Validierung aus PHP-Form entfernen/einschränken

Hallo,
ich habe bisher noch nicht mit PHP gearbeitet und bin nun im Rahmen einer Einarbeitung in ein CMS auf PHP gestoßen. Vom Lesen ist es sehr verständlich, aber bei der Programmierung habe ich noch Probleme/Angst.

Ich will eine Kontaktformular einbauen, dieses darf allerdings nicht aus PHP/HTML bestehen, sondern nur aus aus PHP heraus erstellten HTML.
In meinem Beispiel werden leider alle Kontaktfelder validiert, bzw. als Pflichtfelder ausgegeben. Das würde ich gerne ändern (nur Vorname und Nachname als Pflichtfeld).

Könnte mir jemand eine Hilfe geben, wie ich das mache?

Die Lösung müßte in folgendem Bereich liegen:

if($action=='send'){foreach($fields as $i){initvar($i);if($GLOBALS[$i]=='')$e.='<li>Sie haben folgendes Feld vergessen '.$i;else $mailbody.=$i.': '.$GLOBALS[$i]."\n";}if(!(eregi("[1]+(.[_a-z0-9-]+)*@[_a-z0-9-]+(.[_a-z0-9-]+)*(.([a-z]{2,4}))+$",$email)))$e.='<li>'.$tx['error']['mustwritemail'].'.';else if($e==''){initvar('txtarea');$mailbody.=$txtarea;if(!(@mail($reciever,'Mailform from '.sv('SERVER_NAME'),$mailbody.$recievermessage,"From: ".$email."\r\n"."X-Remote: ".sv('REMOTE_ADDR')."\r\n")))$e.=tag('li').$tx['mailform']['notsend'];else {$t=tag('p').$tx['mailform']['send'].tag('/p');if(!(@mail($email,'Copy of mailform from '.sv('SERVER_NAME'),$mailbody.$message,"From: ".$reciever."\r\n"."X-Remote: ".sv('REMOTE_ADDR')."\r\n")))$e.='<li>'.$tx['mailform']['recieptnotsend'];}}}if($t==''||$e!=''){
$t='<form action="'.$sn.'" method="post"><input type="hidden" name="selected" value="'.$u[$s].'"><input type="hidden" name="action" value="send"><table cellpadding="5" cellspacing="0" border="0" width="400">';

In diesem Bereich müßte die Validierung stattfinden. Ich bin mir nicht sicher, wie ich die Entfernen kann (einfach das Foreach raus? Wie würde ich das Gabeln, dass nur bestimmte Felder validiert werden?).
Ich als Newbie würde mich wirklich freuen, wenn mir jemand kurz helfen könnte.

Gesamter Code:
$reciever='mail@email.de';
$message="\n\nDiese E-Mail wurde von Email.de versendet.\n\n";
$recievermessage="\n\nDiese E-Mail wurde automatisch generiert";
// Define your field names and add extra lines for select options
// Use _ for spaces
$fields=array('Vorname:','Nachname:','Strasse:','PLZ:','Stadt:','Telefon:','E-Mail:');
$select['adress']=array('none','elephant','cow','tiger');
$tx['mailform']['recieptnotsend']="Could not send reciept.";
// DO NOT CHANGE CODE BELOW!
function mtr($tk){if (is_array($GLOBALS['select'][$tk]))$t=select($tk); else $t='<input type="text" class="text" name="'.$tk.'" value="'.$GLOBALS[$tk].'">';
return '<tr><td>* '.ucfirst(preg_replace('/\_/',' ',$tk)).'</td><td>'.$t.'</td></tr>';}
function select($tk){$t='';foreach($GLOBALS['select'][$tk] as $i){$t.='<option value="'.$i.'"';
if($GLOBALS[$tk]==$i)$t.=' selected';
$t.='>'.$i.'</option>';} return '<select class="text" name="'.$tk.'">'.$t.'</select>';}
$t='';$mailbody='';
if($action=='send'){foreach($fields as $i){initvar($i);if($GLOBALS[$i]=='')$e.='<li>Sie haben folgendes Feld vergessen '.$i;else $mailbody.=$i.': '.$GLOBALS[$i]."\n";}if(!(eregi("[2]+(.[_a-z0-9-]+)*@[_a-z0-9-]+(.[_a-z0-9-]+)*(.([a-z]{2,4}))+$",$email)))$e.='<li>'.$tx['error']['mustwritemail'].'.';else if($e==''){initvar('txtarea');$mailbody.=$txtarea;if(!(@mail($reciever,'Mailform from '.sv('SERVER_NAME'),$mailbody.$recievermessage,"From: ".$email."\r\n"."X-Remote: ".sv('REMOTE_ADDR')."\r\n")))$e.=tag('li').$tx['mailform']['notsend'];else {$t=tag('p').$tx['mailform']['send'].tag('/p');if(!(@mail($email,'Copy of mailform from '.sv('SERVER_NAME'),$mailbody.$message,"From: ".$reciever."\r\n"."X-Remote: ".sv('REMOTE_ADDR')."\r\n")))$e.='<li>'.$tx['mailform']['recieptnotsend'];}}}if($t==''||$e!=''){
$t='<form action="'.$sn.'" method="post"><input type="hidden" name="selected" value="'.$u[$s].'"><input type="hidden" name="action" value="send"><table cellpadding="5" cellspacing="0" border="0" width="400">';
foreach($fields as $field)$t.=mtr($field);
$t.='<tr><td colspan="2">Deine Nachricht:<br><t'.'extarea rows="12" cols="80" name="t'.'xtarea"></t'.'extarea></td></tr>';
$t.='</table><p><input type="submit" class="submit" value="'.$tx['mailform']['sendbutton'].'"></p></form>'; }
$output=preg_replace('/<textarea.*textarea>/is',$t,$c[$s]);#

Leider sieht der Code sehr unübersichtlich aus, da ich nicht weiss, wo ich Zeilenumbrüche machen kann. Wie kann ich PHP aufbrechen, ohne das die Logik gestört wird?


  1. _a-z0-9- ↩︎

  2. _a-z0-9- ↩︎

  1. Hallo,

    $reciever='mail@email.de';
    $message="\n\nDiese E-Mail wurde von Email.de versendet.\n\n";
    $recievermessage="\n\nDiese E-Mail wurde automatisch generiert";
    // Define your field names and add extra lines for select options
    // Use _ for spaces
    $fields=array('Vorname:','Nachname:','Strasse:','PLZ:','Stadt:','Telefon:','E-Mail:');

    $valfields=array('Vorname:','Nachname:');

    $select['adress']=array('none','elephant','cow','tiger');
    $tx['mailform']['recieptnotsend']="Could not send reciept.";
    // DO NOT CHANGE CODE BELOW!
    function mtr($tk){if (is_array($GLOBALS['select'][$tk]))$t=select($tk); else $t='<input type="text" class="text" name="'.$tk.'" value="'.$GLOBALS[$tk].'">';
    return '<tr><td>* '.ucfirst(preg_replace('/\_/',' ',$tk)).'</td><td>'.$t.'</td></tr>';}
    function select($tk){$t='';foreach($GLOBALS['select'][$tk] as $i){$t.='<option value="'.$i.'"';
    if($GLOBALS[$tk]==$i)$t.=' selected';
    $t.='>'.$i.'</option>';} return '<select class="text" name="'.$tk.'">'.$t.'</select>';}
    $t='';$mailbody='';
    if($action=='send'){

    foreach($valfields as $i){

    // etc.

    Es bleibt anzumerken, dass das Script mit register_globals=On nur funktioniert und gleich beider Regex-Erweiterungen PHPs benötigt. Kurz: Es ist bei einer Standardkonfiguration (bei der Installation, aber auch zur Laufzeit PHPs) nicht protabel.

    Gruß aus Berlin!
    eddi

  2. Hallo Knut,

    Könnte mir jemand eine Hilfe geben, wie ich das mache?

      
    $t='';  
    $mailbody='';  
      
    if($action == 'send') {  
      foreach($fields as $i){  
        initvar($i);  
        if($GLOBALS[$i] == '') {  
          $e .= '<li>Sie haben folgendes Feld vergessen '.$i;  
        } else {  
          $mailbody .= $i.': '.$GLOBALS[$i]."\n";  
        }  
      }  
      if(  
        !(eregi(  
          "^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[_a-z0-9-]+(\.[_a-z0-9-]+)*(\.([a-z]{2,4}))+$",  
          $email)  
        )  
      ) {  
        $e .= '<li>'.$tx['error']['mustwritemail'].'.';  
      } else if($e == ''){  
        initvar('txtarea');  
        $mailbody .= $txtarea;  
        if(  
          !(@mail(  
            $reciever,  
            'Mailform from '.sv('SERVER_NAME'),  
            $mailbody.$recievermessage,  
            "From: ".$email."\r\n"."X-Remote: ".sv('REMOTE_ADDR')."\r\n")  
           )  
        ) {  
          $e .= tag('li').$tx['mailform']['notsend'];  
        } else {  
          $t = tag('p').$tx['mailform']['send'].tag('/p');  
        }  
        if(  
          !(@mail(  
            $email,  
            'Copy of mailform from '.sv('SERVER_NAME'),  
            $mailbody.$message,  
            "From: ".$reciever."\r\n"."X-Remote: ".sv('REMOTE_ADDR')."\r\n")  
          )  
        ) {  
          $e .= '<li>'.$tx['mailform']['recieptnotsend'];  
        }  
      }  
    }  
      
    if($t == '' || $e != '') {  
      $t = '<form action="'.$sn.'" method="post">  
              <input type="hidden" name="selected" value="'.$u[$s].'">  
              <input type="hidden" name="action" value="send">  
              <table cellpadding="5" cellspacing="0" border="0" width="400">';  
      foreach($fields as $field) {  
        $t .= mtr($field);  
      }  
      $t .= '<tr>  
               <td colspan="2">Deine Nachricht:<br>  
                 <t'.'extarea rows="12" cols="80" name="t'.'xtarea"></t'.'extarea>  
               </td>  
             </tr>';  
      $t .= '</table>  
             <p><input type="submit" class="submit" value="'.$tx['mailform']['sendbutton'].'"></p>  
             </form>';  
    }  
      
    $output = preg_replace('/<textarea.*textarea>/is',$t,$c[$s]);  
    
    

    Leider sieht der Code sehr unübersichtlich aus, da ich nicht weiss, wo ich Zeilenumbrüche machen kann. Wie kann ich PHP aufbrechen, ohne das die Logik gestört wird?

    Nun, ich habe mich mal darauf beschränkt den Code übersichtlicher zu formatieren, vielleicht hilft Dir das ja schon weiter. Ich hoffe, ich hab in dem Wirrwarr nichts falsch eingerückt.
    Manches hab ich ein wenig eigentümlich eingerückt (vor allem die mail()-Aufrufe als Bedingungen), das dient nur dazu, daß auch diese Teile ein wenig übersichtlicher sind und nicht durch Zeilenumbrüche in der Darstellung hier im Forum wieder unübersichtlich werden. Auch der HTML-Kram ist nicht ganz sauber eingerückt, sondern nur auf die "direkte Umgebung" bezogen.
    Ich hoffe jedoch, daß es zumindest lesbarer ist, als es davor war.

    Bei PHP kann man, soweit ich das beurteilen kann, fast überall beliebig viele Leerzeichen und Umbrüche setzen, ohne daß es den Parser stört (zumindest, wenn man konsequent Klammern setzt). Ich versuche mich im Allgemeinen mehr oder weniger strikt an die pear Coding Standards zu halten.

    In diesem Bereich müßte die Validierung stattfinden. Ich bin mir nicht sicher, wie ich die Entfernen kann (einfach das Foreach raus? Wie würde ich das Gabeln, dass nur bestimmte Felder validiert werden?).

    Ja, das erste foreach ist mit Sicherheit ein guter Punkt anzufangen ... aber ehrlich gesagt: bevor ich da was ändern würde, würde ich es neu schreiben.
    Als Basis dafür kann ja zum Beispiel auch der gut dokumentierte SELFHTML Artikel: Einfacher PHP-Formmailer von Patrick Canterino dienen.

    Grüße aus Stockholm,
    Götz

    --
    Losung für Dienstag, 15. April 2008
    Träufelt, ihr Himmel, von oben, und ihr Wolken, regnet Gerechtigkeit! Die Erde tue sich auf und bringe Heil, und Gerechtigkeit wachse mit auf! Ich, der HERR, habe es geschaffen. (Jesaja 45,8)
    Jage nach der Gerechtigkeit, dem Glauben, der Liebe, dem Frieden mit allen, die den Herrn anrufen aus reinem Herzen. (2.Timotheus 2,22)
    (zur aktuellen Losung)