我在不同的域上执行。ajax请求,特别是在主域的子域上单击注册表单按钮后,这是代码:
$.ajax({
type: "GET",
url: "http://sub.domain.com/query.php?s="+a,
crossDomain:true,
cache: false,
success: function(html){
alert(html);
},
error:function (xhr, ajaxOptions, thrownError){
alert(xhr.status);
alert(thrownError);
},
statusCode: {
404: function() {
alert('page not found');
}
}
}
在query.php中,我有3个头函数php和一个查询,但当这个页面被调用时,我在数据库中看到2个记录非常奇怪。
query.php:
<?php
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Headers:X-Requested-With');
header("Access-Control-Allow-Methods: GET");
$db = mysql_connect('localhost','usr','pwd') or die("Database error");
mysql_select_db('dbname', $db);
$termine=$_GET['s'];
$dati_arr=explode("|", $termine);
$values = array_values($dati_arr);
$query="INSERT INTO tabella VALUES ('','".implode("','", $values)."')";
if(mysql_query($query)){echo "ok";}
?>
一个查询,但我在数据库中找到2条记录,我找不到错误。
当做跨域ajax时,浏览器可能会做一个所谓的preflight请求——它基本上是用一个请求方法OPTIONS
来查找服务器是否允许跨域请求,哪些http方法被允许等等。如果检查无误,那么它将执行实际的请求(并将记住OPTIONS
请求的结果是什么(受缓存策略的影响),以便下次它不需要这样做。
你的php代码没有区分预飞行请求和实际的"做它"请求,所以插入数据两次。除了发送回跨源报头之外,在采取任何行动之前,您应该检查http方法。顺便说一句,GET
请求有副作用是有点危险的。
您发布的代码都没问题。我认为发布所有html+js代码会更有用