json ajax php decode

181
14 мая 2018, 20:50

json хранится в localstorage Отправляю так

    function _onSubmitForm(e) {
            var cartData,               
                orderData;
            e.preventDefault();
            cartData = _getCartData();    
            orderData = formData + '&cart=' + JSON.stringify(cartData);
            $.ajax({
                url: 'scripts/order.php ',
                data: orderData,
                type: 'POST',
                cache: false,
                dataType: 'json',
                error: _orderError,
                success: function(responce) {
                    if (responce.code === 'success') {
                        _orderSuccess(responce);
                    } else {
                        _orderError(responce);
                    }
                },
                complete: _orderComplete
            });
        }
 function _getCartData() {
        var cartData = cart.getData();
        _.each(cart.getData(), function(item) {
            item.name = encodeURIComponent(item.name);
        });
        return cartData;
    }

Обработка в php

function sendEmailOrder($data) {
    $cart = json_decode($data['cart']);
    ob_start();
    include('tpl/email_order.php');
    $body = ob_get_contents();
    ob_end_clean();
    $sendClient = sendEmail(array(
        'subject' => 'Ваш заказ с сайта ' . SITE,
        'fromName' => EMAIL_FROM_NAME,
        'fromEmail' => EMAIL_ADMIN,
        'toEmail' => $data['email'],
        'body' => $body
    ));
    $sendAdmin = sendEmail(array(
        'subject' => 'Новый заказ с сайта ' . SITE,
        'fromName' => EMAIL_FROM_NAME,
        'fromEmail' => EMAIL_ADMIN,
        'toEmail' => EMAIL_ADMIN,
        'body' => $body
    ));     
}

$cart в php получается пустым. Ошибка в консоли

Invalid argument supplied for foreach()

Если в ajax запросе сделать alert, выглядит это как

name:%25B2%24D1%2588%

остальные данные json передаются нормально, и другие поля с русским текстом.

Только name кодируется вот так. Может поэтому проблема? В getCartData() какая-то ошибка?

Дополнение. Убрал проверку

'cart' => isset($_POST['cart']) ? stripslashes($_POST['cart']) : '[]'

Заменил на

'cart' => $_POST['cart']

Ошибка пропала. Но поле name все равно приходят кразозябрами. Получается, что это еще на стороне ajax криво кодируется?

Answer 1

Проблема решилась.

 function _getCartData() {
        var cartData = cart.getData();
        _.each(cart.getData(), function(item) {
            item.name = encodeURIComponent(item.name);
        });
        return cartData;
    }

Убрал лишнее и все заработало.

function _getCartData() {
    var cartData = cart.getData();
    return cartData;
}

Всем спасибо.

READ ALSO
homestead подключение библиотек

homestead подключение библиотек

Использую виртуальную среду Homestead для локальной разработки и потребовалось подключить библиотеку GMPИспользую:

211
Ошибка в подключении к mysql

Ошибка в подключении к mysql

Есть бот, пользовалось 15 человек одновременно, все было нормально, но недавно стало появляться предупреждение:

220
Как показать скрытые строки таблицы при нажатии на основную?

Как показать скрытые строки таблицы при нажатии на основную?

Попытаюсь описать, что нужно сделатьПо данным из файла data

226
Ошибка в запросе PHP PDO INSERT MYSQ

Ошибка в запросе PHP PDO INSERT MYSQ

Не выполняется запрос:

206