验证表格不起作用

时间:2016-01-26 19:53:57

标签: php forms

我的表单工作正常,但现在我的表单有问题:即使表单正确完整也没有发送邮件,如果输入不正确则没有错误信息(例如地址邮件或电话号码或分钟。输入名称的长度)。

主机的(最后一个)PHP版本是5.6.10。

拜托,有人可以帮帮我吗? THX。

表单代码:

<?php session_start(); ?>
<!DOCTYPE....>

<head>
...
</head>

<body>
    ...
    ...

    <?php include 'scripts/contact.php'; ?>

     <form action="Contact.php" method="post" accept-charset="UTF-8">
      <table id="formular">
       <tr>
        <td><label for="nume">Nume:&nbsp;<span style="color: red"><sup>*</sup></span>&nbsp;</label></td>
        <td><input type="text" name="nume" id="nume" maxlenght="20" value="<?php echo $_POST['nume']; ?>" /></td>
        <td><span class="err"><?php if(isset($errors['nume'])&&$error) { print $errors['nume']; } ?></span></td>
       </tr>

       <tr>
        <td><label for="prenume">Prenume:&nbsp;<span style="color: red"><sup>*</sup></span>&nbsp;</label></td>
        <td><input type="text" name="prenume" id="prenume" maxlenght="20" value="<?php echo $_POST['prenume']; ?>" /></td>
        <td><span class="err"><?php if(isset($errors['prenume'])&&$error) { print $errors['prenume']; } ?></span></td>
       </tr>

       <tr>
        <td><label for="telefon">Telefon:&nbsp;<span style="color: red"><sup>*</sup></span>&nbsp;</label></td>
        <td><input type="text" name="tel" id="tel" maxlenght="20" value="<?php echo $_POST['tel']; ?>" /></td>
        <td><span class="err"><?php if(isset($errors['tel'])&&$error) { print $errors['tel']; } ?></span></td>
       </tr>

       <tr>
        <td><label for="email">Email:&nbsp;<span style="color: red"><sup>*</sup></span>&nbsp;</td>
        <td><input type="text" name="email" id="email" maxlength="50" value="<?php echo $_POST['email']; ?>" /></label></td>
        <td><span class="err"><?php if(isset($errors['email'])&&$error) { print $errors['email']; } ?></span></td>
       </tr>

 <tr>
        <td><label for="mesaj">Mesaj:&nbsp;<span style="color: red"><sup>*</sup></span>&nbsp;</label></td>
        <td><textarea cols="20" rows="5" wrap="virtual" id="mesaj" name="mesaj" maxlength="150" onkeyup="nrcaractere()"><?php echo $_POST['mesaj']; ?></textarea><br>
        <div id="ramase">150 chars remaining</div>
        <script type="text/javascript">window.ready = nrcaractere();</script></td>
        <td><span class="err"><?php if(isset($errors['mesaj'])&&$error) { print $errors['mesaj']; } ?></span></td>
       </tr>

  <tr>
        <td></td> 
        <td align="center">
         <button type="submit" name="trimite" />Trimite</button>
         <button type="button" name="reset" onClick="sterge()" />Reset</button></td>
        <td></td>
       </tr>
      </table>
     </form>
...
...

和验证脚本:

