Непредсказуемое поведение при настройке сеанса с вызовом Ajax - PullRequest
0 голосов
/ 27 июня 2019

Я столкнулся с проблемой при установке переменной сеанса с помощью вызова ajax. У меня есть кнопка, которая добавляет товар в корзину, который обрабатывается файлом внутри подпапки.

Я вызываю session_start () в самом начале, вот так:

<?php
//header.php
session_start();
echo session_id();
?>

Я использую эту форму, чтобы инициировать вызов ajax в index.php:

<form class="add-cart-form" action="" method="POST"> 
    <input type="hidden" name="id" value="<?php echo $item[14]?>">
    <input type="hidden" name="qty" value="1">
    <input type="hidden" name="add_to_cart">
    <input type="submit" value="Add to shopping cart">
</form>

У меня есть отдельный script.js в папке assets / scripts.js, который выполняет вызов ajax:

$(document).ready(function() {
    $(".add-cart-form").on('submit', function(e) {
        $(".sb").addClass("blur");
        $("#overlay-wrap").slideToggle();
        $.ajax({
            url: 'handlers/cart-handler.php',
            type: 'POST',
            data: $(this).serialize(),
            success: function(data) {
                $(".cart-size-number").html(data);
            }
        });
        e.preventDefault();
    });
});

И, наконец, cart-handler.php, который должен обновить переменную сеанса:

<?php
session_start();
#Add items to the shoppingcart array
if(isset($_POST["add_to_cart"])) {  
    if(isset($_SESSION["shopping_cart"])) {  
        $item_array_id = array_column($_SESSION["shopping_cart"], 'item_id');  
        if(!in_array($_POST['id'], $item_array_id)) {  
            $item_array = array(
                  'item_qty'   => $_POST['qty'],  
                  'item_id'    => $_POST['id']
                );  
            array_push($_SESSION["shopping_cart"], $item_array); 
        }
    } else {  
        $item_array = array(  
                'item_qty'   => $_POST['qty'],  
                'item_id'    => $_POST['id'] 
            );  
        $_SESSION["shopping_cart"][0] = $item_array;
    }  
}
#Output amount of items  
echo sizeof($_SESSION['shopping_cart']);
?>

Проблема
Как вы можете видеть, в header.php я повторяю идентификатор сеанса, чтобы проверить, остается ли он согласованным. Всякий раз, когда я делаю вызов ajax, добавляя товар в корзину, случайным образом происходит любое из следующего:

  1. Идентификатор сеанса остается прежним, и все работает как ожидалось
  2. Идентификатор сеанса изменяется, не устанавливая переменную сеанса для корзины покупок

В случае номер два начальный сеанс, который начался в header.php, теперь перезаписывается cart-handler.php. Корзина покупок все еще пуста, но с этого момента система корзин покупок работает нормально, поскольку теперь она продолжает использовать новый сеанс.

Я хотел бы знать, почему

session_start();

в cart-handler.php иногда переопределяет существующий сеанс, а иногда продолжает исходный сеанс? Как я могу изменить поток данных, чтобы программа всегда использовала исходный сеанс?

EDIT После тестирования кажется, что session_id изменяется при переключении между страницами. Если я сначала загружаю index.php, я получаю идентификатор сессии. Когда я нажимаю на следующую страницу, я вижу тот же идентификатор сессии. Но теперь, когда я возвращаюсь к индексу, идентификатор сессии меняется. Таким образом, он перезаписывается, и после этого идентификатор сеанса перестает меняться между страницами. Как это возможно? Я почти потерял 2 дня, пытаясь понять это.

РЕДАКТИРОВАТЬ 2
Хорошо, я понял это. У меня было несколько кнопок, перенаправляющих на https://www.example.com, но я обращался к индексу на https://example.com, который, по-видимому, представляет собой две отдельные сущности, управляющие своими собственными уникальными сеансами. Я изменил все ссылки на полные URL-адреса и теперь использую www через .htaccess, чтобы сеансы оставались согласованными. Настолько глупо просто, что этот вариант даже не приходил мне в голову.

...