LoginSignup
1
1

More than 5 years have passed since last update.

【PHP簡易掲示板3】ユーザ削除機能

Last updated at Posted at 2018-11-19

前回の続き

概要

簡易掲示板にユーザ削除機能を追加する。
仕様としては、ユーザを管理者と一般ユーザに分けて管理者のみユーザ削除ができるようにする。

なぜ、ユーザ削除機能が必要なのか?

悪質な書き込みをするユーザを管理者側で削除できるようにしたいため。

必要なページをリストアップする。

ユーザ一覧画面でユーザ削除ボタンを設置して、ユーザ一覧画面で削除処理を行うため、ページの追加は不要。

実装手順

①データベースにadminカラムを追加して、カラムの値が0なら一般ユーザ、1なら管理者ユーザにする。

ALTER TABLE `users` ADD `admin` TINYINT(2) NOT NULL AFTER `email`;

ユーザが作成されたときに、adminカラムがデフォルトで0になるようにします。

ALTER TABLE `users` CHANGE `admin` `admin` TINYINT(2) NOT NULL DEFAULT '0';

②ログインしたときに、sessionにadminの値を追加します。

ログインを担当する関数を以下のようにします。

session.php
function authenticate( $user_name, $password ) {

    $user_name = escape( $user_name );
    $password = escape( $password );

    $query = "
        SELECT * FROM users 
        WHERE user_name='$user_name'
        ";

    $result = query( $query );

    if ( mysqli_num_rows( $result ) == 0 ) {
        message_display( 'danger' , 'ログインに失敗しました' );
        return;
    }

    while ($row = $result->fetch_assoc()) {
        $user_id = $row['id'];
        $user_name = $row['user_name'];
        $nickname = $row['nickname'];
        $email = $row['email'];
        $image = $row['image'];
        $admin = $row['admin']; // 追加
        $db_password = $row['password'];
    }

    // データベースの切断
    $result->close();

    if ( password_verify( $password, $db_password ) ) {
        session_set( 'user_id', $user_id );
        session_set( 'user_name', $user_name );
        session_set( 'nickname', $nickname );
        session_set( 'email', $email );
        session_set( 'password', $db_password );
        session_set( 'admin', $admin ); // 追加
        session_set( 'session_created_at', strtotime( 'now' ) );
        session_regenerate_id( true );
        header( "Location: posts.php" );
        exit;
    } else {
        message_display( 'danger' , 'ログインに失敗しました' );
    }
}

ユーザ一覧画面の各ユーザを表示する部分にボタンを追加します。
ボタンの表示条件は自分自身でなく、自分自身が管理者である場合です。
input type = hidden でユーザに見えない状態でユーザのIDを埋め込みます。

user.php
<div class="container">
    <div class="card card--extend">
        <div class="card-body">
            <h1 class="card-title">@<?php print h( $user['nickname'] ); ?></h1>
            <p class="card-body">
            <?php if( ! is_Current_user( $user['id'] ) && is_Admin() ): ?>
            <form method="POST" action = "" >
            <input type="hidden" name="user_id" value="<?php print h( $user['id'] ) ?>" >
            <button type="submit" class="btn btn-danger btn-lg" name= "action" >削除する</button>
            <?php endif; ?>
            </p>
        </div>
    </div>
</div>
user.php
// ログインユーザかどうか判定
function is_Current_user( $user_id ) {
    return session_get( 'user_id' ) == $user_id;
}

function is_Admin() {
    return session_get( 'admin' ) == '1';
}

一覧画面で、削除ボタンが押されたとき、削除処理をする関数を呼び出すことにします。

users.php
<?php

require ( "dbconfig.php" );
require ( "common.php" );
require ( "session.php" );
require ( "user.php" );
require ( "navbar.php" );

$users = pagination( 'users', 'id', 'DESC', 10 );

if ( isset( $_POST['action'] ) ) {
    user_delete( $_POST['user_id'] );
}
?>

<?php if ( count( $users ) > 0 ): ?>
<?php foreach ( $users as $user ): ?> 
<?php require ( "user.php" ); ?>
<?php endforeach; ?>
<?php endif; ?>

追記
削除を担当する関数を作ります。

user.php

function user_delete( $user_id ) {

    $user_id = escape( $user_id );

    if ( is_Current_user( $user_id ) || ! is_Admin()  ) {
        message_display( 'danger' , '管理者ではない、もしくは削除対象が自分自身です' );
        return;
    }

    $query = " 
        DELETE FROM `users` WHERE 
        id = '$user_id'
        ";

    query( $query );

    message_display( 'success' , 'ユーザの削除に成功しました' );
}

これで完了です。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1