人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

PHPの便利なライブラリでSmartyがありますが
{while ($row=mysql_fetch_array($result)}
<tr><td>{$row[name]}</td></tr>
{/while}

テンプレート内に上記の様な記述をし、データベースの値を取得しながら、出力させる事は可能ですか?
または、このような動作をさせることは可能でしょうか?

●質問者: makocan
●カテゴリ:インターネット ウェブ制作
✍キーワード:name PHP Smarty テンプレート データベース
○ 状態 :終了
└ 回答数 : 5/5件

▽最新の回答へ

1 ● nandedarou
●20ポイント

{php}と{/php}で囲むことで、普通にPHPのコードが書けます。

http://sunset.freespace.jp/smarty/SmartyManual_2-6-6J_html/langu...

{include_php}関数でPHPスクリプトをインクルードできます。

http://sunset.freespace.jp/smarty/SmartyManual_2-6-6J_html/langu...

しかし、このようなコードは望ましくありません。データの取得は通常のPHPスクリプトで行い、画面表示のみテンプレートで行うべきです。その為にテンプレートを導入するわけですから。


2 ● nandedarou
●20ポイント

ご質問の最後の一文「または、このような動作をさせることは可能でしょうか?」というのは、データの個数に応じてループすることは可能か?

という意味ですね。可能です。典型例を示します。

※下記の例のように、データの取得は通常のPHPファイルで行い、HTMLとしてのデザインは、テンプレートでやるのが推奨されています。

sample.php

<?php
  //SmartyクラスからSmartyオブジェクトを作成(例)
 require_once("../MySmarty.class.php");
 $o_smarty=new MySmarty();

 //ここでデータベースに接続
 //(コードは省略します)

 //以下でデータを取得し、配列$dataに格納
 $data=array();
 while($row=mysql_fetch_array($result)){
 $data[]=array("name"=>$row['name'],"address"=>$row['address']);
 }

 //テンプレート変数($DATA)に値(配列$data)をセット
 $o_smarty->assign("DATA",$data);
 
 //テンプレートを実行
 $o_smarty->display("sample.tpl");
?>

テンプレートsample.tpl

<html>
<head>
<title>Smartyテンプレートの例</title>
</head>
<body>
<table border="1">
 <tr><th>名前</th><th>住所</th></tr>

{* ループ処理 以下の3行がデータの個数分繰り返されます *}
{foreach from=$DATA item=datum}
 <tr><td>{$datum.name}</td><td>{$datum.address}</td></tr>
{/foreach}

</table>
</body>
</html>

http://q.hatena.ne.jp/answer ダミー


3 ● spits
●20ポイント

結論から言うと、「できるけどやらないほうがいい」だと思います。

理由は 1の方が言われているようにデザインとロジックを分けるためにsmartyを使うからです。

例えば、{while ($row=mysql_fetch_array($result)} の $result が

nullだったりした場合、エラー処理ができないですよね。

なので、phpでいったんすべての処理を終えた上で smartyを使って出力するのがいいと思います。

具体的にどうするかは2の回答がそのもののようです。

http://mikilab.doshisha.ac.jp/dia/research/report/2005/0915/004/...

◎質問者からの返答

皆さんありがとうございます。

なるほど。

エラー処理に対する事はおっしゃるとおりですね。

ただ、ご質問なのですが、この場合は二度のループを行わなければならないため、相当量のデータを出力する際は、PHP内の一度のループで文字列として、変数に入れ込み、それを純粋にテンプレート内ではループさせずに、{$data}という様に埋め込んだほうがよろしいのでしょうか?


4 ● nany
●20ポイント

>PHP内の一度のループで文字列として、変数に入れ込み、それを純粋にテンプレート内ではループさせずに、{$data}という様に埋め込んだほうがよろしいのでしょうか?

とは、phpファイルで、htmlのタグとデータを文字列として1つの変数に格納し、テンプレートで、その変数のみを出力するという意味ですか?

結論からいうと、

そのようにすることは、実質的にデザインとロジックがphpファイル内でだけで処理されている為、Smartyを使うメリットが全くなくなりますので、止めた方がいいでしょう。2番の回答のコードの様にするとをお勧めします。スピードがそれ程変わるとは思えないし、スピードを上回るメリットがあるからです。

デザインとロジックを分けると

デザイナーとプログラマの役割分担ができると言うメリットがあります。また、1人の人が両方やるにしても、データ取得、エラー処理、認証など非常にロジカルな機械的な思考と、ユーザーの使い易いデザインという実際使う人間を想像しながらやる思考を分けてファイルにした方が考え易いし、メインテナンスもし易いのです。バグの原因究明も早くなります。

このようなメリットと引き換えに、スピードは多少落ちるでしょう。しかし、スピードよりも正確さ、わかり易さ、メインテナンスのし易さなどの方がよほど大きな価値があります。

※phpやSmartyには、スピードを上げる為のチューニング方法もありますので、実際やってみて遅すぎるようであれば研究してみてください。

http://q.hatena.ne.jp/1152987218

ダミーです


5 ● spits
●20ポイント

WEBの画面で相当量(数万件とか)を表示することってあまりないですよね?

1000件くらいでしたら2回ループしてもさほどパフォーマンスには影響ないと思います。

想定される件数で実際に試してみてはいかがでしょうか。

http://www.yahoo.co.jp/ (ダミー)

◎質問者からの返答

ありがとうございます。

RSS関連で思い処理になってしまった経験があったため、若干、敏感になってしまっていたのかもしれません。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