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>
一些评论:
我使用了
<button>
元素而不是<input>
元素。<button>
是实现按钮的一种更新、更灵活的方式我将按钮设置为
type=submit
,并将其放置在<form>
中,因此不需要手动将按钮的单击链接到ajax提交。它只是在表单提交时发生的!通过使用
.serialize()
,我不需要显式指定要发送的每个表单变量——我所需要做的就是为每个控件提供一个适当的name
属性!这将使您的代码更易于维护。我使用
.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将根据以下几个因素来确定这一点:
- 已从服务器收到响应
- 响应与随请求传递的预期Accept标头匹配(如果您没有定义它们,jQuery将使用它的默认值)。处理这一问题的一个简单方法是始终以JSON等常见格式将数据传回,并将accept标头设置为仅接受JSON,因此,如果您返回错误消息或其他响应,无论输出如何,它都将正确失败
- 传递了有效的响应代码标头。您可以使用
http_response_code(200)
在php端设置成功的响应标头,如果请求有效,则应在回显页面内容之前的某个时间点传递该标头
调试涉及到几个线索,假设您已经涵盖了所有这些。您可以在Firebug或其他浏览器检查器中检查响应标头。
我喜欢做的一件事是在php端设置一个会话令牌,然后您可以通过var_dumping$_session来检查它,如果ajax请求真的到达了服务器,它就会显示出来。如果出现这种情况,并且仍然收到失败响应,则只需要更正响应数据和/或标头,因为php正在工作,但没有正确地将请求传递回。
如果你只是想获得一个成功的响应,只需让php准确地打印你传递的内容,并在成功函数中打印console.log()
即可。如果您想要有关响应的更详细信息,请使用console.dir()
,它本质上是javascript的var_dump()
。
对于您的数据字符串,请尝试:
var datastring = {id1: id};
- 使用压缩的JavaScript文件(不是运行时压缩)
- Javascript运行php文件,然后下载文件
- 从Chrome扩展名中的popup.html文件在background.js文件中运行一个函数
- 如何从“”运行url;.js”;文件
- 如何使用Gmail运行.js文件
- 如何运行从TFS获取项目的windows脚本文件
- 在Node Webkit应用程序中从DOM单击按钮时运行批处理文件
- 是否可以从javascript文件中将量角器作为模块运行
- Meteor发布/订阅无法从服务器文件夹中运行
- 如何显示由ajax调用运行的PHP文件的echo
- 通过Wordpress中的jquery调用运行php文件
- 从JavaScript文件运行Firebug Lite
- 如何在Grunt.js中观察多个文件,但只在更改的文件上运行任务
- 如何在 node.js 中创建和运行文件
- 如何在使用 nsIProcess 运行文件时隐藏命令提示符窗口.bat
- 文件下载完成后运行文件
- 打开程序但不运行文件的HTA页面
- React-只运行文件一旦外部js文件加载(gapi未定义)
- 从终端运行文件代码(启动本地网站)
- 运行文件.未附加的HTML元素的getElementById