<?php
 if (isset($_POST['trimite']))
 { $error = FALSE;

 if (empty($_POST['nume'])) {
   $errors['nume']='&nbsp;Mandatory';
   $error = TRUE;
 }
 else {       
   if (!preg_match('/^[a-zA-Z]{1,}$/',$_POST['nume'])) {
      $errors['nume']='&nbsp;Only letters';
      $error = TRUE;
   } 
   else {           
      if (strlen($_POST['nume'])<3) {
         $errors['nume']='&nbsp;Too short. Min. 3 chars';
         $error = TRUE;
      }
      else {
         $errors['nume']='<img src=/images/ok.jpg>';
      }
    }
  }

 if (empty($_POST['prenume'])) {
   $errors['prenume']='&nbsp;Mandatory';
   $error = TRUE;
 }
 else {       
   if (!preg_match('/^[a-zA-Z]{1,}$/',$_POST['prenume'])) {
      $errors['prenume']='&nbsp;Only letters';
      $error = TRUE;
   } 
   else {           
      if (strlen($_POST['prenume'])<3) {
         $errors['prenume']='&nbsp;Too short. Min. 3 chars';
         $error = TRUE;
       }
       else {
           $errors['prenume']='<img src=/images/ok.jpg>';
       }
   }
 }

 if (empty($_POST['tel'])) {
   $errors['tel']='&nbsp;Mandatory';
   $error = TRUE;
 }
 else {       
   if ( !preg_match('/^[0-9]{4}[\s.]{0,1}[0-9]{3}[\s.]{0,1}[0-9]{3}$/', $_POST['tel']) && !preg_match('/^[0-9]{3}[\s.]{0,1}[0-9]{3}[\s.]{0,1}[0-9]{2}[\s.]{0,1}[0-9]{2}$/', $_POST['tel']) && ($_POST['tel'] != '-')) {
     $errors['tel']='&nbsp;Mask: 021.021.02.01 or 0740.123.456 or -';
     $error = TRUE;
   }
   else {
     $errors['tel']='<img src=/images/ok.jpg>';
   }
 }

 if (empty($_POST['email'])) {
   $errors['email']='&nbsp;Mandatory';
   $error = TRUE;
 }
 else {       
   if (!preg_match('/^[a-z0-9&\'\.\-_\+]+@[a-z0-9\-]+\.([a-z0-9\-]+\.)*+[a-z]{2}/is', $_POST['email'])) {
     $errors['email']='&nbsp;Invalid address';
     $error = TRUE;
   }
   else {
       $errors['email']='<img src=/images/ok.jpg>';
   }
 }

 if (empty($_POST['mesaj'])) {
   $errors['mesaj']='&nbsp;Mandatory';
   $error = TRUE;
 }
 else {       
   if (strlen($_POST['mesaj'])<15) {
      $errors['mesaj']='&nbsp;Too short. Min. 15 chars';
      $error = TRUE;
   }
   else {
      if (strlen($_POST['mesaj'])>150) {
        $errors['mesaj']='&nbsp;Too long. Max. 150 chars';
        $error = TRUE;
      }
      else {
         $errors['mesaj']='<img src=/images/ok.jpg>';
      }
    }
 }

 if (!$error) {
  $destinatar = "my_address@yahoo.com";
  $subject = "Site message";
  $body = 'Nume: '.$_POST['nume'].'
  <br>
  Prenume: '.$_POST['prenume'].'
  <br>
  Telefon: '.$_POST['tel'].'
  <br>
  Email: '.$_POST['email'].'
  <br><br>
  Mesaj: '.$_POST['mesaj'];
  $headers .= 'MIME-Version: 1.0' . "\r\n";
  $headers .= 'Content-type: text/html; charset=UTF-8' . "\r\n";

  if (mail($destinatar,$subject,$body,$headers)) {
     echo '<script type="text/javascript">alert("Message sent!")</script>';
     unset($_POST);
  }
  else {
     echo '<script type="text/javascript">alert("Not sent. Try again!")</script>';
  }
 }
}

 $_SESSION['s']=$s;
 ?>

PS。请原谅我糟糕的英语。

2 个答案:

答案 0 :(得分:1)

听起来你有两个问题,一个是验证,一个是发送电子邮件。首先解决最容易的问题:首先找出你的邮件设置是否正确 - php可以正常发送电子邮件,还是你的代码有问题?我使用以下php脚本告诉我服务器是否正确设置了外发电子邮件:

<?php 
    ini_set( 'display_errors', 1 );
    error_reporting( E_ALL );
    $from = "<YOUR EMAIL>";
    $to = "<YOUR EMAIL>";
    $subject = "PHP Mail Test script";
    $message = "This is a test to check the PHP Mail functionality";
    $headers = "From:" . $from;
    mail($to,$subject,$message, $headers);
    echo "Test email sent";
?>

它不起作用,你需要配置服务器让php发送电子邮件。我喜欢使用ssmtp守护进程来简化向SMTP服务器发送电子邮件的信息。

至于你的验证码,很难遵循。您是否考虑过使用验证库?您甚至可以使用原始HTML5 - 请参阅此处:http://www.the-art-of-web.com/html/html5-form-validation/

但是如果你真的想使用自己的php验证器,我个人会写下面的内容:

