FuelPHPでデータベース接続

今日は、FuelPHPでデータベースに接続してみたいと思います。

1) MySQLの接続情報をセットします。下記のコードを修正します。データベースは事前に作成しておきます。私は、以前テスト用に作成してある『test』、パスワードは『1234』としてありますが、ご自身のパソコンの状況に合わせて下さい。

fuel/app/config/development/db.php

<?php
 return array(
 'default' => array(
 'connection' => array(
 'dsn' => 'mysql:host=localhost;dbname=test',
 'username' => 'root',
 'password' => '1234',
 ),
 ),
 );

2) コントローラsample1.phpを修正します。まず、データベースに接続します。直接SQLを入力する方法と、メソッドチェーンでつなぐ方法があります。順に見ていきます。

$query=DB::query(‘SELECT * FROM dvd’)->execute();

これは、直接、SQLを入力する方法です。SQLインジェクション攻撃に対するエスケープ処理が必要です。

3) 次に、メソッドチェーンでつなぐ方法です。この方法ならSQLインジェクション攻撃に対するエスケープ処理が施されています。初心者ならこちらの方法がいいと思います。

$query=DB::select()->from(‘dvd’)->execute();

4) ビュークラスを呼び出したら、ビューにデータベース情報を渡します。最初

$view->set_global(‘query’,$query);

とコードを記述していました。すると、下記のようなエラーが表示されました。『データベースの結果は、読み込み専用です』という意味でしょうか。

5) これには悩みました。testメソッドを作成して試してみました。コントローラで直接echoしたら、データはきちんと表示されるので、データベース接続に異常はなさそうです。

public function action_test()
 {
 //データベース接続
 $query = DB::select()->from('dvd')->execute();
 foreach($query as $row):
 echo $row['Title']."<br>";
 endforeach;
 }

6) また、ビュー上でデータベースを呼び出してもこれも問題なく表示されます。

<div class="content">
<h1>ようこそ<?=$title?></h1>
<p><?=$description?></p>
<?php $query = DB::select()->from('dvd')->execute()?>
<table width="100%" border="1">
 <tr>
 <th scope="col">タイトル</th>
 <th scope="col">内容</th>
 </tr>
<?php foreach ($query as $row): ?>
 <tr>
 <td><?=$row['Title']?></td>
 <td><?=$row['Content']?></td>
 </tr>
<?php endforeach;?>
</table>
</div>

7) 理由がわからず、迷っていたら、『FUELBEANS』様のサイトに理由が書いてありました。『FUELBEANS』様、ありがとうございました。つまり、デフォルトでView::forgeメソッドは、フィルターがかかっているので、ビューにデータを渡すときにフィルターが自動的に書き込みに行き、エラーになっているとの事でした。データベースの結果をビューに渡す場合は、as_array()関数を使うことがわかり、やっと解決できました。下記のように修正しました。

$view->set_global(‘query’,$query->as_array());

8) 下記にaction_indexのコードを記述しておきます。

fuel/app/classes/controller/sample1.php

public function action_index()
 {
 //データベース接続
 $query = DB::select()->from('dvd')->execute();
 //ビュークラスのforgeメソッドの呼び出し
 $view=View::forge('sample1/content');
 //データベース情報の引き渡し
 $view->set_global('query',$query->as_array());
 //基本データのセット
 $view->set_global('title','WinRoad徒然草');
 $view->set_global('description','FuelPHPのテストサイトです');
 //ビューファイルのネスト
 $view->header=View::forge('sample1/header');
 $view->content=View::forge('sample1/content');
 $view->footer=View::forge('sample1/footer');
 return $view;
 }

9) それでは、前回作成したビューファイルcontent.phpを修正します。

fuel/app/views/sample1/content.php

<div class="content">
 <h1>ようこそ<?=$title?></h1>
 <p><?=$description?></p>
 <table width="100%" border="1">
 <tr>
 <th scope="col">タイトル</th>
 <th scope="col">内容</th>
 </tr>
 <?php foreach ($query as $row): ?>
 <tr>
 <td><?=$row['Title']?></td>
 <td><?=$row['Content']?></td>
 </tr>
 <?php endforeach;?>
 </table>
 </div>

10) ブラウザで確認してみます。無事データが表示されました。

本日はかなり悪戦苦闘しました。

このエントリーを含むはてなブックマーク Buzzurlにブックマーク livedoorクリップ Yahoo!ブックマークに登録

トラックバック&コメント

この投稿のトラックバックURL:

トラックバック

コメント

  1. 通りがかり より:

    こんにちわ。
    fuelをこの土日で勉強している者です。プログラムは趣味レベルなので浅いのですが・・。

    他の方もfuelを使われている中で、
     //データベース接続
      $query = DB::select()->from(‘dvd’)->execute();
    こういったDBの記述を、Controller内で書かれている事が多いですね。
    Modelの方に書くものだと思っていたのですが、これはなぜでしょうか?
    (サンプルのStationWagonもそのように書かれていましたが・・。)

    質問ですいません。

    • nakada より:

      コメントありがとうございます。
      さて、質問の件ですが、以下は、私の見解ですので、1つの意見として聞いて下さい。
      FuelPHPの標準のモデルは単なるPHPのクラスで、通常のライブラリと本質は変わりありません。複雑で使用頻度の高いコードはモデルに記述(クラス化)して、モデルから呼び出したりしますが、単純なコードをわざわざモデルを作成して、クラス化するのは、非効率です。ですので、単純なコードはコントローラ内に直接記述しているのではないでしょうか。尚、FuelPHPにはデータベースのCRUD処理をするメソッドや、ORMパッケージも付属していますので、これらを使えば、コントローラ内の記述もかなり簡略化されます。

      • 通りがかり より:

        御礼が遅くなって申し訳ありません。

        なるほど、作業の効率と、Fuelが準備しているメソッドがスマートである故という視点ですね。
        ありがとうございます。モヤモヤしていましたがスッキリしました!

  2. ドキンちゃん より:

    blogを参考にしながら、勉強させてもらってます。
    $query=DB::select()->from(‘xxx’)->excute();
    こちら、なぜかエラーが出て、うーーんと悩んだところ、
    excute → execute でした、、。

    • nakada より:

      ドキンちゃん
      コメントありがとうございます。
      3)の箇所のexcuteですね。早速修正させていただきます。
      FuelPHPも面白いのですが、私は今、Laravelに夢中です。
      しばらくはLaravelの記事が集中すると思いますので、Laravelの記事も読んでくださいね。
      Laravelはかなり学習コストが低く短期間で習得できそうです。
      これからもよろしくお願いします。


コメントをどうぞ

このページの先頭へ