-1

一度に複数のユーザーを削除できる管理領域があります。これは、削除を処理するコードの一部です。基本的に、ユーザー ID を調べて、チェック済みのマークが付けられた各 ID を削除します。

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などを出力したいと言っているところに、ユーザーIDを使用して名前を取得する関数があります。問題は、反復が完了するとです。明らかに、それらのユーザーはデータベースに存在しなくなり、名前を取得できません。ループ中にこの関数を実行し、文字列または配列を作成する方法はありますか。メッセージの代わりに出力できますか?

4

2 に答える 2

1

次のようなものでuidをループしているので、名前を配列に追加できます。

$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";
于 2013-06-24T23:24:29.823 に答える
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();
}

ここでは、効率 (多くの小さな単一クエリをいくつかの大きなクエリに結合する) やエラー処理 (最初のエラーでリダイレクトしないでください。代わりに、すべての処理が完了した後にリストのあるページにリダイレクトする) など、いくつかの改善を行うことができます。成功と失敗の違い) ですが、これが基本的な考え方です。

1 つでもエラーが発生した場合でも、すべての操作を実行する簡単な変更を次に示します。

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();
}
于 2013-06-24T23:27:00.943 に答える