いわゆる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は直書きで」
という理論と同じ気がします。
どっからが複雑で、どこまでが簡単なのかは人によりますよね。
同じ思いの方、「こんなモジュールがある」「僕はこうしてる」等の
アドバイスを頂けたら幸いです。
No.2ベストアンサー
- 回答日時:
普通はDAOクラス作って、その中に押し込めますよ。
SELECT id,name,foo,hoge FROM table WHERE id = :id
とかつくっといて、プリペアすらいいかと思われます。
ソース内にSQL書くのいやだー というのであれば、
データベースの種類やバージョンにもよりますが、ストアドプロシージャ使うとか いろいろ手は有るかと思いますよ。
結局、SQL文があちこちのソース内に点在するのがメンテナンス性を下げるわけで。マッパーつくるのも手かとは思いますが、
DAOクラス作って、そこに全部押し込めておけば良いかと思います。
ご回答ありがとうございます。
やはりDAOクラスになりますか。
> id = :id
そういえば、こういうプレースホルダも使えるんですね。
普段、?を使っていたので、:name を利用することで、
多少分かりやすくなるかもしれません。
DAOクラスって、テーブルのスキーマをもう一回書かないといけない
というイメージがありましたが、
http://symfony.xrea.jp/1.0/book/01-Introducing-S …
を読んでいる限りでは、やはり便利そうですね。
Creole + Propel を勉強してみます。
(↑これって、PHPで、最もメジャーな組み合わせなんですか?)
ありがとうございました。
No.1
- 回答日時:
SQLの種類にもよるのでしょうけど、最近はプリペアドステートメントが
はやりだとか・・・
ちなみに、私は基本的にはhtmlにしてもsqlにしても、メンテナンス性を高めるため
ほとんど外部ファイル化するようにしています。
なので、一つのページにいかがセットになることが多いです。
hoge.php/hoge.htm/hoge.js/hoge.css/hoge.sql/hoge.doc
ただしセキュリティの問題があるのでなんでもかんでも外部化するって
わけにもいかないでしょうし、バランスを見ながらの運用になります
ご回答ありがとうございます。
やはり外部ファイル化されていますか。
それは、file_get_contents とかで取って来るといった感じでしょうか。
> バランスを見ながらの運用になります
そうですね。そこの見極めが結構難しいですね。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP アコーディオンPHPが上手くいかない 3 2022/07/15 16:29
- PHP PHP MySql ページング 2 2022/09/20 06:38
- MySQL 書籍の内容はまともでしょうか? 1 2023/01/22 03:07
- MySQL #1062 - '0' は索引 'PRIMARY' で重複しています。とでています。 1 2023/01/01 06:13
- その他(ブログ) ブログの作成 2 2023/06/25 09:11
- Access(アクセス) アクセス 有効なフィールド名、または式として認識できませんのエラー 3 2022/08/19 11:53
- SQL Server [SQLServer] テーブル名からカラム名を取得する 1 2022/08/23 21:20
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- PHP 重複を防ぐ記述について教えて下さい。 3 2023/04/03 14:35
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
どういうプログラムを関数化を...
-
protectedなのにアクセスできな...
-
PHPの変数値をリンクさせたい
-
可変変数にアロー演算子を使いたい
-
PHPプログラム上で「URLを直接...
-
PHPでXMLの置換 replaceData
-
既存関数の上書き
-
VBA コレクションに2次元配列...
-
【シェル】case文でワイルドカ...
-
VB.NETSystem.Xml 要素数を得る...
-
classの再定義エラーについて
-
ExcelVBAで部分一致(*)をしたい
-
関数から関数を呼び出したとき...
-
.htaccessについて
-
tmhOAuthでtwitterに画像投稿
-
issetで変数の存在をチェックし...
-
Dosブロンプトでtabを出力したい
-
wordの差し込み印刷で文字...
-
「取得先」という表現について
-
Excel VBA:特定の文字列以降(...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA コレクションに2次元配列...
-
エラーの理由が分りません。Pri...
-
可変変数にアロー演算子を使いたい
-
VB.NETからVBAマクロ(引数)を呼...
-
PHP、ヒアドキュメント内でのIF...
-
VB.NETSystem.Xml 要素数を得る...
-
どういうプログラムを関数化を...
-
vb作成したらでbeep音が鳴りま...
-
次のhtml・cssでspan内の文字を...
-
classの再定義エラーについて
-
既存関数の上書き
-
protectedなのにアクセスできな...
-
配列の操作時にLNK2001外部シン...
-
UNIX CP "で上書きしません"
-
PHPでの画像の形式の変換
-
PHPプログラム上で「URLを直接...
-
Let's Encryptで自動更新がされ...
-
ExcelVBAで部分一致(*)をしたい
-
VB6のコンボボックスのテキスト...
-
ASPのResponse.WriteをPHPでは...
おすすめ情報