来自购物车 PHP 文件的 Json 响应返回未定义

问题描述

我正在处理购物车。我使用 PHP 和 javascript 和 xmlhttprequest 调用应用程序的 ajax 端。 我的问题是每当我单击“添加到购物车”按钮时,产品信息都会通过 xmlhttprequest 作为 json 类型发送到 PHP 文件,但 PHP 文件只返回“未定义”。这个想法是获取购物车的会话计数。

代码如下:

xmlhttprequest 文件(dodo.js):

function postForm(){
    var inputid = document.getElementById("product_id").value;
    var inputname = document.getElementById("product_name").value;
    var inputprice = document.getElementById("product_price").value;
    var inputdesc = document.getElementById("product_desc").value;
    var inputimag = document.getElementById("product_imag").value;
    //var action = "add";
    var sedd = {product_id : inputid,product_name : inputname,product_price : inputprice,product_desc : inputdesc,product_imag : inputimag};
    
    //var sedd = "product_id="+inputid+"&action="+action;
    if(ajaxConnector.readyState == 0 || ajaxConnector.readyState == 4){
        ajaxConnector.open("POST","cartprocess.PHP",true);
        ajaxConnector.setRequestHeader("Content-Type","json");
        ajaxConnector.onreadystatechange = () => {
            if(ajaxConnector.readyState == 4 && ajaxConnector.status == 200){
                //document.getElementById("sapo").innerHTML = "<p>Sent Now</p>";
                //json = JSON.parse(ajaxConnector.responseText);
                $("#cart-added-main").show(function(){
                    $("#cart-added-show").html(inputname+" added to cart");
                    $("#cart-added-main").fadeOut(8000);
                });
                document.getElementById("numero").innerHTML = JSON.parse(ajaxConnector.responseText).count;
                //document.getElementById("sapo").innerHTML = ajaxConnector.responseText;
            }//else{
                //alert('Failed to add to cart.');
            //}
        }
        ajaxConnector.send(sedd);
    }
}

PHP 文件(cartprocess.PHP):

<?PHP
session_start();
$json = array();

if(!empty($_POST["product_id"])){
    if(isset($_SESSION["cartad"])){
        $item_new_id = array_column($_SESSION["cartad"],"product_id");
        if(!in_array($_POST["product_id"],$item_new_id)){
            
            foreach($_SESSION["cartad"] as $keys => $values){
                if($values["product_id"] == $_POST[product_id]){
                    $item_new = array(
                    'product_id' => $_POST["product_id"],'product_name' => $_POST["product_name"],'product_price' => $_POST["product_price"],'product_desc' => $_POST["product_desc"],'product_imag' => $_POST["product_imag"]
                    );
                
                $_SESSION["cartad"][$count] = $item_new;
                
                }
            }
            
        }else{
            $output = "Item already added";
        }
        
    }else{
        $item_new = array(
            'product_id' => $_POST["product_id"],'product_imag' => $_POST["product_imag"]
        );
        
        $_SESSION["cartad"][0] = $item_new;
    }
        $json['count'] = count($_SESSION["cartad"]);
}
header('Content-Type: application/json');
echo json_encode($json);

解决方法

这里有两个问题。
首先是您没有在请求中发送 json,为此您必须将对象转换为 json。

ajaxConnector.send(JSON.stringify(sedd));

其次,如果您发送了 json,则不会阅读它。未为 json 请求填充 $_POST。
要获取 json 数据,您必须从 php://input

读取它
<?php
session_start();
$json = array();

$POST = json_decode(file_get_contents("php://input"),true); //<-- here

if(!empty($POST["product_id"])){
    if(isset($_SESSION["cartad"])){
        $item_new_id = array_column($_SESSION["cartad"],"product_id");
        if(!in_array($POST["product_id"],$item_new_id)){
            
            foreach($_SESSION["cartad"] as $keys => $values){
                if($values["product_id"] == $POST[product_id]){
                    $item_new = array(
                    'product_id' => $POST["product_id"],'product_name' => $POST["product_name"],'product_price' => $POST["product_price"],'product_desc' => $POST["product_desc"],'product_imag' => $POST["product_imag"]
                    );
                
                $_SESSION["cartad"][$count] = $item_new;
                
                }
            }
            
        }else{
            $output = "Item already added";
        }
        
    }else{
        $item_new = array(
            'product_id' => $POST["product_id"],'product_imag' => $POST["product_imag"]
        );
        
        $_SESSION["cartad"][0] = $item_new;
    }
        $json['count'] = count($_SESSION["cartad"]);
}
header('Content-Type: application/json');
echo json_encode($json)

;