ご注意ください

このWikiに書かれた情報は、Risoluto1.x系に関するものです。 Risoluto1.x系は開発が終了しており、現在Risoluto2.x系の開発が進められています。

最近の更新

2012-10-11
2012-04-05
2012-03-27

Latest File Release

risoluto (1.3.1)2011-09-27 15:41
risoluto-upgrade (1.3.0 to 1.3.1)2011-10-24 15:51
simpleblog (1.4.0)2011-10-19 14:50
simpleblog-upgrade (1.2.0 to 1.3.0)2011-07-21 23:13
simplepage (1.3.0)2011-10-19 14:45
simplepage-upgrade (1.1.0 to 1.2.0)2011-07-21 23:15

Wikiガイド

サイドバー

戻る

Step9:データベースを使ってみる

このチュートリアルを行う前に……

  • Risolutoのセットアップが終了している必要があります
  • これまでのチュートリアルを理解している必要があります

ユーティリティメソッドを使ってみる

このチュートリアルでは、データベースを使う方法についてご説明したいと思います。

今までとは違い、ちょっとややこしい手順が必要となります。とはいうものの、通常のPHPやPEARを使ったDB操作に慣れているのであれば、問題なく使用できるはずです。また、今回はBaseは変更しません*1

それでは、実際のコードを見てみましょう。下記のコードを「sample09.php」として保存してください。

  1. <?php
  2. require_once( 'samples_base.inc' );
  3. require_once( RISOLUTO_FUNC . 'risoluto_db.php' );
  4. class sample09 extends samples_base
  5. {
  6. public function model()
  7. {
  8. $obj_db = new RisolutoDb();
  9. if ( $obj_db->dbConnect( $this->obj_conf->get( 'DBS', 'DEFAULT_DSN' ) ) )
  10. {
  11. $sql =<<<End_Of_SQL
  12. SELECT *
  13. FROM `risoluto_t_user` user
  14. WHERE `user`.`user_id` = ?
  15. End_Of_SQL;
  16. $param = array(
  17. 0
  18. );
  19. $tmp_result = $obj_db->dbGetRow( $sql, $param );
  20. if ( PEAR::isError( $tmp_result ) )
  21. {
  22. throw new Exception( 'select error' );
  23. return false;
  24. }
  25. $obj_db->dbDisConnect();
  26. }
  27. else
  28. {
  29. throw new Exception( 'DB Connection Failure' );
  30. return false;
  31. }
  32. $this->obj_sess->sessStore( $this->obj_sess->sessLoad( 'currentact' ), $tmp_result );
  33. }
  34. public function view()
  35. {
  36. $tmp_val = $this->obj_sess->sessLoad( $this->obj_sess->sessLoad( 'currentact' ) );
  37. $this->smarty->assign ( 'value', print_r( $tmp_val, true ) );
  38. $this->smarty->display( 'sample09.tpl' );
  39. }
  40. }
  41. ?>

いかがでしょうか。今までのチュートリアルの内容をすべて盛り込んだかのようなコードになっていますね。ちょっと難しく感じるかもしれませんが、この例をパターンとして覚えていただければ、他に応用ができます。よく読めばさほど難しいことはしていませんので、理解できるまでしっかりこのチュートリアルに取り組んでください。

では、重要ポイントを順番に解説していきましょう。

まず、データベースへ接続しなければなりません。それを行っているのが、「$obj_db->dbConnect( $this->obj_conf->get( 'DBS', 'DEFAULT_DSN' ) )」の部分です。ここでは、コンフィグファイル(risoluto.ini)に定義されているDSNを取得し、接続を行っています。おすすめはしませんが、DSNを直接ここに書いても構いません。このメソッドはエラーが発生した場合*2に、Falseを返却します。このようにif文を用いることで、それを判定してます。

続いて、実行するSQLの組み立てとパラメタの設定を行っています。それぞれ「$sql」と「$param」という変数にセットされています。SQL内に「?」*3を記述し、$paramに対応する値がセットされた変数を指定すると、実行時に値がアサインされます*4。もし、$sqlの中に1つも「?」がないのであれば、$paramは指定する必要はありません*5

SQL等の準備ができたら、SQLを実行します。上記のコードで言えば、「$tmp_result = $obj_db->dbGetRow( $sql, $param );」の部分がそれです。この「dbGetRow()」は、結果が1レコードのみの場合に使用します。もし、複数レコードが得られる可能性がある場合は、「dbGetAll()」を使用してください。また、SELECT文以外のSQLを実行したい場合*6は、「dbExecSQL()」を使用してください*7

実行した結果、何もなければ実行結果が得られます。もし、何らかのエラーが発生した場合は、MDB2::Errorオブジェクトが返却されます。すなわち、エラーが発生したかどうかを判定するためには、返却されたものが「MDB2::Errorオブジェクト」であるかを判定すればよいということになります。上記の例では、if文中の「PEAR::isError( $tmp_result )」の部分で判定しています。

データベースに接続できなかったり、SQLの実行に失敗した場合エラー処理を行いたいと考えるかもしれません。その場合、例外をスローすることで、コントローラに「異常が発生した」ということを通知することができます。コントローラは例外を受け取った後、当該クラスのerrHandler()メソッドをコールします*8

Design側のコードもここで提示させていただきます。下記のコードを「sample09.tpl」として保存してください。

  1. <HTML>
  2. <HEAD>
  3. <TITLE>sample09</TITLE>
  4. </HEAD>
  5. <BODY>
  6. <PRE>{$value}</PRE>
  7. </BODY>
  8. </HTML>

これらのファイルをアップロードし、最初の画面にWebブラウザからアクセスすると、DBから取得した値が出力されるのが確認できるかと思います。

これ以外にもいろいろなメソッドが用意されています。データベース操作クラスについて詳しく知りたい場合は、RisolutoDbクラス(risoluto_db.php)を参照してください。

チュートリアルはこれで終了です

ここまで進めてきた皆様、お疲れ様でした。Risolutoのチュートリアルはこれで終了です。基本的にはこれまでにチュートリアルで学んだことに加え、すでに皆様がご存じのPHPやPEARなどの知識を使ってアプリケーションを構築していくことになります。

もちろん、これまでに紹介したものを一切使わず、他の方法で構築することも可能です。どうぞRisolutoを自由に使ってください。

Risolutoが貴方にとって価値のあるものであることを願っています。

戻る


  1. *1同一Cage内に存在するすべてのActがDBアクセスを必要とする場合、以降に記載する内容の一部または全部をBaseに書いても構いません
  2. *2例えば、DSNが間違っていて接続できなかった場合など
  3. *3使えるのはこれだけではありませんが、話をシンプルにするため他は省略します
  4. *4言うまでもありませんが、「?」の数と$paramにセットされた変数の数は一致しなければなりません
  5. *5単に「$param = array();」と書いておけばOKです
  6. *6INSERTやUPDATE、DELETEなどがそれにあたります
  7. *7ほとんどの場合、トランザクションを使いたくなることでしょう。その場合、「dbBeginTransaction()」、「dbCommit()」、「dbRollback()」を使用してください
  8. *8すでにお気づきの方も多くいらっしゃるかと思いますが、ここまでに作ってきたerrHandler()は何も書かれてませんので、各自必要な処理をBase中のerrHandler()に記載する必要があります