【问题标题】:Verify E-Mail with AJAX and PHP使用 AJAX 和 PHP 验证电子邮件
【发布时间】:2014-08-08 20:16:32
【问题描述】:

我想提交我的表单并且 AJAX 调用应该将该数据发送到我的 php 文件。在我的 php 文件中是带有filter_var 的电子邮件验证,如果验证返回 false,则响应应该返回到 Javascript。除了验证部分,它的效果很好。但是每次我想提交并检查它是否是有效的电子邮件时,它都会返回 false 并显示“请输入有效的电子邮件”。如果它是有效或错误的电子邮件地址,则相等。


更新 - 09.08.2014/04:12
现在它基本上可以工作,如果它没有错误消息,我会收到一个问题Cannot read proberty "isError" of null,这是合乎逻辑的。但是不知道如何避免该问题以将其正确传递回javascript。

HTML

<form action="submit.php" id="SubmitForm" method="post">
  <input id="mail" name="mail" type="text" />
 </form>
 <button id="submitAll">
   <span>Submit</span>
 </button>

Javascript

function submit() {
    var $form = $('form#SubmitForm');
    $.post(
    $form.attr('action'),
    $form.serialize(),

    function (data) {
        if (data.isError) {
            $errMsg.empty().text('Please enter a valid email');
        } else {
            document.location.href = "submit.php"
        }
    },'json'); }

PHP

$profileEmail  = $_POST['mail'];
$errorMessages = array();

if(!filter_var($profileEmail, FILTER_VALIDATE_EMAIL)){
    $errorMessages[] = "* Please enter a valid e-mail";
} else {
    $errorMessages[] = "* Valid e-mail";
}

if (!empty($errorMessages)) {
    die(json_encode(array('isError' => true, 'errorMessages' => $errorMessages)));
}

【问题讨论】:

  • 为什么要向服务器发送一个字符串以对其执行模式匹配?这完全可以在 JS 中处理。
  • @Quentin 您在这里已经足够久了,您应该知道有效的电子邮件地址检查非常困难,以至于您无法执行任何简单的客户端匹配。唯一可行的测试是对所提供地址的域名部分执行实际 DNS 查找。
  • 实际上 - 您可以在客户端进行 一个 有效测试 - 地址中是否包含 @。但即使这样也不是万无一失的,因为它必须是本地部分没有引用的地址——"foo@bar"@example.com 实际上是一个合法地址。
  • OP - 只需先尝试一个没有 AJAX 的简单表单 - filter_var 代码 看起来 好的,所以尝试围绕参数传递等进行一些调试,并首先使其正常工作在将 AJAX 及其潜在故障模式引入方程式之前。
  • 我通过 php 验证电子邮件地址的事实是,您可以轻松打开 javascript 和 javascript 验证。

标签: php jquery ajax validation email


【解决方案1】:

您的问题很简单 - 您为输入字段提供了一个 ID (mail),但没有是一个 name,因此序列化不起作用 - 你只是向服务器发送一个空的查询字符串。

你需要:

<input id="mail" name="mail" type="text" />

我总是同时使用名称和 ID,因为表单提交需要前者,但使用后者(更)更容易进行 DOM 操作。

编辑 为避免您在修复上述问题后发现的新问题,只需确保您的脚本始终返回一些有效的 JSON,即使它只是 {}。你已经向服务器请求了一些 JSON - 你必须返回一些。

【讨论】:

    【解决方案2】:

    更新 - 09.08.2014/04:28
    现在它起作用了!我意识到我的if(data.isError) 操作员错了。下面的代码有效。感谢您提供有用的信息来解决问题。 :)


    HTML

    <form action="submit.php" id="SubmitForm" method="post">
        <input id="mail" name="mail" type="text" />
    </form>
    <button id="submitAll">
        <span>Submit</span>
    </button>
    


    Javascript

    function submit() {
        var $form = $('form#SubmitForm');
        $.post(
        $form.attr('action'),
        $form.serialize(),
    
        function (data) {
            if (data && data.isError) {
                $errMsg.empty().text('Please enter a valid email');
            } else {
                document.location.href = "submit.php"
            }
        }, 'json');
    }
    


    PHP

    $profileEmail  = $_POST['mail'];
    $errorMessages = array();
    
    if(!filter_var($profileEmail, FILTER_VALIDATE_EMAIL)){
        $errorMessages[] = "* Please enter a valid e-mail";
    } else {
        $errorMessages[] = "* Valid e-mail";
    }
    
    if (!empty($errorMessages)) {
        die(json_encode(array('isError' => true, 'errorMessages' => $errorMessages)));
    }
    

    【讨论】:

    • 您原来的if 测试工作正常,只要您总是发回一些有效的 JSON,当然您应该这样做。根本问题仍然是您缺少 name 字段。但是,您现在已将其编辑回原始问题 - 这不是它应该在这里工作的方式。
    • 是的,你是对的。根本问题是我的name="mail" 不等于$_POST["submitMail"] 的简单错误,谢谢。我在我的第一个代码片段中删除它,因为我认为这个问题没有必要,我认为$_POST 获得了 ID-Tag 而不是 name-Tag。进一步的问题是,如果 php 返回 null,JSON 会返回对象而不是忽略属性 isError。
    猜你喜欢
    • 2013-09-20
    • 2013-04-24
    • 2010-10-11
    • 2016-02-29
    • 1970-01-01
    • 1970-01-01
    • 2012-11-03
    • 2011-09-25
    相关资源
    最近更新 更多