我试图通过php控制器中的http post请求解压缩我的json对象:
$products = $_POST['products'] ?? '';
foreach($products as $purchase){
$productId =$purchase['productid'];
$qty = $purchase['quantity'];
$params = array(
'form_key' => $this->formKey->getFormKey(),
'product' => $productId,
'qty' => $qty
);
//Load the product based on productID
$_product = $this->product->load($productId);
$this->cart->addProduct($_product, $params);
$this->cart->save();
}
这是我发送的json对象的格式,存储在名为list
的变量中。
0: {productid: "2910", quantity: "2"}
1: {productid: "2911", quantity: "1"}
2: {productid: "2913", quantity: "4"}
3: {productid: "2914", quantity: "3"}
这是我的帖子请求(内容类型也设置为application/json
):
$.post("http://dev.website.co.uk/batchorder/index/addtocart",
{
products:list,
},
function(data, status){
console.log("Data: " + data);
console.log("Status: " + status);
});
这对我来说一直很有用,所以我无法看到我在哪里出错。
我得到的错误是Warning: Invalid argument supplied for foreach()
。但我认为它与我的json对象有关。
编辑:
$("#AddToCartButton").click(function(){
var list = [];
$("#tabCollection :input").each(function(){
var input = $(this);
if($(this)[0].value > 0){
var myArray = {'productid': $(this)[0].id, 'quantity': $(this)[0].value};
list.push(myArray);
}
});
var JSONStringlist = JSON.stringify(list);
var JSONlist = JSON.parse(JSONStringlist);
console.log(JSONlist);
$.ajaxSetup({
headers:{
'Content-Type': "application/json",
}
});
$.post("http://dev.website.co.uk/batchorder/index/addtocart",
{
"products":JSONlist,
},
function(data, status){
console.log("Data: " + data);
console.log("Status: " + status);
});
});
编辑2:
JSON字符串的示例:
[{"productid":"2182","quantity":"1"},{"productid":"2183","quantity":"1"},{"productid":"2184","quantity":"1"},{"productid":"2185","quantity":"1"}]
答案 0 :(得分:0)
$products = $_POST['products'] ?? '';
foreach($products as $purchase){
您的$ products是“可迭代的东西”或空字符串。
如果它是一个数组,它是可迭代的,并且foreach将成功执行。但是如果它是一个空字符串,它会抱怨“警告:为foreach()提供的参数无效”,导致字符串不能真正迭代。
所以你需要做的就是确保$ products总是一个数组,无论是空的还是填充了json对象。
如果你改变:
$products = $_POST['products'] ?? '';
为:
$products = json_decode($_POST['products']) ?? array();
foreach不会抱怨,如果$ _POST ['products']为空,则不会在购物车中保存任何内容。
在您的javascript文件中更改:
$.post("http://dev.website.co.uk/batchorder/index/addtocart",
{
"products":JSONlist,
},
function(data, status){
console.log("Data: " + data);
console.log("Status: " + status);
});
});
到:
$.post("http://dev.website.co.uk/batchorder/index/addtocart",
{
"products":JSONStringlist,
},
function(data, status){
console.log("Data: " + data);
console.log("Status: " + status);
});
});
您正在将JavaScript对象解析为JSON,然后将其重新解析为JavaScript对象。
PHP并不真正了解JavaScript对象,但了解JSON对象。