PHP Explode удаляет первое значение массива - PullRequest
1 голос
/ 26 декабря 2009

Хорошо, во-первых, я извиняюсь, если этот вопрос уже задавался, я провел последние 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, я получаю только значение последнего элемента в массиве.

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

Спасибо

Ответы [ 2 ]

6 голосов
/ 26 декабря 2009

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

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

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

$ids = $_POST['del_ids'];
4 голосов
/ 26 декабря 2009

Вы должны преобразовать ваш массив в строку перед выполнением 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

...