Я столкнулся с проблемой при установке переменной сеанса с помощью вызова 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, добавляя товар в корзину, случайным образом происходит любое из следующего:
- Идентификатор сеанса остается прежним, и все работает как ожидалось
- Идентификатор сеанса изменяется, не устанавливая переменную сеанса для корзины покупок
В случае номер два начальный сеанс, который начался в 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, чтобы сеансы оставались согласованными. Настолько глупо просто, что этот вариант даже не приходил мне в голову.