ajax成功但PHP文件无法运行

时间:2015-02-11 19:12:52

标签: javascript php jquery html ajax

在我的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();"/>

4 个答案:

答案 0 :(得分:1)

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

此外,由于您使用的是jQuery,因此您可以执行以下操作:

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

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

<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>

一些评论:

  1. 我使用了<button>元素而不是<input>元素。 <button>是一种更新,更灵活的按钮实现方式

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

  3. 通过使用.serialize(),我不需要显式指定我要发送的每个表单变量 - 我需要做的就是为每个控件赋予适当的name属性!这将使您的代码更容易维护。

  4. 我使用.done(function(data) {代替success。请注意,successdeprecated as of jQuery 1.8

  5.   

    弃用注意:自jQuery 1.8起,不推荐使用jqXHR.success(),jqXHR.error()和jqXHR.complete()回调。要准备最终删除的代码,请改用jqXHR.done(),jqXHR.fail()和jqXHR.always()。

答案 1 :(得分:0)

你的php文件中第一个echo之后你错过了分号。

答案 2 :(得分:0)

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

var datastring = {id1: id};

答案 3 :(得分:0)

Ajax调试可能是一个奇怪的野兽。您实际上是在同时调试两个脚本,其中只有一个可以在运行时看到(javascript)。有一些事情可以帮到你:

为您的请求设置待处理和失败功能。

挂起函数应该显示某种可视化表示形式,表示成功或失败的回调尚未触发。应该通过成功和失败回调删除它。像旋转器这样的东西很常见。

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

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

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

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

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

    如果您只是想获得一个成功的回复,那么只需让php打印出您传递给它的内容,并在成功函数中使用console.log()。如果您想了解有关回复的更详细信息,请使用console.dir()代替javascript实际上var_dump()