こちらの記事でデータベースに対してテーブルを作成する方法とテーブルの一覧を表示させる方法を紹介しました。
今回はデータベースに作成したテーブルを削除する方法を紹介します。
【おさらい】データベースのテーブルを取得して表示する。
前回の記事で作成したテーブル一覧を表示する機能を使って、今作成してあるテーブルを確認します。
aaaというテーブルとhogehogeというテーブルが登録されています。
hogehogeテーブルを削除したと思います。
データベースのテーブルを削除する。
まずはコードです。
前回から微妙に改良してある箇所もあります。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>データベース接続</title>
<style>
table,td,th {
border: 1px solid #000;
padding: 5px;
text-align: center;
}
</style>
</head>
<body>
<form name="myForm" method="post" action="study_database_edit.html">
<select id="code_selection" name="code">
<option value="1">テーブル作成</option>
<option value="2">テーブル一覧</option>
<option value="3">テーブル削除</option>
</select>
<p><label>テーブル名</label><input type="text" name="name" placeholder="hogehoge" pattern="^[0-9A-Za-z]+$"></p>
<p><input type="submit" value="実行"></p>
</form>
<?php
try{
if(isset($_POST['code'])==true){//処理コードがあるか
//データベースにアクセス
$dsn = 'mysql:dbname=test;host=localhost;charset=utf8';
$user = 'root';
$password ='';
$dbh = new PDO($dsn,$user,$password);
$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
switch($_POST['code']){//処理コード別に処理
case 1: //データベースにテーブルを作成する処理
if(isset($_POST['name'])==true && $_POST['name']!=''){
//データベースに対して実行するSQL文を作成
$sql = 'CREATE TABLE IF NOT EXISTS '.$_POST['name'].' (id INT(11) NOT NULL auto_increment PRIMARY KEY,hogehoge TEXT) DEFAULT CHARSET="utf8"';
//SQL文を実行
$result = $dbh->query($sql);
}
break;
case 2: //データベースのテーブルを表示する処理
print '<table><tr><th>№</th><th>テーブル名</th></tr>';
//データベースに対して実行するSQL文を作成
$sql = 'SHOW TABLES FROM test';
//SQL文を実行
$table_stmt=$dbh->prepare($sql);
$table_stmt->execute();
//行番号用変数を用意
$i=1;
//データベースのテーブルすべて読み出すまでループ
while($table_rec = $table_stmt->fetch(PDO::FETCH_ASSOC)){
//連想配列すべてを読み出すまでループ
foreach($table_rec as $key => $val){
//番号とテーブル名とキーを表示
print '<tr><td>'.$i.'</td><td>'.$val.'('.$key.')</td></tr>';
$i+=1;
}
}
print '</table>';
break;
case 3: //データベースのテーブルを削除する処理
if(isset($_POST['name'])==true && $_POST['name']!=''){
//データベースに対して実行するSQL文を作成
$sql = 'SHOW TABLES FROM test';
//SQL文を実行
$table_stmt=$dbh->prepare($sql);
$table_stmt->execute();
//データベースのテーブルすべて読み出すまでループ
while($table_rec = $table_stmt->fetch(PDO::FETCH_ASSOC)){
//連想配列すべてを読み出すまでループ
foreach($table_rec as $key => $val){
//入力したテーブル名と登録してあるテーブル名が一致した場合、dropでテーブル削除
if($val==$_POST['name']){
$sql = 'drop table '.$val ;
$result = $dbh->query($sql);
}
}
}
}
break;
}
}
}
catch (Exception $e){//処理でエラーが発生した時はこちらを実行する
print $e->getMessage();
}
?>
</body>
</html>
上記ファイルをC:\xampp\htdocs\testに保存しましょう。
そして、アクセスします。(ブラウザのURL欄にhttp://localhost/test/study_database_edit.htmlを入力。)
テーブル名にhogehogeを入力して、プルダウンから削除を選択し、実行をクリックします。
そして、テーブル一覧を実行すると、hogehogeが表示されません(消えました)。
要点解説
34行で、今回(テーブル削除)は$_POST[‘code’]が3なので、case3:を処理します。
64行目で、テーブル名を入力した場合に処理するようにします。
66行目~73行目で、データベース上のテーブルをすべて取得します。
75行目で、入力したテーブル名と登録してあるテーブル名が一致した時、dropを実行テーブルを削除します。
(削除したらbreak;してもよいかもしれませんね。)
さらに改良
今のままだと、テーブル一覧を取得するために、実行を押さなくてはいけないので面倒です。
登録してあるテーブルをリスト表示させ、選択して削除できるように修正します。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>データベース接続</title>
<style>
table,td,th {
border: 1px solid #000;
padding: 5px;
text-align: center;
}
</style>
</head>
<body>
<?php
function print_list(){
$dsn = 'mysql:dbname=test;host=localhost;charset=utf8';
$user = 'root';
$password ='';
$dbh = new PDO($dsn,$user,$password);
$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
//データベースに対して実行するSQL文を作成
$sql = 'SHOW TABLES FROM test';
//SQL文を実行
$table_stmt=$dbh->prepare($sql);
$table_stmt->execute();
$ret='';
//データベースのテーブルすべて読み出すまでループ
while($table_rec = $table_stmt->fetch(PDO::FETCH_ASSOC)){
//連想配列すべてを読み出すまでループ
foreach($table_rec as $key => $val){
//番号とテーブル名とキーを表示
$ret .= '<option value="'.$val.'"></option>';
}
}
return($ret);
}
try{
if(isset($_POST['code'])==true){//処理コードがあるか
//データベースにアクセス
$dsn = 'mysql:dbname=test;host=localhost;charset=utf8';
$user = 'root';
$password ='';
$dbh = new PDO($dsn,$user,$password);
$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
switch($_POST['code']){//処理コード別に処理
case 1: //データベースにテーブルを作成する処理
if(isset($_POST['name'])==true && $_POST['name']!=''){
//データベースに対して実行するSQL文を作成
$sql = 'CREATE TABLE IF NOT EXISTS '.$_POST['name'].' (id INT(11) NOT NULL auto_increment PRIMARY KEY,hogehoge TEXT) DEFAULT CHARSET="utf8"';
//SQL文を実行
$result = $dbh->query($sql);
}
break;
case 3: //データベースのテーブルを削除する処理
if(isset($_POST['name'])==true && $_POST['name']!=''){
//データベースに対して実行するSQL文を作成
$sql = 'SHOW TABLES FROM test';
//SQL文を実行
$table_stmt=$dbh->prepare($sql);
$table_stmt->execute();
//データベースのテーブルすべて読み出すまでループ
while($table_rec = $table_stmt->fetch(PDO::FETCH_ASSOC)){
//連想配列すべてを読み出すまでループ
foreach($table_rec as $key => $val){
//番号とテーブル名とキーを表示
if($val==$_POST['name']){
$sql = 'drop table '.$val ;
$result = $dbh->query($sql);
}
}
}
}
break;
}
}
}
catch (Exception $e){//処理でエラーが発生した時はこちらを実行する
print $e->getMessage();
}
?>
<form name="myForm" method="post" action="study_database_edit.html">
<select id="code_selection" name="code">
<option value="1">テーブル作成</option>
<option value="3">テーブル削除</option>
</select>
<p><label>テーブル名</label><input type="text" name="name" list="name_list" placeholder="hogehoge" pattern="^[0-9A-Za-z]+$"><datalist id="name_list"><?=print_list()?></datalist></p>
<p><input type="submit" value="実行"></p>
</form>
</body>
</html>
元々あったテーブル表示のセレクトボックスを削除して、代わりにデータリストで一覧表示させています。
テキストボックスの右側の▼をクリックすると、データベースに登録してあるテーブルがすべて表示され、選択できるようになっています。
削除するときは選択して実行すれば削除できます。