dari88's diary

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

kohanaのテスト4・・・データベース操作の新しい書き方

kohana のユーザーガイドを読んでいると、kohana 3.x 以降ではデータベース操作に対してテスト3とは違う方法を推奨しているようです。セキュリティー対策、柔軟な操作を目的に改善されているようです。

2通りの書き方があるようですが、本日夜の部では第1の書き方でサンプルコードを作りました。これは DB::query というショートカットを使う書き方です。この書き方をすると意識しなくても kohana が SQLインジェクションの対策を行なってくれます。

<サンプルコード>
・application/classes/controller/test4.php
 呼び出しているモデル名とテンプレー名を変えただけです。

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

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

    public function action_index() {

        $dat = new Model_Test4; // モデル
        $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('test4table'); // 変数$contentにビューを入れ子にする
        $view->content->data = $result; // テンプレートtest2tableの$dataにモデルの結果を代入する
        $view->post = new View('test3post'); // 変数$postにビューを入れ子にする
        $this->response->body($view); // ビューを表示する
    }

}

?>

・application/classes/model/test4.php
 データベースのクラスを継承する必要がなくなりました。
 メソッドも pablic である必要が無いので変更しました。
 プリペアード・ステートメント方式を使っています。

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

class Model_Test4 {

    function selectData() {
        $query = DB::query(Database::SELECT, "SELECT * FROM test2");
        $result = $query->execute();
        return $result;
    }

    function insertData() {
        $id = '';
        $name = $_POST['name'];
        $address = $_POST['address'];
        $tel = $_POST['tel'];
        $query = DB::query(Database::INSERT, 'INSERT INTO test2 (id, name, address, tel) VALUES (:id, :name, :address, :tel)')
                ->bind(':id', $id)
                ->bind(':name', $name)
                ->bind(':address', $address)
                ->bind(':tel', $tel);
        $result = $query->execute();
        return $result;
    }

    public function updateData() {
        $id = $_POST['id'];
        $name = $_POST['name'];
        $address = $_POST['address'];
        $tel = $_POST['tel'];
        $query = DB::query(Database::UPDATE, 'UPDATE test2 SET id=:id, name=:name, address=:address, tel=:tel WHERE id=:id')
                ->bind(':id', $id)
                ->bind(':name', $name)
                ->bind(':address', $address)
                ->bind(':tel', $tel);
        $result = $query->execute();
        return $result;
    }

    public function deleteData() {
        $id = $_POST['id'];
        $query = DB::query(Database::DELETE, 'DELETE FROM test2 WHERE id = :id')
                ->bind(':id', $id);
        $result = $query->execute();
        return $result;
    }

}

?>

・application/views/test4table.php
 帰ってくるオブジェクトの形式が変わっているので変更しました。

<html>
    <body>
        <table border="1"><tr>
                <?PHP
                foreach ($data as $d) {
                    print "<tr><td>{$d['id']} </td> <td>{$d['name']} </td><td>{$d['address']}</td><td>{$d['tel']}</td></tr>";
                }
                ?>
            </tr></table>
    </body>
</html>

 ・テンプレート test3 と test3post はそのまま流用します。

今日はここまでです。