通过AJAX传递JavaScript对象至PHP数组失败问题求助
解决AJAX传递JS对象到PHP解析为空的问题
我来帮你搞定这个问题!你现在遇到的核心问题是直接把JavaScript对象拼接到字符串里传递,浏览器会自动把对象转换成默认的[object Object]字符串,导致PHP端拿到的不是合法的JSON数据,自然用json_decode解析后为空。
问题根源
当你执行var dataString = "bodycontent="+bodycontent;时,JavaScript会调用对象的toString()方法,默认返回[object Object]。所以最终传到PHP的$_POST['bodycontent']值就是这个字符串,而不是你期望的JSON结构,json_decode无法解析这种非JSON格式的内容,返回空也就不奇怪了。
解决方案(三种可选,推荐第二种)
方案1:手动将对象转为JSON字符串传递
修改JavaScript中的dataString定义,用JSON.stringify()把对象转成标准JSON字符串:
var bodycontent = { search: search, query: query, start: start, show: show }; var dataString = "bodycontent="+JSON.stringify(bodycontent); $.ajax({ type: "POST", data: dataString, cache: false, url: 'url.php', success: function(html) { alert(html); } });
PHP端保持原代码即可:
$bodycontent = json_decode($_POST['bodycontent'], true); // 现在$bodycontent就是你期望的关联数组了 var_dump($bodycontent);
方案2:让jQuery自动处理对象序列化(最推荐)
不需要自己拼接字符串,直接把bodycontent对象传给data参数,jQuery会自动将其序列化为表单格式的键值对,PHP可以直接通过$_POST获取单个字段:
var bodycontent = { search: search, query: query, start: start, show: show }; $.ajax({ type: "POST", data: bodycontent, // 直接传递对象 cache: false, url: 'url.php', success: function(html) { alert(html); } });
PHP端直接获取对应字段:
$search = $_POST['search']; $query = $_POST['query']; // 这里会是数组类型 $start = $_POST['start']; $show = $_POST['show'];
方案3:以JSON格式发送请求(适合复杂对象)
如果你的对象结构比较复杂,也可以直接发送JSON格式的请求体,同时指定contentType告诉服务器接收的是JSON:
var bodycontent = { search: search, query: query, start: start, show: show }; $.ajax({ type: "POST", data: JSON.stringify(bodycontent), cache: false, url: 'url.php', contentType: "application/json", // 必须指定这个头 success: function(html) { alert(html); } });
PHP端需要读取原始请求体来解析:
$rawData = file_get_contents('php://input'); $bodycontent = json_decode($rawData, true); var_dump($bodycontent);
验证方法
你可以在PHP端先打印$_POST或者原始请求体,看看实际收到的数据是什么:
// 打印整个POST数组 var_dump($_POST); // 如果是方案3,打印原始数据 var_dump(file_get_contents('php://input'));
这样就能快速定位问题所在啦!
内容的提问来源于stack exchange,提问作者Saad Bashir
相关产品推荐
相关产品推荐

