为什么对 php 的简单 ajax 调用会表现出如此奇怪的行为?

Why does a simple ajax call to php exhibit such strange behavior?

我正在调用一个 jQuery 移动表单到一个简单的 PHP 邮件文件。我已经使用从 ajax 调用传递的相同数据测试了 PHP 文件,它工作得很好。但是,当使用 ajax 时,不会发送电子邮件并且地址栏包含查询字符串。我真的需要更多的眼睛看这个,因为我的眼睛似乎永远交叉。

表格摘录

        <form id="hipaa-form" name="hipaa-form" autocomplete="on" data-ajax="false">
            <p data-role="fieldcontain">
                <label for="name">Name:<span class="smallred">*</span></label>
                <input type="text" name="name" id="name" autofocus required placeholder="Full Name">
            </p>
            <p>
                <input type="submit" name="send" id="send" style="cursor:pointer" value="Submit">
            </p>
        </form>

JavaScript

$('#hipaa-form').on('submit', function (e) {
    var data = $(this).serialize();
    $.ajax({
        type: "GET",
        url: email.php,
        data: data,
        dataType: "text",
        success: function (result) { alert(result); },
        error: function(xhr, status, error) {
                  var err = eval("(" + xhr.responseText + ")");
                  alert("Error: " + +err.Message)
               }
    });
});

注意数据变量设置正确,是地址栏中结束的字符串。来自成功功能的警报显示了整个网页,但再次没有发送电子邮件。我尝试在 PHP 中设置自定义错误处理程序,但它们根本没有帮助。

PHP

    $body = "Full Name: " . $_GET["name"] . "\r\n";
    $body = $body . "email: " . $_GET["email"] . "\r\n";
    $body = $body . "Phone: " . $_GET["phone"] . "\r\n";
    $body = $body . "website: " . $_GET["Website-URL"] . "\r\n";
    $body = $body . "app. type: " . $_GET["pgm-type"] . "\r\n";
    $body = $body . "uses DB: " . $_GET["uses-db"] . "\r\n";
    $body = $body . "saves data: " . $_GET["stores-patient-data"] . "\r\n";
    $body = $body . "db vendor: " . $_GET["database-vendor"] . "\r\n";
    if (isset($_GET["db-other"]))
        $body = $body . "other db: " . $_GET["db-other"] . "\r\n";

    $to = "contact.us@bunkerhill.com";
    $subject = "HIPAA Form Submission";

    mail($to, $subject, $body, "From: contact.us@text.bunkerhill.com");
    echo "Form Submitted"

?>

我的测试站点是:http://test.bunkerhill.com/

TIA

您需要使用 preventDefault() 阻止提交表单;

$('#hipaa-form').on('submit', function (e) {
    e.preventDefault();
...
}

您的 ajax 请求应使用带有 GET 的查询字符串参数,或者更改为 type: "POST" 并调整您的 PHP 以使用 $_POST

示例:

type: "GET",
url: "page.php?foo=x&bar=y"

type: "POST",
url: "page.php",
data: data

最后,我有点担心这个包含 HIPAA 信息的示例。您可能想考虑一种方法,将信息存储在安全位置并简单地发送一封电子邮件,上面写着 "Hey a new message is available. Click here to authenticate against our secure system to read it." 并不是说​​您的方法有任何绝对错误,但感觉有额外的 HIPAA 相关责任考虑。

url 参数在你的 Ajax 定义中应该是 'email.php' 在引号中,所以改变

url: email.php

url: 'email.php'

否则它只是向 http://test.bunkerhill.com/ 发送调用,而您的 PHP 代码发送电子邮件根本不会被调用 :)