Помогите переделать "товар в корзину" с SESSION на COOKIE (PHP)

Рейтинг: 0Ответов: 1Опубликовано: 19.07.2025

Всем привет! Не было 10+ лет проблем с сессией, но админ на хосте решил из вечной сессии сделать 30минут.

Теперь хочу переделать на куки, но мои знания ограничиваются. Я уже пару дней кручу-верчу, записываю куку с общим колличеством товара, а сам товар(ы) не могу.. Прошу помощи.

Есть такой код в отдельном файле: ПостОм принимает id и qnt товара (после нажатия кнопки "в корзину")

 if(!isset($_SESSION['cart']))
 {
     $_SESSION['cart'] = array();   
     $_SESSION['total_items'] = 0;
 }
 
if(isset($_POST['id'])){

$cart = $_POST['id'];
if (!preg_match("|^[\d]+$|", $cart)) { Header ("Location: /"); }

function add_to_cart($cart){
$qnt = str_replace(",",".",$_POST['qnt']);
if (!preg_match("|^[\d]+$|", $qnt)) { Header ("Location: /"); }

    if(isset($_SESSION['cart'][$cart]))
    {
        $_SESSION['cart'][$cart] = $_SESSION['cart'][$cart] + $qnt;
    }
    else
    {
    
    $_SESSION['cart'][$cart] = $qnt;
    return true;
    }
    
    return false;
}

add_to_cart($cart,$conn);
        $_SESSION['total_items'] = total_items($_SESSION['cart']);      
}


function total_items($cart){

    $num_items = 0;
    if(is_array($cart))
    {
        foreach($cart as $cart => $qty)
        {
            $num_items += $qty;
        }
    }
    return $num_items;
}




if(isset($_POST['update'])){
update_cart();
}

function update_cart(){
    

    foreach($_SESSION['cart'] as $cart => $qty)
        {
        if(($_POST[$cart] == '0') OR empty($_POST[$cart]))
            {
                unset($_SESSION['cart'][$cart]);
            }
            else
            {$_SESSION['cart'][$cart] = $_POST[$cart];
            }
        }
            
            
            
        $_SESSION['total_items'] = total_items($_SESSION['cart']);
            
    }





if(isset($_GET['delete'])){

$cart = $_GET['delete'];
    unset($_SESSION['cart'][$cart]);
    
         $_SESSION['total_items'] = total_items($_SESSION['cart']);

}




function empty_cart(){
    
        unset($_SESSION);
        unset($_SESSION['cart']);
        unset($_SESSION['total_items']);

}

    function find($id, $conn)//
    {
    $result = $conn->query("SELECT * FROM items WHERE id='$id'");
    $item = $result->fetch(PDO::FETCH_ASSOC);
    return $item;
    }

В корзине выводим так:

 foreach($_SESSION['cart'] as $id => $qty){ 
        
    $product = find($id, $conn); 
}

Ответы

▲ -1

Что вам мешает настроить свою сессию в своём скрипте, это ведь те же куки?

//Устанавливаем время жизни сессионных файлов.
//Работает только совместно со следующей командой.
ini_set('session.gc_maxlifetime', 86400);
//Свой путь к сохраняемым сессиям
session_save_path('my/session/path');
//Задаём настройки кук и времени. Тут - сутки и доступ со всех поддоменов
session_set_cookie_params(86400, '/; samesite=None; Secure', '.mydomain.ru');
//Собственное имя кук для сессии
session_name('MY_SESSION');
// Открытие сессии. Должно быть сделано до обращения к $_SESSION и до любого вывода.
session_start();

Если же вы хотите всё-таки использовать куки - нет ничего проще

//Создаём любой массив
$arr=['cart'=>[],'total_items'=>100500];
$arr=json_encode($arr,JSON_UNESCAPED_UNICODE);
//Тут следует заметить, что флаг JSON_UNESCAPED_UNICODE является
//нестандартным для json, т.к. позволяет не конвертировать русские 
//буквы в \uXXXX и если их много, чуток экономит место.

//Задаём куку. Здесь указано время жизни ~месяц т.е. сутки*30
//и разрешён доступ с поддоменов.
//Действие должно быть выполнено до любого вывода.
setcookie('MY_CART', $arr, time()+86400*30,'/; SameSite=None; Secure', '.mydomain.ru');
//Если не нужен доступ с поддоменов:
setcookie('MY_CART', $arr, time()+86400*30,'/');

//Получение куки
$arr=$_COOKIE['MY_CART'];
$arr=json_decode($arr);