2013-06-24 3 views
-1

У меня есть область администрирования, где они могут удалять несколько пользователей за раз. Это часть кода, который обрабатывает удаление. В основном он проходит через идентификаторы пользователя и удаляет все отмеченные флажки.Цикл forach и построение массива

if ($_POST['doDelete'] == 'Delete') { 
    if (!empty($_POST['u'])) { 
     foreach ($_POST['u'] as $uid) { 
      $id = escape($uid); 
      $delete = Nemesis::query("DELETE FROM users WHERE id = '{$id}' AND id <> '{$_SESSION[user_id]}'"); 
      if (!$delete) { 
       $msg->add('e', QUERY_ERROR); 
       redirect('users.php'); 
       exit(); 
      } 
     } 
    } 
    /* we need a way to iterate over users deleted */ 
    $msg = new Messages(); 
    $msg->add('s', QUERY_DELETE_SUCCESS); 
    redirect('users.php'); 
    exit(); 
} 

function get_user_name_from_id($user_id) 
{ 
    if ($_SESSION['user_level'] == ADMIN_LEVEL) { 
     $viewUserMod = 1; 
    } else { 
     $config = Nemesis::select("usr_view_cm", "config"); 
     $row_config = $config->fetch_assoc(); 
     $viewUserMod = $row_config['usr_view_cm']; 
    } 
    if (is_numeric($user_id) && $viewUserMod == 1) { 
     $sql = Nemesis::select("full_name", "users", "id = {$user_id}"); 
     if ($sql->num_rows > 0) { 
      $user_name = $sql->fetch_assoc(); 
      return $user_name['full_name']; 
     } else { 
      // user name cannot be matched with db, either error, or most likely user was deleted 
      return 'User ' . $user_id; 
     } 
    } else { 
     return $user_id; 
    } 
} 

Где это говорит QUERY_DELETE_SUCCESS я хотел выводить что-то вроде «Deleted Боб, Джек, Тим» .etc У меня есть функция, которая использует идентификатор пользователей и получает их имена. Проблема в том, что после завершения итерации. Очевидно, что те пользователи больше не существуют в базе данных, и я не могу их назвать. Есть ли способ запустить эту функцию во время цикла и построить строку или массив. Это может быть выведено вместо сообщения?

+0

Что означает, что вы должны вызвать вашу функцию GetName и использовать его, чтобы создать массив удаленных имен пользователей __before__ выполнение каждого оператора delete –

ответ

1

Вы просто должны быть в состоянии сделать это:

if ($_POST['doDelete'] == 'Delete') { 
    $deleted = array(); 
    if (!empty($_POST['u'])) { 
     foreach ($_POST['u'] as $uid) { 
      $id = escape($uid); 
      $username = get_user_name_from_id($uid); 
      $delete = Nemesis::query("DELETE FROM users WHERE id = '{$id}' AND id <> '{$_SESSION[user_id]}'"); 
      if (!$delete) { 
       $msg->add('e', QUERY_ERROR); 
       redirect('users.php'); 
       exit(); 
      } 
      $deleted[] = $username // push name to array after deletion is successful 
     } 
    } 
    /* The $deleted array now holds the names of the deleted users. 
    * Do with it what you want. 
    */ 
    $names = implode(",", $deleted) 
    $msg = new Messages(); 
    $msg->add('s', QUERY_DELETE_SUCCESS . " Deleted: $names"); 
    redirect('users.php'); 
    exit(); 
} 

Существует несколько улучшений, которые могут быть сделаны здесь, в том числе эффективность (объединение многих небольших одиночных запросов в несколько более крупных) и обработка ошибок (не перенаправлять на первую ошибку - вместо этого перенаправлять после завершения всей обработки страницы со списком успехов и ошибок), но это основная идея.

Вот быстрое изменение, которое будет делать все операции, даже если одна из них ошибка:

if ($_POST['doDelete'] == 'Delete') { 
    $deleted = array(); 
    $errored = array(); 
    if (!empty($_POST['u'])) { 
     foreach ($_POST['u'] as $uid) { 
      $id = escape($uid); 
      $username = get_user_name_from_id($uid); 
      $delete = Nemesis::query("DELETE FROM users WHERE id = '{$id}' AND id <> '{$_SESSION[user_id]}'"); 
      if (!$delete) { 
       $errored[] = $username; 
      } else { 
       $deleted[] = $username // push name to array after deletion is successful 
      } 
     } 
    } 
    /* The $deleted array now holds the names of the deleted users. 
    * The $errored array now holds the names of users who were not deleted due to errors. 
    * Do with them what you want. 
    */ 
    $msg = new Messages(); 
    $names_deleted = implode(",", $deleted) 
    $msg->add('s', QUERY_DELETE_SUCCESS . " Deleted: $names_deleted"); 
    if (count($errored) > 0) { 
     $names_errored = implode(",", $errored) 
     $msg->add('e', QUERY_ERROR . " Did not delete: $names_errored"); 
    } 
    redirect('users.php'); 
    exit(); 
} 
+0

, если, например, у нас есть 3 удаления. первый работает, второй - нет, а третий тоже работает. как вы можете сказать, какой из них преуспел и какой из них не удалось? – Alex

+1

Думаю, я понял. так что в основном, если он выходит из строя, один массив, и если он проходит, чем другой массив. то в конце проверьте, являются ли они пустыми. если они оба arnt отображают пользователей, которые были и не были удалены? – Alex

+0

@Alex Да, это близко к тому, как я это сделаю. Я обновил свой пример. –

1

Вы можете добавить имена в массив, как вы зацикливание над жидкостями с чем-то вроде этого:

$names = array(); 
if (!empty($_POST['u'])) { 
    foreach ($_POST['u'] as $uid) { 
     $names[] = get_user_name_from_id($uid); 
     $id = escape($uid); 
     $delete = Nemesis::query("DELETE FROM users WHERE id = '{$id}' AND id <> '{$_SESSION[user_id]}'"); 
     if (!$delete) { 
      $msg->add('e', QUERY_ERROR); 
      redirect('users.php'); 
      exit(); 
     } 
    } 
} 

Затем, когда вы хотите вывести сообщение с подтверждением, вы можете превратить этот массив в запятую строка, разделенная с чем-то вроде этого:

$names = implode(', ',$names); 
$message = "Deleted $names";