読者です 読者をやめる 読者になる 読者になる

dari88's diary

これから趣味にするプログラミング/PHP/javascript/kohana/CMS/web design/

kohanaのテスト3・・・指示に従ってデータベースを操作する

今日は kohana のテスト2を拡張してユーザーの指示に従ってデータベースを操作するサンプルコードを作ってみました。kohana のユーザーガイドも結構舌足らずな所が多いんですけど、山勘でこんなんで動くんじゃないの?と類推しながら書いてみたら、動いちゃいました。

<サンプルコード>

・application/classes/controller/test3.php
 テスト2のコードに入力用のテンプレート test3post を追加しました。
 操作内容に応じてモデルから呼び出すメソッドをスイッチします。

<?php defined('SYSPATH') OR die('No direct access allowed.');

class Controller_Test3 extends Controller { //コントローラ

    public function action_index() {

        $dat = new Model_Test3; // モデル
        $message = "";

        if (isset($_POST['operation'])) {

            $select = $_POST['operation'];

            switch ($select) {
                case 'insert':
                    $dat->insertData();
                    $message = "データを追加しました";
                    break;
                case 'update':
                    $dat->updateData();
                    $message = "データをアップデートしました";
                    break;
                case 'delete':
                    $dat->deleteData();
                    $message = "データを削除しました";
                    break;
                default:
                    $message = "データを表示しました";
                    break;
            }
        }

        $result = $dat->selectData();

        // ビュー
        $view = new View('test3'); // テンプレートtest3をビューにセット
        $view->message = $message; // 変数$messageをセット
        $view->content = new View('test2table'); // 変数$contentにビューを入れ子にする
        $view->content->data = $result; // テンプレートtest2tableの$dataにモデルの結果を代入する
        $view->post = new View('test3post'); // 変数$postにビューを入れ子にする
        $this->response->body($view); // ビューを表示する
    }

}
?>

・application/classes/model/test3.php
 追加、修正、削除のメソッドを追加しています。

<?php defined('SYSPATH') or die('No direct script access.');

class Model_Test3 extends Model_Database {

    public function __construct() {
        parent::__construct();
    }

    public function selectData() {
        $sql = "select id,name,address,tel from test2 order by id ASC";
        $result = $this->_db->query(Database::SELECT, $sql, true);
        return $result;
    }

    public function insertData() {
        $name = $_POST['name'];
        $address = $_POST['address'];
        $tel = $_POST['tel'];
        $sql = "INSERT INTO test2 VALUES ('', '$name', '$address', '$tel')";
        $result = $this->_db->query(Database::INSERT, $sql, true);
        return $result;
    }

    public function updateData() {
        $id = $_POST['id'];
        $name = $_POST['name'];
        $address = $_POST['address'];
        $tel = $_POST['tel'];
        $sql = "UPDATE test2 SET id='$id', name='$name', address='$address', tel='$tel' WHERE id = '$id'";
        $result = $this->_db->query(Database::UPDATE, $sql, true);
        return $result;
    }

    public function deleteData() {
        $id = $_POST['id'];
        $sql = "DELETE FROM test2 WHERE id = '$id'";
        $result = $this->_db->query(Database::DELETE, $sql, true);
        return $result;
    }

}

?>

 ・application/views/test3.php
 入力フォーム用の変数 $post の行を追加しています。

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>kohanaのテスト3</title>
                <style type="text/css">
                        body {font -family: Msgothic;}
                        h1 {font-style: italic;}
                </style>
    </head>
    <body>
                <h1><?php echo $content ?></h1>
                <p><?php echo $message ?></p>
                <p><?php echo $post ?></p>
    </body>
</html>

 ・application/views/test3post.php
 データベース操作の指示を入力するフォームです。

<html>
    <body>
        <?php
        echo '<p><実行内容></p>';
        echo '<p>操作: ';
        echo h(@$_POST['operation']) . '</p>';
        echo '<p>ID番号: ';
        echo h(@$_POST['id']) . '</p>';
        echo '<p>名前: ';
        echo h(@$_POST['name']) . '</p>';
        echo '<p>住所: ';
        echo h(@$_POST['address']) . '</p>';
        echo '<p>電話番号: ';
        echo h(@$_POST['tel']) . '</p>';
        echo '<hr />';

        function h($string) { // HTMLでのエスケープ処理をする関数
            return htmlspecialchars($string, ENT_QUOTES);
        }
        ?>
        <form method="post" action="">

            <p>操作を選択して下さい</p>
            <select name="operation" size="2">
                <option value="select" selected="selected">再表示</option>
                <option value="insert">追加</option>
                <option value="update">修正</option>
                <option value="delete">削除</option>
            </select>

            <p>修正・削除の場合はID番号を指定して下さい</p>
            <p>ID番号:<input type="text" name="id" size="3" maxlength="3" value="" /></p>
            <p>名前:<input type="text" name="name" size="20" maxlength="10" value="" /></p>
            <p>住所:<input type="text" name="address" size="50" maxlength="30" value="" /></p>
            <p>電話番号:<input type="text" name="tel" size="15" maxlength="12" value="" /></p>

            <br />
            <input type="submit" value="実行する" />
        </form>
    </body>
</html>

 ・application/views/test2table.php
 これはテスト2で使ったテンプレートを流用します。

これで kohana の Model_Database クラスを使った基本的なデータベース操作を実習できました。このコードには SQLインジェクション対策のための入力値検査とかを書いていないんですけど、kohana がちゃんとチェックしてくれているんですかね?

Model_Database クラスを使うとデータベースの操作が簡単にできるんですけど、マニュアルを読んでいるともっとプリミティブな記述による操作が主流であるような気がします。kohana のサンプルコードはネット上に殆ど公開されていないので、どういう書き方がベストなのかよく分かりません。

追記:
★警告★: application/classes/model/test3.php のコードは SQL インジェクションに対する脆弱性を内包しています。午後の日記に修正版を掲載しました。