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

前回の続き

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

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

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

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

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

# 実装手順

①データベースに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' , 'ユーザの削除に成功しました' );
}

```

これで完了です。