17.PHPでユーザの削除を行ってみる。
1)ユーザ名とパスワードを指定して削除を行うためのページ(userDel.html)
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>ユーザ削除</title>
</head>
<body>
ユーザ削除<br>
削除するユーザのユーザ名とパスワードを入力してください。<br>
<form action="userDel.php" method="post" name="form1">
削除するユーザ名:
<input name="fUserName" type="text"><br>
削除するユーザのパスワード:
<input name="fPassWd" type="text">
<input type="submit" name="Submit" value="削除">
<input type="reset" name="Submit2" value="クリア">
</form>
</body>
</html>
2)ユーザ名とパスワードを使って削除を行うページ(userDel.php)
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>ユーザ削除</title>
</head>
<body>
<?php
$sUserName=$_POST['fUserName'];
$sPassWd=$_POST['fPassWd'];
$conn=mysqli_connect('localhost','root','******') or exit("MySQLへ接続できません。");
mysqli_select_db($conn,'userid_db') or exit("データベース名が間違っています。");
$sql="SELECT * FROM userid_tbl where userName='{$sUserName}' AND passWd='{$sPassWd}';";
$result=mysqli_query($conn,$sql) or exit("データの抽出に失敗しました。");
if(mysqli_num_rows($result)!=0){
$sql="DELETE FROM userid_tbl WHERE userName='{$sUserName}' AND passWd='{$sPassWd}';";
$result=mysqli_query($conn,$sql) or exit("データの抽出に失敗しました。");
echo $sUserName."様は、削除されました。";
}
else{
?>
<span style="color:red;"><?= $sUserName ?>様は、存在しません。もう一度やり直してください。</span><br>
ユーザ削除<br>
<form action="userDel.php" method="post" name="form1">
削除するユーザ名:
<input name="fUserName" type="text"><br>
削除するユーザのパスワード:
<input name="fPassWd" type="text">
<input type="submit" name="Submit" value="削除">
<input type="reset" name="Submit2" value="クリア">
</form>
<?php
}
mysqli_close($conn);
?>
</body>
</html>
3)
削除するユーザを選択するメニューページ(userDeleteMenu.php)
データベースの「id」列と「userName」列の情報を「,」区切りで送信するようにしています。
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>ユーザ選択削除</title>
</head>
<body>
削除メニュー<br>
<?php
$conn=mysqli_connect('localhost','root','*******') or exit("MySQLへ接続できません。");
mysqli_select_db($conn,'userid_db') or exit("データベース名が間違っています。");
$sql="SELECT * FROM userid_tbl;";
$result=mysqli_query($conn,$sql) or exit("データの抽出に失敗しました。");
?>
<form action="userSelectDelete.php" method="post">
<table border="1">
<tr>
<th>削除チェック</th><th>userName</th><th>passWd</th>
<?php
while($userid=mysqli_fetch_array($result,MYSQL_ASSOC)){
?>
<tr>
<td><input type="checkbox" name="del[]" value="<?= $userid['id'] ?>,<?= $userid['userName'] ?>"></td>
<td><?= $userid['userName'] ?></td>
<td><?= $userid['passWd'] ?></td>
</tr>
<?php
}
mysqli_close($conn);
?>
</table>
<input type="submit" value="削除">
</form>
<body>
</body>
</html>
上記プログラムで、赤字の部分は、データベースの「id」列と「userName」列のデータを「,」区切りのデータ(文字列)にして、チェックボックスにチェックが入っている項目のみその
データを送信しています。
4)
選択されたユーザを削除するページ(userSelectDelete.php)
クライアントから送信されてきた「,」区切りのデータを「id」列と「userName」列に分解して「id」列の情報でそれに対応する行を削除します。
「userName」列のデータは、削除されたユーザ名を表示させるために使っています。
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>ユーザ選択削除結果</title>
</head>
<body>
<?php
$conn=mysqli_connect('localhost','root','******') or exit("MySQLへ接続できません。");
mysqli_select_db($conn,'userid_db') or exit("データベース名が間違っています。");
$sql="SELECT * FROM userid_tbl;";
$result=mysqli_query($conn,$sql) or exit("データの抽出に失敗しました。");
if(isset($_POST['del'])){
for($i=0;$i<count($_POST['del']);$i++){
$split=explode(",",$_POST['del'][$i]);
$sql="DELETE FROM userid_tbl WHERE id={$split[0]};";
$result=mysqli_query($conn,$sql) or exit("データの抽出に失敗しました。");
echo "{$split[1]}様を削除しました。<br>\n";
}
?>
削除後のデータは、以下になります。<br>
(削除もできます。)<br>
<form action="userSelectDelete.php" method="post">
<table border="1">
<tr>
<th>削除チェック</th><th>userName</th><th>passWd</th>
<?php
$sql="SELECT * FROM userid_tbl;";
$result=mysqli_query($conn,$sql) or exit("データの抽出に失敗しました。");
while($userid=mysqli_fetch_array($result,MYSQL_ASSOC)){
?>
<tr>
<td><input type="checkbox" name="del[]" value="<?= $userid['id'] ?>,<?= $userid['userName'] ?>"></td>
<td><?= $userid['userName'] ?></td>
<td><?= $userid['passWd'] ?></td>
</tr>
<?php
}
}
else{
?>
削除するデータが選択されていません。<br>
もういとどやり直してください。<br>
<form action="userSelectDelete.php" method="post">
<table border="1">
<tr>
<th>削除チェック</th><th>userName</th><th>passWd</th>
<?php
$sql="SELECT * FROM userid_tbl;";
$result=mysqli_query($conn,$sql) or exit("データの抽出に失敗しました。");
while($userid=mysqli_fetch_array($result,MYSQL_ASSOC)){
?>
<tr>
<td><input type="checkbox" name="del[]" value="<?= $userid['id'] ?>,<?= $userid['userName'] ?>"></td>
<td><?= $userid['userName'] ?></td>
<td><?= $userid['passWd'] ?></td>
</tr>
<?php
}
}
?>
</table>
<input type="submit" value="削除">
</form>
<?php
mysqli_close($conn);
?>
</body>
</html>
上記のプログラムで、
赤字の部分「①」で使用されている「explode()」関数は、文字列の中の区切り文字列で文字列を分解する関数です。関数のフォーマットは、以下のようになります。
<書式>
explode(区切り文字列,分解する文字列[,使用する配列の長さ(数)])
「使用する配列の長さ(数)」は、指定した数分の配列を用意し、配列の長さより区切り文字列の数の方が多い場合は、最後の配列に残りの文字列が格納されます。
負の値を指定した場合は、「必要な配列の長さ-指定した値」
分だけ分解します。
省略した場合は、すべてを区切り文字列で分解してそれぞれを配列に代入します。
戻り値:区切り文字列で分解された文字列の配列を返します。
区切り文字列がに空文字列(ヌル)
が指定された場合は、「FALSE」を返します。
<例>
$str=explode(",","abc,def,ghi") を実行した場合、文字列の配列は以下のようになります。
$str[0] ← "abc"
$str[1] ← "def"
$str[2] ← "ghi"
<課題1>
上記、3)、4)のプログラムでは、「id」列と「userName」列を「,」区切りの文字列として送信し受信側でその文字列を「,」区切りで分解して「userName」列が表示できるように処理
しています。区切り文字列を使わずに「id」列のみを送信し、4)のプログラムのように削除されたユーザ名が表示できるようにしてください。
<課題2>
4)のプログラムで「for文」の中でSQL文を作成しクエリーを実行していますが、「for文」で削除する行すべてを削除するSQL文を作成し、クエリーの実行は、一回のみでできるように
プログラムを修正してください。