【问题标题】:email validation 'Error : Strict Standards' or any best way to validate email?电子邮件验证“错误:严格标准”或任何验证电子邮件的最佳方法?
【发布时间】:2013-12-05 11:44:04
【问题描述】:

我有一个可以验证电子邮件地址的脚本,并且我认为这是在表单提交时验证电子邮件的唯一解决方案?我最终得到了这个脚本

<?php
if(isset($_POST['email']))

{
    $email = $_POST['email'];  

    if (strpos($email, '@')) 
    {
        $first = end(explode("@", $email));

        if(checkdnsrr($first, 'MX')) 
        {
            $validate = 'Valid email.';
        }
        else 
        {
            $validate = 'Invalid email.';   
        }
    }
    else
    {
        $validate = 'Invalid email.';
    }

    echo $validate;
}
?>  
<form method="POST">
<input type="text" name="email">
<input type="submit" value="submit">
</form>

它运行正常,但我有这个错误Strict standards: Only variables should be passed by reference。

有什么办法可以去掉ERROR?并改进代码?到目前为止,是否有任何电子邮件验证真正验证电子邮件?

【问题讨论】:

  • 你的问题解决了吗
  • 你的 PHP 版本是多少?
  • 你需要帮助吗
  • 将您的问题简要发送到我的电子邮件@venkatakrishnabtech@gmail.com
  • 您为什么要进行自己的验证?为什么不使用像 LeadSpend.com 这样的第三方验证 API?

标签: php email-validation strict


【解决方案1】:

你可以这样做

<?php
if(isset($_POST['email']))

{
    $email = $_POST['email'];  

    if (strpos($email, '@')) 
    {
        $first = explode("@", $email);

        $validate = checkdnsrr($first[1], 'MX') ? 'Valid email.' : 'Invalid email.';
    }
    else
    {
        $validate = 'Invalid email.';
    }

    echo $validate;
}
?>  
<form method="POST">
<input type="text" name="email">
<input type="submit" value="submit">
</form>

【讨论】:

    【解决方案2】:

    你可以试试下面的例子

     <?php
    
        function domain_exists($email, $record = 'MX'){
            list($user, $domain) = explode('@', $email);
            return checkdnsrr($domain, $record);
        }
        if(isset($_POST['email'])){
            $email = $_POST['email'];
            if(domain_exists($email)) {
                echo('This MX records exists; I will accept this email as valid.');
            }
            else {
                echo('No MX record exists;  Invalid email.');
            }
        }
        ?>
    

    但是,这并不可靠。 dns 通常不可靠。这是尽力而为。提供无效域也可能需要很长时间,因此如果有人用大量无效/离线域敲击您的脚本,您需要考虑系统的潜在 DOS。

    事实上(鲜为人知),域甚至不需要有 MX 记录来传递邮件。邮件传递应该回退到使用指定主机的 A 记录。这些天这可能不会真正发生,但理论上..

    这样您就可以使用 preg match 来验证您的电子邮件,例如

     //$email = "abc123@lolhaha"; // Invalid email address 
        $email = "somebody@somesite.com"; // Valid email address 
    
        $regex = '/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$/'; 
    
        if (preg_match($regex, $email)) {
             echo $email . " is a valid email. We can accept it.";
        } else { 
             echo $email . " is an invalid email. Please try again.";
        } 
    

    【讨论】:

    • 正则表达式无法验证电子邮件它只是验证输入。
    【解决方案3】:

    原因是,end(explode("@", $email)); 函数导致错误,end() 需要参考,您可以尝试使用以下代码,

    $EmailArray = explode("@", $email);
    $first = end($EmailArray);
    

    mixed end ( array &amp;$array )

    end() 将数组的内部指针前进到最后一个元素,并返回它的值。

    参数:

    数组:这个数组是通过引用传递的,因为它被函数修改了。这意味着您必须传递一个实变量而不是返回数组的函数,因为只有实变量可以通过引用传递。

    返回值: 返回最后一个元素的值,如果是空数组则返回 FALSE。

    【讨论】:

    • $EmailArray = explode("@", $email); $first = end($EmailArray);我已经更新了我的答案,你可以试试
    • 似乎您需要将它传递给另一个变量。是的,这有助于我的问题:)
    • 您需要帮助吗?
    猜你喜欢
    • 1970-01-01
    • 2014-12-19
    • 2014-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-02
    相关资源
    最近更新 更多