【问题标题】:Why does a simple ajax call to php exhibit such strange behavior?为什么对 php 的简单 ajax 调用会表现出如此奇怪的行为?
【发布时间】:2015-03-06 18:32:57
【问题描述】:

我正在调用一个 jQuery Mobile 表单来访问一个简单的 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

【问题讨论】:

  • 在您的 ajax 调用中添加 return false 以使提交不提交表单,而是 ajax 将提交。 (在 ajax 调用之后)
  • 谢谢。解决了地址栏问题,但电子邮件仍未发送,整个 html 页面显示在成功警报中。
  • 嗯,你实际上是在做alert(result),这就是你的整个 html 页面显示在警报中的原因 :) 来到邮件问题,你检查你的邮件代码是否有效吗?这应该是PHP方面的一些问题
  • 应该用什么代替警报(结果)?我检查了 PHP 端,它工作正常。
  • 您的 PHP 错误日志中有关于电子邮件的任何内容吗?

标签: javascript php jquery ajax jquery-mobile


【解决方案1】:

您需要使用 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 信息的示例。您可能需要考虑一种方法,将信息存储在安全位置,然后简单地发送一封电子邮件,上面写着“嘿,有一条新消息可用。单击此处通过我们的安全系统进行身份验证以阅读它。”并不是说您的方法有任何绝对错误,而是感觉需要考虑额外的 HIPAA 相关责任。

【讨论】:

  • 包含+err.Message) 的行也可能会搞砸,但这不太可能。
  • 谢谢,但这并没有解决问题。电子邮件未发送且成功警报显示整个页面? +1 指出这一点
  • PHP 错误日志中有什么内容吗?我还更新了我的答案以解释 GET 与 POST。
  • 据了解,只有在调用更改服务器状态时才应使用 POST,例如更新数据库。由于我只是发送电子邮件,GET 似乎很合适。
  • POST 和 GET 都可用于更新数据库或发送电子邮件或任何其他操作。查看这篇文章以了解有关差异的更多解释:stackoverflow.com/questions/504947/… 发送敏感信息时,您几乎绝对应该使用 POST。在您的实例中,更改非常小。只需将所有GET 更改为POST
【解决方案2】:

您的 Ajax 定义中的url 参数应该是引号中的“email.php”,因此请更改

url: email.php

url: 'email.php'

如果它只是向http://test.bunkerhill.com/ 发送一个电话,那么你发送电子邮件的 PHP 代码根本不会被调用 :)

【讨论】:

  • 非常感谢。我知道需要一双锐利的眼睛。
  • 很高兴能帮上忙 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-01
  • 1970-01-01
  • 2018-09-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多