演算にはmathがよさそう

2007/05/04 | Smarty

テンプレート内で、四則演算して変数に結果を割り当てるのは、カスタム関数{math}がよさそう。

{math equation=”val1 * val2″ val1=5 val2=3 assign=test}

こんな感じで変数$testに演算結果を割り当てられる。括弧とかも使えるらしい。
でもこれ、テンプレート内でevalして処理してるから、負荷がかかるらしい。あとループの中で演算したりするのはなおさらちょっと・・・(マニュアルにもそう書いてある)。

まぁ、それもこれも、相当アクセスがあるサイトの場合で、月間数万ページビュー程度なら、全然たいしたことないような気もする(とはいえ少し気が引ける)。

文字列を連結して変数に(その2)

2007/05/03 | Smarty

さっそく次のパターンが出てきた。数値の四則計算をしてその結果を変数に格納する。

変数と変数の計算
{assign var=sum value=`$price*$num`}

*の前後に空白が入るとだめなんだよね。あと変数が普通の数値になってもだめ。このあたりは一回どこかでまとめないといけない(毎回悩むから)。

文字列を連結して変数に(その1)

2007/05/02 | Smarty

普段Smartyを使うことが多いが、テンプレート内で文字列の演算をして、その結果を変数に格納したい、ということがよくある。
ある意味、テンプレート内にプログラミングのルーチンを入れるわけだからデザインとプログラムの分離という面から考えればよろしくないのだが、便利に使える機能だ。でも各種演算をして変数に格納する記述、いつも忘れてしまうので、ここにメモ。

文字列「title_」と変数$myTitleをくっつけて、smarty変数$hensuに格納。
{assign var=hensu value=”title_$myTitle”}

他のパターンは、またそういう記述が出てきたときにでも・・・。

PHPの記述方法(目からうろこ)

2007/05/01 | PHPの基本

Warning: Cannot modify header information – headers already sent …

こういうエラーメッセージを見ることはないだろうか。これはPHPプログラムからHTMLヘッダを吐き出す際にしばしば見られるエラーだ。
HTTPの仕様の話になるが、HTTPレスポンス(ブラウザからのリクエストに対する返答)はヘッダと本文にわかれる。本文とはいわゆるHTMLデータのことで、ヘッダとは本文を送るに際してあらかじめ送出しておくべき内容だ。HTML自体はブラウザの「ソースを見る」で表示させることができるが、ヘッダは別途ソフトを入れない限り見ることができないので、若干なじみが薄い。

ここで上記のメッセージに戻る。このエラーはヘッダ情報を送出しようとしたところ「すでに本文を出力してるからエラーです」といっているのだ。例えば以下のようにするとエラーになる。
<?php
  print(‘test’);
  header(‘Content-type: text/html’);
?>
プログラム1行目で本文を送出しているにもかかわらず、2行目でヘッダを送出しようとしているからだ。これはバグだ。
このような明らかな場合は、すぐにエラー箇所を発見できるが、発見が難しい場合もある。例えば以下のようにファイルをインクルードする場合を考える。
<?php
  include(‘myfile.php’);
  header(‘Content-type: text/html’);
?>
インクルード元のmyfile.phpでprint();などとするとエラーになるのは当然だが、そのファイルの文末、つまり?>の後ろに改行や空白があるだけでも上記と同じエラーが出るのだ。このエラーを見つけるのは結構面倒。

そこで対策(目からうろこ)。PHPの閉じタグ「?>」を記述しない。PHPは文法上、閉じタグを書かなくてもOKなのだ。これで余計な改行や空白文字が入る(ブラウザに送出される)ということはなくなる。盲点だけど、すごく便利な裏技だ。


守谷市(まちの情報ポータル) 無料アンケートレンタルjpForm.net