前回の続き
概要
簡易掲示板にユーザ削除機能を追加する。
仕様としては、ユーザを管理者と一般ユーザに分けて管理者のみユーザ削除ができるようにする。
なぜ、ユーザ削除機能が必要なのか?
悪質な書き込みをするユーザを管理者側で削除できるようにしたいため。
必要なページをリストアップする。
ユーザ一覧画面でユーザ削除ボタンを設置して、ユーザ一覧画面で削除処理を行うため、ページの追加は不要。
実装手順
①データベースに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' , 'ユーザの削除に成功しました' );
}
これで完了です。