【问题标题】:ajax is successful but PHP file can't runajax 成功但 PHP 文件无法运行
【发布时间】:2015-02-12 07:12:46
【问题描述】:

在我的 ajax 中,我可以看到控制台消息,这意味着我的 ajax 已成功将数据发送到 php 文件,但在 php 文件中它接缝没有回显或函数运行。(两个文件都在同一个文件夹中)

index.php 脚本:

     function kk(){  
      $(document).ready(function(){
       var id = document.getElementById('auto').value;
       var datastring = 'id1=' + id;      
        $.ajax({
            type: "POST",
            url: "getHint2.php",
            data: datastring,
            cache: false,
            success: function(data){
              console.log(" ajax success");
            // echo what the server sent back
           }
        });
    });
   }

getHint2.php 文件:

 echo "this is from php file!";
   if(isset($_POST['id1']))
   {
       echo "hello " . $_POST['id1'];
   };

HTML: kk是上面的JS函数。

 <div class="caret">
            <form>
                <input type="text" value="97121243" id="auto">
            </form>           
   </div>
        <input type="button" value="click" onclick="kk();"/>

【问题讨论】:

  • 你能自己运行你的PHP文件吗?
  • @Jay Blanchard,是的 php 文件自己运行。
  • 试试console.log(data);
  • @George Garchagudashvili,我试过了,警告框给了我一个奇怪的结果。就像这样“
  • 也许用 Firebug Net dump 或类似的方式运行它来观察你的 JS 和服务器之间的通信。或者通过一个简单的 HTML 表单和 POST 数据来测试你的 PHP。

标签: javascript php jquery html ajax


【解决方案1】:

在实际的 ajax 调用之前尝试使用console.log(id)。它可能没有发送您认为它正在发送的值。

另外,由于您使用的是 jQuery,您可以简单地这样做:

var id = $('#auto').val();

作为旁注,我强烈建议您研究使用 AJAX 设计和处理表单的 .submit 回调和 .serialize 函数。例如,我会这样实现它:

<div class="caret">
    <form id = "myForm">
        <input type="text" name="id1" value="97121243" id="auto">
        <button type="submit">Submit</button>
    </form>           
</div>

<script>
    $(document).ready(function(){
        $("#myForm").submit(function(e){
            e.preventDefault();
            // Serialize the form data
            var serializedData = $(this).serialize();
            $.ajax({  
              type: "POST",  
              url: "getHint2.php",  
              data: serializedData,
              cache: false,
            }).done(function(data) {      
              console.log(data);
            // echo what the server sent back
           });
        });
    });

</script>

几个cmets:

  1. 我使用了&lt;button&gt; 元素而不是&lt;input&gt; 元素。 &lt;button&gt; 是一种更新、更灵活的按钮实现方式

  2. 我将按钮设置为type=submit,并将其放在&lt;form&gt; 内,因此我不需要手动将按钮的点击链接到ajax 提交。它只是在提交表单时发生!

  3. 通过使用.serialize(),我不需要明确指定要发送的每一个表单变量——我需要做的就是给每个控件一个适当的name 属性!这将使您的代码更易于维护。

  4. 我使用.done(function(data) { 而不是success。注意successdeprecated as of jQuery 1.8

弃用通知:jqXHR.success()、jqXHR.error() 和 jqXHR.complete() 回调自 jQuery 1.8 起已弃用。要为最终删除代码做好准备,请改用 jqXHR.done()、jqXHR.fail() 和 jqXHR.always()。

【讨论】:

  • 我已经试过了,然后当我运行console.log(id)时,我得到了未定义。
  • 你能发布 HTML 吗?
【解决方案2】:

您在 php 文件中第一次回显后错过了分号。

【讨论】:

  • 没错,但同样的问题仍然存在。
  • 当我运行你的代码时,我可以在响应中看到两个回声。
【解决方案3】:

Ajax 调试可能是一头奇怪的野兽。您实际上是在同时调试两个脚本,您只能在运行时看到其中一个(javascript)。有几件事可能对您有所帮助:

为您的请求设置挂起和失败功能。

挂起的函数应该显示某种视觉表示,表明成功或失败的回调尚未触发。它应该被成功和失败回调删除。旋转器之类的东西很常见。

fail 函数应该将信息记录到控制台,以便您在解决错误时查看有关调试请求的信息,并且在生产中可能会被删除或向最终用户显示某种失败消息传递服务器详细信息。

这将告诉您脚本是否认为请求成功。 jQuery 将根据几个因素来确定这一点:

  1. 从服务器收到响应。
  2. 响应匹配随请求传递的预期 Accept 标头(如果您没有定义它们,jQuery 将使用它的默认值)。处理此问题的一种简单方法是始终以 JSON 等通用格式将数据传回,并将接受标头设置为仅接受 json,因此如果您收到错误消息或其他响应,无论输出如何,它都会正确失败。
  3. 传递了有效的响应代码标头。您可以使用 http_response_code(200) 在 php 端设置 response header 以获得成功,如果请求有效,则应在回显页面内容之前的某个时间点传递。

调试涉及一些线索,假设您已经了解了所有这些线索。您可以在 Firebug 或其他浏览器检查器中检查响应标头。

我喜欢做的一件事是在 php 端设置一个会话令牌,然后您可以通过 var_dumping $_SESSION 来检查它,如果 ajax 请求实际上正在访问服务器,它应该会显示出来。如果出现这种情况并且您仍然收到失败响应,您只需要更正响应数据和/或标头,因为 php 正在工作但没有正确传递请求。

如果您只是想获得成功的响应,只需让 php 准确地打印您传递的内容,并在您的成功函数中打印console.log()。如果您想了解有关响应的更多详细信息,请改用 console.dir(),它本质上是用于 javascript 的 var_dump()

【讨论】:

    【解决方案4】:

    对于您的数据字符串,请尝试:

    var datastring = {id1: id};
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-17
      • 1970-01-01
      • 2017-09-29
      • 1970-01-01
      • 2019-08-25
      相关资源
      最近更新 更多