• ベストアンサー

PHPコードの中から、SQL文を外に出したい!

いわゆるO/Rマッパーというものが心理的に好きになれません。 簡単なSQLの処理をするメソッドぐらいなら自分で書けますし、 かといって複雑なSQLの処理をするメソッドは、そのメソッドの 操作自体がSQLの複雑さを上回ってしまっており本末転倒です。 かといって、PHPのコードの中に、グチャグチャとSQLがあるのも 見苦しいです。 Smarty がきちんと「見える形」でHTMLを外に出してくれてるのと同様に、 SQL をきちんと「見える形」で外に出せるモジュールはないものでしょうか? (O/RマッパーのSQLは、「見えない形」で、結局PHPの中にいるので、 一層タチが悪い気がします。) それとも、いっそのこと Smarty を使うのがいいのでしょうか? 例) SELECT {foreach from=$column item=item}...{/foreach} FROM table WHERE {foreach from=$where item=item}...{/foreach} ※でも、これもある意味ややこしいし、Smartyのインスタンスを 何個も作るのは重そうなので、避けたいですが・・・。 ある人は、「簡単な処理は O/Rマッパーに、複雑なSQLは直書きで」 と言います。 まるで、「簡単なHTMLはテンプレートに、複雑なHTMLは直書きで」 という理論と同じ気がします。 どっからが複雑で、どこまでが簡単なのかは人によりますよね。 同じ思いの方、「こんなモジュールがある」「僕はこうしてる」等の アドバイスを頂けたら幸いです。

質問者が選んだベストアンサー

  • ベストアンサー
  • inu2
  • ベストアンサー率33% (1229/3720)
回答No.2

普通はDAOクラス作って、その中に押し込めますよ。 SELECT id,name,foo,hoge FROM table WHERE id = :id とかつくっといて、プリペアすらいいかと思われます。 ソース内にSQL書くのいやだー というのであれば、 データベースの種類やバージョンにもよりますが、ストアドプロシージャ使うとか いろいろ手は有るかと思いますよ。 結局、SQL文があちこちのソース内に点在するのがメンテナンス性を下げるわけで。マッパーつくるのも手かとは思いますが、 DAOクラス作って、そこに全部押し込めておけば良いかと思います。

sweepea
質問者

お礼

ご回答ありがとうございます。 やはりDAOクラスになりますか。 > id = :id そういえば、こういうプレースホルダも使えるんですね。 普段、?を使っていたので、:name を利用することで、 多少分かりやすくなるかもしれません。 DAOクラスって、テーブルのスキーマをもう一回書かないといけない というイメージがありましたが、 http://symfony.xrea.jp/1.0/book/01-Introducing-Symfony.html#%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%83%AA%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%AB%E3%83%9E%E3%83%83%E3%83%94%E3%83%B3%E3%82%B0%28ORM%29 を読んでいる限りでは、やはり便利そうですね。 Creole + Propel を勉強してみます。 (↑これって、PHPで、最もメジャーな組み合わせなんですか?) ありがとうございました。

その他の回答 (1)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

SQLの種類にもよるのでしょうけど、最近はプリペアドステートメントが はやりだとか・・・ ちなみに、私は基本的にはhtmlにしてもsqlにしても、メンテナンス性を高めるため ほとんど外部ファイル化するようにしています。 なので、一つのページにいかがセットになることが多いです。 hoge.php/hoge.htm/hoge.js/hoge.css/hoge.sql/hoge.doc ただしセキュリティの問題があるのでなんでもかんでも外部化するって わけにもいかないでしょうし、バランスを見ながらの運用になります

sweepea
質問者

お礼

ご回答ありがとうございます。 やはり外部ファイル化されていますか。 それは、file_get_contents とかで取って来るといった感じでしょうか。 > バランスを見ながらの運用になります そうですね。そこの見極めが結構難しいですね。 ありがとうございました。

関連するQ&A