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 はそのまま流用します。
今日はここまでです。