<?php 
$validation_elements = array(
    'nume' => function() {
        if (!isset($_POST['nume'])) return 'You must enter your nume';
        if (!preg_match('/^[a-zA-Z]{1,}$/',$_POST['nume']) return 'Your nume can only be letters.;'
        return false;
    },
    'prenume' => function() {
        if (!isset($_POST['Mandatory'])) return 'Your prenume is mandatory';
        if (!preg_match('/^[a-zA-Z]{1,}$/',$_POST['prenume'])) return "Your presume can only consist of letters";
        if (strlen($_POST['prenume'])<3) return "Your presume is too short.";   
        return false;
    }, 
    'tel' => function() {
        if (!isset($_POST['tel']) return false; // in this example tel is not mandatory but must match the following rule if it is present:
        if ( !preg_match('/^[0-9]{4}[\s.]{0,1}[0-9]{3}[\s.]{0,1}[0-9]{3}$/', $_POST['tel']) && !preg_match('/^[0-9]{3}[\s.]{0,1}[0-9]{3}[\s.]{0,1}[0-9]{2}[\s.]{0,1}[0-9]{2}$/', $_POST['tel']) && ($_POST['tel'] != '-')) return '&nbsp;Mask: 021.021.02.01 or 0740.123.456 or -';     
        return false;  
    },
    'email' => function() {
        if (!isset($_POST['email'])) return 'Your email is mandatory';
        if (!preg_match('/^[a-z0-9&\'\.\-_\+]+@[a-z0-9\-]+\.([a-z0-9\-]+\.)*+[a-z]{2}/is', $_POST['email'])) return "Your email address must be like something@something.something";
        return false;
    },
    'mesaj' => function() {
        if (!isset($_POST['mesaj'])) return 'Your mesaj is mandatory';  
        if (strlen($_POST['mesaj'])<15) return 'Mesaj too short. Min. 15 chars';
        if (strlen($_POST['mesaj'])>150) return 'Mesaj too long. Max 150 chars.';
        return false;
    }
}

foreach ($validation_elements as $validation_element => $validation_rule) {
    $errors = array();
    if ($validation_rule()) {
        $errors[] = $validation_rule($validation_element);
    }
}
if (!empty($errors)) {
    echo "The form was not completed because: <ul>";
    foreach ($errors as $error) {
        echo "<li>$error</li>";
    }
    echo "</ul>";
} else {
    send_email();
}

理由是验证是一个重复的任务 - 我们接受输入并对其应用规则以查看它是通过还是失败 - 所以我们应该将它包装在一个循环中而不是在程序上进行,如在你的例子中。这种数据的最佳输入是关联数组,其中值是要对数据执行的函数。大多数好的验证库会要求你制定这样的规则:

<?php
 $validation = array(
    'tel' => array(
        'required' => true
     ),
     'mesaj' => array(
         'lessThan' => 150,
         'moreThan' => 15,
         'alphanumeric' => true
      ),
     <etc.>

...但如果你想写一些功能齐全的东西,我会留给你弄清楚如何。

最后,关于验证的一个词 - 这很难,大多数程序员都弄错了。您必须非常仔细地评估有效数据的最意外可能性。

例如:如果我尝试给你写信,我的手机会被视为有效吗?我有一个英国电话号码,其格式可以是+44 xxxxx xxxxx,0xxxxxxxxxx,甚至是(+44)xxxxx xxxxx。

您当前的验证规则可能对您有好处,但O'Shea夫人或O'connor女士能否向您发送消息?那么麦克达夫先生呢?来自新加坡的Ng博士甚至来自美国的Nil教授怎么样?或者对于名字,安·王尔德女士呢?所有这些都是完全有效的名称,即使它们在您的预期用户中不典型。我甚至认识一个名叫Ben X的人,虽然这不是他的注册名称。

祝你好运!

答案 1 :(得分:1)

我之前回答的问题是它不可移植 - 您无法接受该代码并在其他地方使用它。在我之前的回答中,我暗示还有另一种更好的方法来编写验证例程。这里是。它更复杂,但只是稍微如此。

<?php
$validation_rules = array(
    'tel' => array(
        'required' => true
    ),
    'mesaj' => array(
        'lessThan' => 150,
        'moreThan' => 15,
        'alphanumeric' => true
    ), <etc>
);

$errors = array();

/* Note: you could also write each validation rule like this:
function required($input, $is_required) {
    ... <etc>
} 
The function name is the name of the validation rule in the above array.*/

$validation_types = array() {
    'required' => function($input, $is_required) {
        $isset = isset($_POST[$input]));
        return ($is_required && !$isset) ? "$input is required" : false;
    },
    'alphanumeric' => function($input, $is_required) {
        return preg_match('/^[a-zA-Z]{1,}$/',$_POST[$input] ? "$input must be alphanumeric" : false;
    },
    'likeEmail' => function($input, $is_required) {
        return !preg_match('/^[a-z0-9&\'\.\-_\+]+@[a-z0-9\-]+\.([a-z0-9\-]+\.)*+[a-z]{2}/is', $_POST[$input]) ? "$input must be like an email address" : false;
    },
    'lessThan' => function($input, $value) {
        return (!strlen($input) < $value) ? "$input must be less than $value" : false;
    }, <etc>
}
foreach ($validation_rules as $input=>$rules) {
    foreach($rules as $rule=>$params) {
        $validation_failed = $validation_types[$rule]($input, $params);
        // if you used the simpler way of declaring validation rules,use this instead:
        // $validation_failed = $rule($input, $params);
        if ($validation_failed) {
            $errors[] = $validation_failed;
        }
    }
}

这段代码更好的原因是因为它也可以用于其他形式,但阅读起来并不复杂。