【问题标题】:PHP Form validation logic is a little offPHP 表单验证逻辑有点不对劲
【发布时间】:2012-06-01 11:51:30
【问题描述】:

我正在使用 PHP 验证 HTML 表单。我的所有代码都很好,除了消息字段。如果我在消息字段中放了一些东西,而其他字段显示错误,它仍然会提交。但是,如果我在其他字段中输入了一些内容,并且其他字段有错误,它就不会提交,这是正确的。我怀疑这与我的代码的最后一个 if-else 有关。先感谢您。

contact.php
<?php

include 'includes/config.php';
$errors = FALSE;
$displayErrors = NULL;

if (isset($_POST['submit'])) {

$first = $_POST['first'];
$last = $_POST['last'];
$email = $_POST['email'];
$subject = $_POST['subject'];
$message = $_POST['message'];

//Connect to MYSQL Database server
$connect = mysql_connect(DB_HOST, DB_USER, DB_PASS) or die("Could not connect to MYSQL Database.");
$result = mysql_select_db(DB_NAME, $connect) or die("Could not connect to MYSQL table.");

//Clean Data to prevent malicous injections
mysql_real_escape_string(strip_tags(stripcslashes(trim($first))));
mysql_real_escape_string(strip_tags(stripcslashes(trim($last))));
mysql_real_escape_string(strip_tags(stripcslashes(trim($email))));
mysql_real_escape_string(strip_tags(stripcslashes(trim($subject))));
mysql_real_escape_string(strip_tags(stripcslashes(trim($message))));

if (empty($first)) {
    $errors = TRUE;
    $displayErrors .= 'First name is invalid.<br/>';
}
if (empty($last)) {
    $errors = TRUE;
    $displayErrors .= 'Last name is invalid.<br/>';
}
if (empty($email) || !filter_var($email, FILTER_VALIDATE_EMAIL)) {
    $errors = TRUE;
    $displayErrors .= 'Email is invalid.<br/>';
}
if (empty($subject)) {
    $errors = TRUE;
    $displayErrors .= 'Subject is invalid.<br/>';
}
if (empty($message)) {
    $errors = TRUE;
    $displayErrors .= 'Message is invalid.<br/>';
} else {
    $errors = FALSE;
          //Database insertion goes here
    echo 'Form submission successful. Thank you ' . $first . '.';

}

}
?>

【问题讨论】:

  • 我会删除最后一个 else 并做另一个 if ($errors == TRUE) //do something else submit
  • 成功了!谢谢!我知道这是一个小问题哈哈。
  • 是的,简单的新手错误 :) 确保尽可能接受答案
  • mysql_real_escape_string() 没有修改传递的字符串,它返回修改后的字符串,所以所有的调用都是无用的,因为它们对给定的变量没有任何影响。
  • 我应该将它们添加到顶部的变量中,对吧?

标签: php mysql forms validation error-handling


【解决方案1】:

基本上你是说,如果消息不为空,那么$errors=FALSE,但你没有考虑到所有其他字段。

我建议将错误放在一个数组中,例如:

$errors['email'] = true;

然后在最后使用 foreach 检查该数组

【讨论】:

    【解决方案2】:

    试着把else 变成

    if($errors == FALSE) {//just corrected the equality operator
        //Database insertion goes here
        echo 'Form submission successful. Thank you ' . $first . '.'
    }
    

    【讨论】:

    • 这个解决方案也有效!我知道这是一个小问题哈哈哈。非常感谢。
    【解决方案3】:

    在所有这些 if 之前,你应该把 $errors = FALSE。然后,您可以将 if(!$errors){ //database insert here }

    放在代码末尾而不是 else

    【讨论】:

      【解决方案4】:

      让你所有的 ifs else ifs 这样你的最后一个 else 就不会弄乱你的验证。

      【讨论】:

        【解决方案5】:

        首先,Don't use mysql_* functions in new code。它们不再维护and are officially deprecated。看到red box?改为了解prepared statements,并使用PDOMySQLi - this article 将帮助您决定哪个。如果你选择 PDO,here is a good tutorial


        我已经整理了您的逻辑,而不是使用 $error=true 等,您应该构建一个错误数组(包含您的错误文本),然后检查最后是否为空,我还清理了魔术引号问题,这似乎是您的拥有,以及可怕的多个 mysql_real_escape_string,希望对您有所帮助

        contact.php

        <?php
        include 'includes/config.php';
        //Connect to MYSQL Database server
        $connect = mysql_connect(DB_HOST, DB_USER, DB_PASS) or die("Could not connect to MYSQL Database.");
        $result = mysql_select_db(DB_NAME, $connect) or die("Could not connect to MYSQL table.");
        
        $errors = array();
        
        if ($_SERVER['REQUEST_METHOD']=='POST') {
        
            function clean(&$value){
                if (get_magic_quotes_gpc()){
                    $value = mysql_real_escape_string(strip_tags(trim($value)));
                }else{
                    $value = mysql_real_escape_string(trim($value));
                }
            }
            array_walk($_POST,'clean');
        
        
            if (empty($_POST['first'])) {
                $errors['first']= 'First name is invalid.<br/>';
            }else{
                $first = $_POST['first'];
            }
        
            if (empty($_POST['last'])) {
                $errors['last']= 'Last name is invalid<br/>';
            }else{
                $last = $_POST['last'];
            }
        
            if (empty($_POST['email']) || !filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) {
                $errors['email'] = 'Email is invalid.<br/>';
            }else{
                $email = $_POST['email'];
            }
        
            if (empty($_POST['subject'])) {
                $errors['subject']= 'Subject is invalid.<br/>';
            }else{
                $subject = $_POST['subject'];
            }
        
            if (empty($_POST['message'])) {
                $errors['message']= 'Message is invalid.<br/>';
            }else{
                $message = $_POST['messsage'];
            }
        
            if(empty($errors)){
                //Database insertion goes here
                echo 'Form submission successful. Thank you ' . htmlentities($first) . '.';
            }else{
                //Errors, so your have $errors['name'] ect to output
                //so somthing like:
                echo (isset($errors['name'])?$errors['name']:null);
        
            }
        
        }
        ?>
        

        您也许还应该添加一个条件,即该值是最小一定长度,strlen($_POST['first']) &gt; 2 等。

        【讨论】:

          猜你喜欢
          • 2012-10-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-12-25
          • 1970-01-01
          • 2021-08-22
          相关资源
          最近更新 更多