Javascript 尽管php脚本成功,Ajax POST仍会触发错误函数事件
我正在使用jquery、jquery mobile和html构建一个使用phonegap的移动应用程序 使用ajax在服务器中调用php脚本,效果良好;更新、插入数据和发送电子邮件。但是ajax错误函数通常被称为, 使用firebug,返回的是200 ok状态,不知道是什么触发了错误 我搜索了这个问题,并在这里找到了许多建议,比如使用complete()或done()函数代替success()和error(),响应json响应。。。但所有这些解决方案都不走运 一种解决方案是将此头添加到php脚本中Javascript 尽管php脚本成功,Ajax POST仍会触发错误函数事件,javascript,php,jquery,ajax,cordova,Javascript,Php,Jquery,Ajax,Cordova,我正在使用jquery、jquery mobile和html构建一个使用phonegap的移动应用程序 使用ajax在服务器中调用php脚本,效果良好;更新、插入数据和发送电子邮件。但是ajax错误函数通常被称为, 使用firebug,返回的是200 ok状态,不知道是什么触发了错误 我搜索了这个问题,并在这里找到了许多建议,比如使用complete()或done()函数代替success()和error(),响应json响应。。。但所有这些解决方案都不走运 一种解决方案是将此头添加到php脚本
header("Access-Control-Allow-Origin: *");
header解决方案解决了我所有ajax post脚本的问题,但我担心可能存在的安全风险,因为它应该在移动应用程序中运行
此外,当我们需要访问数据库时,添加这样的头是合乎逻辑的,但如果我们有一个调用php邮件函数的联系人表单,并且不会发生数据库更改,那么为什么我们也需要添加该头呢
联系方式
<div data-role="header" data-position="fixed" >
<input type="button" value="Send" name="sendbutton" id="sendbtn" />
<h1>contact us</h1>
<a data-rel="back" data-icon="arrow-r" data-iconpos="notext"></a>
</div>
<div data-role="content" >
<form id="contact-us" >
<input type="text" id="contactName" placeholder="Name" />
<input type="email" id="email" placeholder="Your Email" />
<input type="text" id="subject" placeholder="Message Subject" />
<textarea rows="20" cols="30" id="message" placeholder="Message.." ></textarea>
</form>
</div>
php代码
<?php
if ( isset($_POST['email']) && isset($_POST['contactName']) && isset($_POST['message']) && filter_var($_POST['email'], FILTER_VALIDATE_EMAIL) ) {
$test = "/(content-type|bcc:|cc:|to:)/i";
foreach ( $_POST as $key => $val ) {
if ( preg_match( $test, $val ) ) {
exit;
}
}
mail( "myemail@mydomainname.net", "Contact Form: ".$_POST['contactName']." Title ".$_POST['subject'], $_POST['message'], "From:" . $_POST['email']);
}
?>
该代码发送电子邮件,但始终称为ajax错误函数
除了标题解决方案,还有其他解决方案吗?多谢各位 出现一些未关闭的中断,请尝试以下操作:
$("#sendbtn").click(function(event){
$("#sendbtn").disabled =true;
var postData ="";
if($("#contactName").val().length == 0 ||$("#email").val().length == 0 ||$("#subject").val().length == 0||$("#message").val().length == 0) {
alert("Sorry but some required fields are empty !");
} else {
if (!regex.test($("#email").val())) {
alert("Please check that you write email correctly!");
} else {
postData='contactName=' + $("#contactName").val() + '&email=' + $("#email").val() + '&subject=' + $("#subject").val() + '&message=' + $("#message").val();
}
}
$.ajax({
type: 'POST',
data: postData,
url: 'contact.php',
success: function(){
$('input').not('[type="button"]').val('');
$('textarea').val('');
alert('Message was Sent, Thank you!');
},
error: function ()
{
alert('Sorry, Error occurred ');
$('.error').fadeIn(1000);
}
});
});
首先,我认为,收集postData应该像
$(“#我的表单”)那样代码>
url:'mydomainname.net/services/contact.php'
如果要发布到其他服务器,则url应设置为方案前缀
然而,我担心可能的安全风险
在服务器端,您可以检查域,然后决定是否发送允许的头。Javascript中缺少一些右括号。您在开发人员工具的“网络”选项卡中看到了什么错误?AJAX服务器是否与客户端脚本位于同一域中?然后将域从URL中删除。你是对的,但这只是代码的一部分:)谢谢。这可能是因为服务器没有响应,请尝试回显PHP脚本中的内容谢谢如果我希望脚本接受移动应用程序的呼叫,如何检查域?For.serialize();是的,但它对我不起作用,不知道我在这里已经回答了什么:,请查看。谢谢。如果是另一个域请求,将其添加到允许列表中,这是非常有用的,但是如果是一个跨域加载和发布数据的移动应用程序,如何保护它?如果你的移动应用程序正在向服务器发出一些请求,这不是跨领域的。因为,您的请求是对服务器的直接请求。您应该检查服务器的“X-request-With”(ajax请求)头的可访问性,可能它们被服务器配置拒绝。
$("#sendbtn").click(function(event){
$("#sendbtn").disabled =true;
var postData ="";
if($("#contactName").val().length == 0 ||$("#email").val().length == 0 ||$("#subject").val().length == 0||$("#message").val().length == 0) {
alert("Sorry but some required fields are empty !");
} else {
if (!regex.test($("#email").val())) {
alert("Please check that you write email correctly!");
} else {
postData='contactName=' + $("#contactName").val() + '&email=' + $("#email").val() + '&subject=' + $("#subject").val() + '&message=' + $("#message").val();
}
}
$.ajax({
type: 'POST',
data: postData,
url: 'contact.php',
success: function(){
$('input').not('[type="button"]').val('');
$('textarea').val('');
alert('Message was Sent, Thank you!');
},
error: function ()
{
alert('Sorry, Error occurred ');
$('.error').fadeIn(1000);
}
});
});