#javascript #php #jquery #ajax
#javascript #php #jquery #ajax
Вопрос:
У меня это NULL VALUE
$_SESSION
внутри моего compare.php Вы знаете, как это исправить?
Спасибо
Функция js :
$(function() {
$('input[type=checkbox]').change(function() {
var chkArray = [];
$('#container').html('');
//put the selected checkboxes values in chkArray[]
$('input[type=checkbox]:checked').each(function() {
chkArray.push($(this).val());
});
//If chkArray is not empty show the <div> and create the list
if(chkArray.length !== 0) {
$('#container').show();
$.each(chkArray, function(i, val) {
$('<p>').text(chkArray[i]).appendTo('#container');
});
$('#rectButton').on('click', function (e) {
$.ajax({
method: 'POST',
url : "http://localhost/shop/ext/ajax/products_compare/compare.php",
data : {product_id:chkArray},
/*
success : function(resp){
alert("Product is added to be compared" );
}
*/
});
});
}else{
$('#container').hide();
$('#container').html('');
}
});
})
</script>
<button id="rectButton" class="btn"><a href="compare.php">Compare</a></button>
мой файл ajax
$product_id = $_POST['product_id'];
if(!is_array($_SESSION['ids'])) {
$_SESSION['ids'] = [];
} else {
array_push($_SESSION['ids'], $product_id);
}
результат файла ajax :
product_id[]: 12
product_id[]: 10
product_id[]: 9
мой файл compare.php о результате ajax.
var_dump($_SESSION] ===> NULL
var_dump($_SESSION]N['ids']; ===> NULL
result I see:
array(1) { ["ids"]=> array(5) { [0]=> array(1) { [0]=> string(2) "10" } [1]=> array(2) { [0]=> string(2) "10" [1]=> string(1) "9" } [2]=> array(1) { [0]=> string(1) "9" } [3]=> array(2) { [0]=> string(2) "12" [1]=> string(1) "9" } [4]=> array(3) { [0]=> string(2) "12" [1]=> string(2) "11" [2]=> string(1) "9" } } }
хороший результат, чтобы иметь :
[4]=> array(3) { [0]=> string(2) "12" [1]=> string(2) "11" [2]=> string(1) "9" }
Комментарии:
1. Есть ли у вас
session_start()
в начале обоих сценариев?2. Не связано с проблемой, которую вы описываете, но
$_SESSION['ids'] = [];
должно быть$_SESSION['ids'] = [$product_id];
. В противном случае первый вызов AJAX не сохранит свой идентификатор продукта.3.
$_POST['product_id']
это массив, а не один идентификатор продукта. Так$_SESSION['ids']
будет 2-мерный массив. Это то, чего вы действительно хотите?4. Почти всегда неправильно привязывать обработчик событий внутри другого обработчика событий. Каждый раз, когда вы меняете флажок, вы добавляете другой обработчик щелчка
#rectButton
, поэтому он будет запускаться несколько раз при нажатии.5. @Barmar. Я пытался с этим $_SESSION[‘ids’] = [$product_id];. но результат всегда равен нулю для var_dump($ _SESSION);
Ответ №1:
Поскольку $_POST['product_id']
это массив, вы не должны помещать весь массив в переменную сеанса как один элемент, поэтому вы получаете 2-мерный массив. Вы должны просто присвоить новый массив переменной сеанса, поскольку он содержит все элементы, которые проверил пользователь.
$_SESSION['ids'] = $_POST['product_id'];
Вы не должны привязывать обработчик щелчка внутри обработчика изменений. Вы должны связать два обработчика независимо, и они оба могут использовать глобальную chkArray
переменную.
$(function() {
var chkArray = [];
$('input[type=checkbox]').change(function() {
$('#container').html('');
//put the selected checkboxes values in chkArray[]
chkArray = $('input[type=checkbox]:checked').map(function() {
return this.value;
}).get();
//If chkArray is not empty show the <div> and create the list
if (chkArray.length !== 0) {
$('#container').show().html('');
$.each(chkArray, function(i, val) {
$('<p>').text(chkArray[i]).appendTo('#container');
});
} else {
$('#container').hide().html('');
}
});
$('#rectButton').on('click', function(e) {
$.ajax({
method: 'POST',
url: "//localhost/shop/ext/ajax/products_compare/compare.php",
data: {
product_id: chkArray
},
/*
success: function(resp) {
alert("Product is added to be compared");
}
*/
});
});
})
Комментарии:
1. Хорошо, спасибо за эти объяснения. Это более понятно. Я ищу результат около 4 идентификаторов checkbobx (12-11-10-9). результатом внутри файла ajax является var_dump($_SESSION[‘ids’]) ==>array(1) { [«ids»]=> array(2) { [0]=> array(1) {[0]=> string(2) «10» }[1]=> массив (2) {[0]=> строка(2) «10» [1]=> строка (1) «9» } } } После дополнительной проверки всегда принимает последний идентификатор 10 — 9. Другой идентификатор находится внутри сеанса.
2. Как вы вызываете файл ajax? Единственный AJAX, который вы опубликовали
compare.php
, это что-то еще?