目前我正在开发一个基于ajax的Web应用程序来执行某些XHR。
我选择了CakePHP + jQuery来完成这些工作,除了这个小问题外,它们工作得非常好。
说,我创建一个有效的JSON表单的字符串==> {“test”:“你好世界”}
然后我调用jQuery的ajax方法将其发送到目标php页面:
jQuery.ajax
({
type: 'POST',
cache: false,
async: false,
timeout: 10000,
url : 'http://localhost/method/',
dataType : 'json', //defines expected response datatype
contentType : 'application/json', //defines request datatype
data : { "test" : "hello world"},
success : function(json)
{
//do some stuff here.
}});
以前我尝试过这个带有空数据的ajax函数(即只使用数据:{}因为这是一个POST),它运行得很好;但是,现在我已经将一个json格式的数据添加到HTTP POST中,有没有办法从PHP脚本端引用它?
我试过了:data : { "data" : {"test" : "helloworld"}}
我使用PHP的isset [$ _ POST ['data']进行检查,结果是POST变量'data'未设置。
有人能给我一个解决这个问题的方法吗?非常感谢提前!!!
答案 0 :(得分:4)
这可能就是你所追求的(来自http://www.factsandpeople.com/facts-mainmenu-5/26-html-and-javascript/89-jquery-ajax-json-and-php):
$(document).ready(function(){
var data =
{
"sales": [
{ "firstname" : "John", "lastname" : "Brown" },
{ "firstname" : "Marc", "lastname" : "Johnson" }
] // end of sales array
}
var dataString = JSON.stringify(data);
$.post('simpleformSubmit.php', { data: dataString}, showResult, "text");
});
PHP脚本(发布数据包含json结构):
<?php
$logFile = 'logFile';
$res = json_decode(stripslashes($_POST['data']), true);
echo "sales1_lastname: ".$res['sales'][1]['lastname'];
?>
答案 1 :(得分:1)
看起来网址拼写错误了?
url : 'http://localhost/mehtod/'
而不是
url : 'http://localhost/method/'
有时最小的东西是最烦人的!
答案 2 :(得分:1)
我不确定设置内容类型是否与cake php有任何影响。
http://docs.jquery.com/Ajax/jQuery.ajax#options
将数据发送到服务器时,请使用此内容类型。默认为“application / x-www-form-urlencoded”,对大多数情况都适用。
通过将其设置为 application / json 可能会将其编码为不同,这就是为什么你没有在$ _POST数组中看到它
答案 3 :(得分:0)
数据将以通常与POST请求相关联的键/值格式进入PHP。 jQuery data
值正是jQuery用来创建POST请求的内容......进入PHP $_POST
数组的实际键/值对是你放在data
中的内容。
对于您的代码,您的$_POST['test']
值应为helloworld
。
答案 4 :(得分:0)
data
数组中的每个键/值对都作为POST键/值对发送给PHP。所以在你的情况下:
echo $_POST['test']; // Echos "helloworld"
答案 5 :(得分:0)
来自jQuery文档(http://docs.jquery.com/Ajax/jQuery.ajax#options)的引用:
data - 要发送到服务器的数据。如果不是字符串,它将转换为查询字符串。它附加到GET请求的URL。请参阅processData选项以防止此自动处理。对象必须是键/值对。如果value是一个数组,则jQuery使用相同的键序列化多个值,即{foo:[“bar1”,“bar2”]}变为'&amp; foo = bar1&amp; foo = bar2'。
答案 6 :(得分:0)
仅供参考:JQuery改变了他们序列化发布数据的方式。
http://forum.jquery.com/topic/nested-param-serialization
您必须将“传统”设置设为true,其他方式
{值:[ “1”, “2”, “3”]}
将以
出现值[] = 1&安培;值[] = 2及值[] = 3
而不是
值= 1&安培;值= 2及值= 3