Вопрос

Хорошо, во-первых, я прошу прощения, если этот вопрос задавался раньше, я провел последние 12 часов, просматривая сотни тем форума, и пока не нашел ни одной, которая бы точно ответила на этот вопрос, так что начнем.

У меня есть созданная мной страница со списком пользователей, который автоматически заполняется при входе пользователей в систему, и у каждого пользователя есть флажок, который позволяет хосту выбирать пользователей и удалять их при необходимости.Я использую jQuery для отправки строки массива на страницу php, где я пытаюсь разобрать строку, просмотреть идентификаторы пользователей и удалить переданные идентификаторы из нашей базы данных.Все работает очень хорошо, если только я не выберу более одного пользователя.Когда я выбираю более одного пользователя и передаю массив обработчику php, он взрывает массив, но сохраняет только последнее значение в массиве, остальная часть теряется где-то в черной дыре сценариев.

Вот мой код с моей страницы javascript:

function rem_user() {  
var ids = $('input:checkbox[id=del]:checked').map(function(){
    return this.value
}).get();
alert(ids);
jQuery("#rem_msg").load(controlpage, {AdmFnc: "rem_user", del_ids: ids}, getUsers);
}

затем этот массив передается на страницу управления php, где он обрабатывается:

if (strcmp($AdmFnc, rem_user) == 0){
echo "";
$ids = trim($_POST['del_ids']);
$ids = explode(',',$ids);
if(is_array($ids)){
   foreach($ids as $userid){
      mysqli_query($dbc, "UPDATE webcastlogin SET logoutTime = '$current_time' WHERE userid = '$userid'") or die('Error setting logout time '.mysqli_error($dbc));
      mysqli_query($dbc, "DELETE FROM weekly_users WHERE userid = '$userid'") or die('Error removing users '.mysqli_error($dbc));
    }
    echo 'Selected IDs removed';
} else if (empty($ids)) {
    echo 'Code is wrong, no array sent';
} else {
    mysqli_query($dbc, "UPDATE webcastlogin SET logoutTime = '$current_time' WHERE userid = '$ids'");
    mysqli_query($dbc, "DELETE FROM weekly_users WHERE userid = '$ids'");
    echo 'Selected ID removed';
}
}

Как вы можете видеть в моем JavaScript, у меня настроено оповещение, чтобы я мог проверить правильность отправляемой информации. Насколько я могу судить по этому оповещению, это "," массив с разделителями, поэтому я использую его на стороне php, чтобы взорвать его.

Я в тупике, пытаясь понять, почему, когда я запускаю это через цикл foreach, я получаю только значение последнего элемента в массиве.

Любая помощь будет очень признательна и может сохранить мои волосы для будущих проблем с кодированием.

Спасибо

Это было полезно?

Решение

Просто измените имя ключа на del_ids в jQuery load вызов, чтобы включить пустой набор скобок:

jQuery("#rem_msg").load(controlpage, {AdmFnc: "rem_user", "del_ids[ ]": ids}, getUsers);

Теперь в PHP вместо использования trim и explode, значения уже будут в массиве, поэтому вы можете получить к ним прямой доступ:

$ids = $_POST['del_ids'];

Другие советы

Прежде чем делать запрос Ajax, вам следует преобразовать массив в строку. Вы можете сделать это с помощью join метод:

function rem_user() {  
  var ids = $('input:checkbox[id=del]:checked').map(function(){
    return this.value
  }).get().join(); // ids now is a comma separated string, made from the array

  alert(ids);
  jQuery("#rem_msg").load(controlpage, {AdmFnc: "rem_user",
    del_ids: ids},
    getUsers);
}

Происходит следующее: когда вы отправляете объект Array, значение del_ids повторяется в параметрах POST запроса Ajax:

img1

Вот почему вы получаете только последний элемент, поскольку это действительно один и тот же параметр.

Но если вы создадите строку из своего массива, она опубликует значение параметра так, как вы ожидаете, на стороне сервера:

img2

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top