【问题标题】:FILTER_VALIDATE_EMAIL and unique email check in db not workingFILTER_VALIDATE_EMAIL 和数据库中的唯一电子邮件检查不起作用
【发布时间】:2013-08-11 17:34:34
【问题描述】:

我对 php 场景还很陌生,但是由于我一直在寻找几个小时来寻找这段代码可能有什么问题,所以我不知所措。由于某种原因,数据库中的 FILTER_VALIDATE_EMAIL 和唯一电子邮件检查不起作用,它们被完全跳过。我知道这一点,因为当提交表单时,它会在最后一个 catch(PDOExceptions $ex) 上踢出一个错误(未显示,但在下面的最后一个代码块之后),而不是设置为之前显示的任何其他错误(此处显示)。在尝试将表单数据插入数据库之前,不会发生(或显示)错误。由于电子邮件索引是唯一的,因此不允许重复插入。所以查询无法运行并且die()'s。我正在尝试发布电子邮件无效或已在表单本身上使用但没有die() 的消息。

首先,我设置了提交空输入的条件,并对所有其他输入重复错误处理,如“fname”所示。

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

        if(empty($_POST['fname']) ||
          empty($_POST['lname']) ||
          empty($_POST['email']) ||
          empty($_POST['password']))
        {
            if(empty($_POST['fname'])) 
        { 
            $fnamerr = "<font color=\"red\">Please enter your first name</font>";
        }

然后我验证 !empty:

    } 
    else if (!empty($_POST['fname']) &&
       !empty($_POST['lname']) &&
       !empty($_POST['email']) &&
       !empty($_POST['password']))  
    { 

        if(!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) 
        { 
            $emailerr = "<font color=\"red\">Please enter a valid email address</font>";
        }       

        $query = " 
            SELECT 
                1 
            FROM users 
            WHERE 
                email = :email 
        "; 

        $query_params = array( 
            ':email' => $_POST['email'] 
        ); 

        try 
        { 
            $stmt = $db->prepare($query); 
            $result = $stmt->execute($query_params); 
        }   
        catch(PDOException $ex) 
        { 
            die ("Failed to run query: " . $ex->getMessage());          
        }

        $row = $stmt->fetch(); 

        if($row) 
        { 
            $emailerr = "<font color=\"red\">This email address is already registered</font>";
        }

这段代码有什么问题?或者可能是完全跳过数据库中的 FILTER_VALIDATE_EMAIL 和唯一电子邮件检查的原因? 提前致谢。

【问题讨论】:

  • 我没有看到您试图根据$emailerr 停止脚本,甚至没有将其回显给用户。
  • 迈克。我将$fnamerr 插入到表单输入上方的html 中作为&lt;?php echo $fnamerr;?&gt; 和其他插入到他们自己的(即$emailerr&lt;?php echo $emailerr;?&gt;)。
  • 看来你需要学习一些基本的调试原理。在脚本的关键位置插入echoprint_rvar_dump 的组合,以查看该部分是否真的被执行,如果没有,为什么。也许你在这里的elseif 声明失败了,但我不知道。尝试在它之后回显一些随机字符串。它出现在输出中吗?如果没有,请尝试回显那里使用的各种变量并手动完成逻辑。例如,$_POST['lname'] 可能为空。
  • 谢谢@Mike,我会尝试一下,看看我想出了什么。

标签: php validation email filter email-validation


【解决方案1】:

http://php.net/manual/en/function.filter-var.php 确实返回过滤后的值,所以

$email = filter_var($_POST['email'], FILTER_VALIDATE_EMAIL);
if(false !== $email) {
        $query = " 
            SELECT 
                1 
            FROM users 
            WHERE 
                email = :email 
        "; 

        $query_params = array( 
            ':email' => $email 
        ); 

        try 
        { 
            $stmt = $db->prepare($query); 
            $result = $stmt->execute($query_params); 
        }   
        catch(PDOException $ex) 
        { 
            die ("Failed to run query: " . $ex->getMessage());          
        }

        $row = $stmt->fetch(); 

        if($row)         { 
            $emailerr = "<font color=\"red\">This email address is already registered</font>";
        }
        else {
            // ...insert record...
        }
}
else    { 
            $emailerr = "<font color=\"red\">Please enter a valid email address</font>";
}

【讨论】:

  • @cske...感谢您的帖子,但我将其插入,验证仍然没有发生。就像以前一样跳过整个块。
【解决方案2】:

我终于想通了,对于任何可能正在寻找相同信息的人。

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

        if(empty($_POST['fname']) ||
           empty($_POST['lname']) ||
           empty($_POST['email']) ||
           empty($_POST['password']))
        { 
            if(empty($_POST['fname'])) 
            { 
                $fnamerr = "<font color=\"red\">Please enter your first name</font>";
            }

再一次,我对姓氏、电子邮件和密码做了同样的事情,如果它们是空的。那么:

        } else if(!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) 
        { 
            $emailerr = "<font color=\"red\">Please enter a valid email address</font>";
            $submitted_firstname = htmlentities($_POST['fname'], ENT_QUOTES, 'UTF-8');
            $submitted_lastname = htmlentities($_POST['lname'], ENT_QUOTES, 'UTF-8');
            $submitted_email = htmlentities($_POST['email'], ENT_QUOTES, 'UTF-8');
        } else if (!empty($_POST['fname']) &&
               !empty($_POST['lname']) &&
               !empty($_POST['email']) &&
               !empty($_POST['password']))
        {                                       
            $query = " 
                SELECT 
                    1 
                FROM users 
                WHERE 
                    email = :email 
            "; 

            $query_params = array( 
                ':email' => $_POST['email'] 
            ); 

            try 
            { 
                $stmt = $db->prepare($query); 
                $result = $stmt->execute($query_params); 
            }   
            catch(PDOException $ex) 
            { 
                die ("Failed to run query: " . $ex->getMessage());
            }

            $row = $stmt->fetch(); 

            if ($row) 
            { 
                $emailerr2 = "<font color=\"red\">This email address is already registered</font>";
                $submitted_firstname = htmlentities($_POST['fname'], ENT_QUOTES, 'UTF-8');
                $submitted_lastname = htmlentities($_POST['lname'], ENT_QUOTES, 'UTF-8');
                $submitted_email = htmlentities($_POST['email'], ENT_QUOTES, 'UTF-8');

            } else
            {

然后我运行代码以将信息插入到 db 表中。这很好用。希望没有其他事情发生。感谢 cmets 和帮助。

【讨论】:

    猜你喜欢
    • 2017-12-15
    • 2014-01-05
    • 2015-11-17
    • 2017-11-17
    • 1970-01-01
    • 1970-01-01
    • 2019-02-25
    • 2018-07-31
    • 2012-11-22
    相关资源
    最近更新 更多