【データを削除しよう】PHPでデータベースのテーブルを削除する方法

PHP PHP

こちらの記事でデータベースに対してテーブルを作成する方法とテーブルの一覧を表示させる方法を紹介しました。

今回はデータベースに作成したテーブルを削除する方法を紹介します。

【おさらい】データベースのテーブルを取得して表示する。

前回の記事で作成したテーブル一覧を表示する機能を使って、今作成してあるテーブルを確認します。

テーブル一覧

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>
テーブルリスト表示

元々あったテーブル表示のセレクトボックスを削除して、代わりにデータリストで一覧表示させています。
テキストボックスの右側の▼をクリックすると、データベースに登録してあるテーブルがすべて表示され、選択できるようになっています。
削除するときは選択して実行すれば削除できます。