ajax是成功的,但PHP文件可以';t运行


ajax is successful but PHP file can't run

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

在实际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。注意,success在jQuery 1.8:中已弃用

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

php文件中第一个回显后缺少分号。

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

为您的请求设置挂起和失败函数。

挂起的函数应该显示某种视觉表示,表示成功或失败的回调尚未启动。成功和失败回调都应该删除它。像旋转器这样的东西很常见。

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

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

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

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

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

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

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

var datastring = {id1: id};