php js对象通过 AJAX 发送

yxyvkwin  于 2023-01-12  发布在  PHP
关注(0)|答案(4)|浏览(94)

我花了两天时间试图解决这个问题,但没有成功。
我通过jQuery AJAX 发送存储在浏览器中的会话到PHP函数,以便将数据保存到WordPress数据库。
在会话中存储数据存储如下-

所以这没有成功:

var dataStorage = JSON.stringify(sessionStorage.getItem('shoppingCart'));

       $.ajax({
            url: "https://mywebsite.com/wp-admin/admin-ajax.php",
            method: "POST",
            data: 'globalvar='+dataStorage+'&action=myfunction',
             dataType: "json"  
        }).done(function (response) {});

PHP函数是:

if (!function_exists('myfunction')) {

function myfunction() {
    

     
  $object = $_POST['globalvar'];
     
     $decoded_object = json_decode($object);

       //wordpress update db                 
      update_post_meta('42393', 'menu_items_list',  $menu_make_arr);
        
 }

     
             add_action('wp_ajax_myfunction', 'myfunction');
            add_action('wp_ajax_nopriv_myfunction',  'myfunction');
}

我在db中得到null,如下所示

kd3sttzy

kd3sttzy1#

首先,sessionStorage已经存储了一个字符串,而你要保存到的var不应该被称为sessionStorage,因为它隐藏了原来的sessionStorage的名字.另外,避免同时使用“var”,使用const和let.

const shoppingCart = sessionStorage.getItem('shoppingCart')

第二,您发送的数据是以URL编码到HTTP请求主体中的(JSON部分可能会出错)。

encodeURIComponent(shoppingCart)

我的建议是用JSON对所有内容进行编码,因为你已经在用dataType“欺骗协议”了:您提供的“json”(您的实际数据是application/x-www-form-urlencoded,而不是application/json)。
联森:

const shoppingCart = JSON.parse(sessionStorage.getItem('shoppingCart'))

$.ajax({
  url: "https://mywebsite.com/wp-admin/admin-ajax.php",
  method: "POST",
  data: JSON.stringify({
    globalvar: shoppingCart,
    action: "myfunction"
  }),
  dataType: "json"  
}).done((res) => {});

PHP(🤢语言):

$json = file_get_contents('php://input');
$body = json_decode($json);

$func = $body->action;
$data = $body->globalvar;
tzdcorbm

tzdcorbm2#

要在php中读取application/json,我们可以使用php://input
代码将如下所示

function myfunction() {
        $rawData = file_get_contents("php://input");
        $json = json_decode($rawData);

        $object = $json->globalvar;

要将application/json从浏览器发送到php,我们可以使用JSON.stringify
代码将如下所示

sessionStorage.setItem("shoppingCart", JSON.stringify([{"name": "name1"},{"name": "name2"}]));

var dataStorage = JSON.parse(sessionStorage.getItem('shoppingCart'));

$.ajax({
    url: "test1.php",
    method: "POST",
    data: JSON.stringify({ "globalvar": dataStorage, "action" : "myfunction"}),
    dataType: "json"  
}).done(function (response) {
    console.log(response)
});
bvpmtnay

bvpmtnay3#

有几个方面需要修复/检查:

1.函数定义是否符合您的要求?

你的

if (!function_exists('myfunction')) {
    //...
}

检查myfunction是否存在,如果不存在此名称的function,则仅执行内部块。您需要确保您的function最终存在,并且同名的旧function不会阻止创建此function

2.你的JSON格式正确吗?

您正在json_decode 'ing会话数据,在数据库级别,您需要存储如下的值

'[{"name":"том","price":259,"count":1},{"name":"жак","price":299,"count":1}]'

尝试确保你存储JSON的方式在WordPress中是有效的。

3.检查开发工具的“网络”选项卡

您需要确保您的请求被正确发送,并且您期望发送的JSON最终被发送。

4.确保myfunction最终被执行

向这个function添加一些日志记录以查看它是否正在执行也无妨。

ulydmbyx

ulydmbyx4#

我认为sessionStorage是一个保留的关键字,所以它产生了这个问题。你可以调试变量state。这段代码对我很有效。

var dataStorage = JSON.stringify(sessionStorage.getItem('shoppingCart'));

$.post({
  url: "https://mywebsite.com/wp-admin/admin-ajax.php",
  method: "POST",
  data: 'globalvar=' + encodeURIComponent(dataStorage) + '&action=myfunction',
  dataType: "json"
}).done(function(response) {});

PHP代码-只是为了调试而删除了几行代码

if (!function_exists('myfunction')) {

    function myfunction()
    {
        $object = $_POST['globalvar'];
        $decoded_object = json_decode($object);
        print_r($decoded_object);
    }

    myfunction();
}

相关问题