• ベストアンサー

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は直書きで」 という理論と同じ気がします。 どっからが複雑で、どこまでが簡単なのかは人によりますよね。 同じ思いの方、「こんなモジュールがある」「僕はこうしてる」等の アドバイスを頂けたら幸いです。

  • PHP
  • 回答数2
  • ありがとう数4

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

  • ベストアンサー
  • 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

  • SQL及びSMARTYの利用

    お世話になります SMARTYとmySQLを利用してサイトを構築しています。 下記の様なSQLデータからデータを一行ずつ生成したいです。 名前だけは取り出すことが出来たのですが、年齢の取り出し方が判りません。 アドバイスをお願い致します SQL------------------------------------------------------------------- ---------------------------- | id | namae | age | ---------------------------- | 1 | 田中 | 22 | ---------------------------- | 2 | 佐藤 | 29 | ---------------------------- PHP------------------------------------------------------------------- //空の配列を用意 $name = array(); //SMARTY用の代入変数を生成 while($data = $res -> fetchRow()){ array_push($name,mb_convert_encoding($data['namae'],"SJIS","UTF-8")); } $smarty->assign("namae",$name); HTML------------------------------------------------------------------ {foreach from=$namae item=namae} {$namae}{$age}<br> {/foreach} ----------------------------------------------------------------------

    • ベストアンサー
    • PHP
  • PHPとSmartyの関連について

    PHPとSmartyの関連について PHPからSmartyに出力しているのですが中身がNULLになります。 データベースアクセスにはPDOを使用しています。 PHPソース DBアクセス $SQL = "select ITEM_ID from ITEM_TBL limit 0, 3"; $STMT = $GLOBALS["PDO"] -> query($SQL); $ROW = $STMT -> fetchAll(PDO::FETCH_ASSOC); Smartyでアサイン $smarty -> assign("ITEM_LIST", $ROW); Smartyソース <table> {{foreach from=$ITEM_LIST item=LIST}} <tr> <td>{{$LIST.ITEM_ID}}</td> </tr> {{/foreach}} </table> のような感じでページ出力したいのですが、表示をすると中身がNULLでした。 PHP側で var_dump($ROW); を行うと array(3) { [0]=> array(1) { ["ITEM_ID"]=> string(1) "1" } [1]=> array(1) { ["ITEM_ID"]=> string(1) "2" } [2]=> array(1) { ["ITEM_ID"]=> string(1) "3" } } 中身が配列で格納されています。 smarty側で {$ITEM_LIST|@var_dump} を行うと array(3) { [0]=> NULL [1]=> NULL [2]=> NULL } でした。 いろいろとやってみたのですが、わからなくなってしまったので どなたかご教授いただけませんでしょうか。よろしくお願いします。

    • 締切済み
    • PHP
  • 【PHP】smartyとPHPの記述違いとメリット

    smartyというのが、デザインとプログラムを分けれるというので 使ってみたのですが、 //--------------------smarty--------------------- <table border=1> <tr> <th>{$table.title}</th> </tr> {foreach item=result from=$data_list} <tr> <td>{$result[0]}</td> </tr> {/foreach} </table> と、smarty用の記述をHTML内にいろいろ書かなければならず //------------------php---------------------- <table border=1> <tr> <th><?=$table[title] ?></th> </tr> <?php foreach($data_list as $key => $value){ ?> <tr> <td><?= $value ?></td> </tr> <?php } ?> </table> とHTML内にPHPをいろいろ書くのと  あまり大差無い気がして どういう点がよいのがイマイチ分かりません。 smartyは 使う メリットは どういうものがあるのでしょうか。

    • ベストアンサー
    • PHP
  • PHP PDO prepare後のsql変更

    $sql = "select item from items"; $pdo->prepare($sql); とした後に $sql に where 句を後付でつけることなど出来ますか?

    • ベストアンサー
    • PHP
  • PHPとSmartyを使い、データベースからのデータを表示したい。

    PHP・Smartyを使い、DBからの表示を行おうとしています。 基本的な作業だとは思うのですが、なかなかできないので、教えてください。 ソースコードです。 //////PHPのコード <?php require_once('Connections/dbconn_mylocal.php'); ?>//DBへの接続を行っている。ここは正常。 <?php $sql = 'SELECT * FROM c_movie'; $result = mysql_query($sql, $conn); while($row = mysql_fetch_array ($result)){ $movie = $row["movie_title"]; } $smarty->assign('movie', $movie); $smarty->display("test1120.tpl"); ?> /////////////////tplファイル <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Smartyで表示する</title> </head> <body> ({foreach item='con' from=$movie}) ({$con}) ({/foreach}) </body> </html> よろしくお願いします!

    • ベストアンサー
    • PHP
  • PHPで文字列検索

    過去に出ていそうなのですが、見つける事が出来ませんでした。 すいませんがどうか宜しくお願い致します。。 HTML,PHP,MYSQLを用いてDBから取得した情報をHTMLに表示させたいのですが、 $sql = " SELECT  ITEM_ID, ITEM_NM FROM ITEM_LIST WHERE ITEM_DIV = "食品""; とすると、" "の中で文字列を指定している""でエラーが出てしまいます。 SELECT ITEM_ID, ITEM_NM FROM ITEM_LIST WHERE ITEM_DIV = "食品" 単体では正常に動作出来ています。 ご教授宜しくお願い致します。 (環境) PHP 5.2.6

    • ベストアンサー
    • PHP
  • SQL文で困っています。

    ID(NUMBER型)と NUM(NUMBER型)と nenngetu (date型)を持ったテーブルAAAから、 ID=1000 のなかで日時が一番古い処理NOをselectするSQL文を書きましたが上手く実行されません。 select NUM from AAA where nenngetu = (select min(年月) from D_KR_SAP_IFRIREKIKANRI) and ID=1000; ID=1000の条件をはぶき、 select NUM from AAA where nenngetu = (select min(年月) from D_KR_SAP_IFRIREKIKANRI); でしたら、実行できました。 oracleで実行しようとしています。 どなたか、書き方を教えてください。

  • smarty 条件文

    smartyで下記のコードがあり $goodsがarray()の状態で渡されてきた場合でも 一行空白が出力されてしまうので array()の場合、出力しないようにしたいのですが どのように記述すればよいでしょうか? <{foreach item=value from=$goods}> <{$value}><br /> <{/foreach}>

    • ベストアンサー
    • PHP
  • SQL文の処理を関数化したいです

    SQL文をユーザー定義関数でまとめたいのですが、うまくいきません。 以下の処理を全てfunction search() { }の中に入れるのは間違っていますか? 関数名はsearchとしました。 try { $sql = 'SELECT product.id, name, price, img, status, stock FROM product JOIN item_stock ON product.id = item_stock.stock_id WHERE status = 1'; $stmt = $dbh->prepare($sql); $stmt->execute(); $result = $stmt->fetchALL(); $err_msg[] = ($keyword . 'を含む商品は見つかりませんでした。'); } catch (PDOException $e) { $err_msg[] = '商品を取得できませんでした。'; }

    • ベストアンサー
    • PHP
  • smarty foreach 半角スペース

    いつもお世話になっています。 phpより連想配列をsmartyにassignし、 smarty側でforeachで出力しているのですが、 要素間に無駄なスペースが混入します。 回避方法はあるのか教えて頂けないでしょうか。 [php] $arr = array('a' => 1, 'b' => 2); [smarty] {foreach from=$arr item=item} {item}: {/foreach} [出力] 1 : 2 ※本来1:2と出力させたい 宜しくお願い致します。

    • ベストアンサー
    • PHP

専門家に質問してみよう