さようならPHP4 来年でメンテ終了

2007/07/15 | PHPの基本

このところ自分にとってはPHPのニュースが盛りだくさんだ(しかも悪い話ばかり)。
PHP4は今年いっぱいで新しいリリースが出なくなるとのことだ。それはまぁいい。それよりも2008年8月8日以降はPHP4の全てのアップデート(セキュリティ・バグ・フィックス)がされなくなるらしい。2008/08/08。単にごろをあわせただけのような日付というのがまた腹立たしい。

ということでPHP4はもうNGなわけだ。日本国内にはPHP5がOKなサーバがこんなに少ないのに!。

cakePHPか、とも思うが、まだまだバリデーション機能が不十分(1.2から少しよくなるらしい)。不十分といってもしばらくこれでしのぐしかないのか。ん〜〜。
Ethnaを少しだけみたけど、これはコマンドラインから操作が出来ないと駄目?。もっと簡単にできるフレームワークは?。mojaviはもうダメ?。Xoopsはどうなる?。

不満だらけだ。
まぁ、現行でPHP4で運営しているレンタルサーバは、途中でやめるわけにはいかないだろうから、今後もそれなりに何らかのサポートが入るだろう。業務面もあるので、今年の9月いっぱいまではPHP4で開発、それ以降はPHP5を採用。

それでなくても悩み事が多いのに・・・。

PHPで「select multiple」

2007/07/09 | PHPの基本

PHPでフォームを操作する際には、場合によってはいろいろ工夫が必要な場合がある。

例えばチェックボックス。複数項目チェックOKな場合のチェックボックスを作成する場合、全てのチェックボックスのname属性を同じにしていると、正しくデータを受け取ることは出来ない。

<input type="checkbox" name="myCheckBox" value="1" />check1
<input type="checkbox" name="myCheckBox" value="2" />check2
<input type="checkbox" name="myCheckBox" value="3" />check3
<input type="checkbox" name="myCheckBox" value="4" />check4

このように書いて、複数チェックしても、一番最後のチェックしかデータを拾ってくれない(IISのASPなどはこれでも正しく受け取れる)。
これを回避するには以下のいずれかの方法がある。

○name属性をそれぞれ個別に設定してやる
○name属性の値に「[]」をつける

前者での場合の記述は以下のようになる。

<input type="checkbox" name="myCheckBox1" value="1" />check1
<input type="checkbox" name="myCheckBox2" value="2" />check2
<input type="checkbox" name="myCheckBox3" value="3" />check3
<input type="checkbox" name="myCheckBox4" value="4" />check4

上記のように記述すれば、それぞれ個々に値が渡される。
後者の場合は、以下のように記述することになる。

<input type="checkbox" name="myCheckBox[]" value="1" />check1
<input type="checkbox" name="myCheckBox[]" value="2" />check2
<input type="checkbox" name="myCheckBox[]" value="3" />check3
<input type="checkbox" name="myCheckBox[]" value="4" />check4

このように記述するとPHP側では、選択されたデータが配列として格納される。つまり以下のように取得できる(例)。

$_REQUEST[‘myCheckBox’]=array(‘1′,’3′);

一工夫必要なわけだ。
これはチェックボックスだけではなく「select multi」なフォームエレメントでも同様だ。ただし、こちらの場合はname属性で指定できるのは一つだけなので、上記のうち後者の方法(配列で受け取る方法)のみ利用できることになる。

初心者にはわかりにくいかもしれない。
「select multiple」などはQuickFormでもサポートされていなかったりするので、なおさらだ。

呼び出されたファイル中での「return」

2007/07/03 | PHPの基本

現在Xoopsのminihakuモジュールのソースを読んでいる。
長年(といっても・・・5、6年だけど)PHPをやっているけど、やっぱりよく出来る人のプログラムは宝箱だ。Pearのソースなどももちろん勉強になる。
今日はそんな驚き(自分が無知なだけだが)の発見を一つをメモ。

ファイルA.phpからファイルB.phpを呼び出すとする。例えばソースコードはこんな感じ。
–ファイルA.php–
<html>
<body>
  <?php require_once(‘B.php’); ?>
</body>
</html>

–ファイルB.php–
<?php
  print(‘test1′);
  return;
  print(‘test2′);

要は呼び出されたファイルの途中でreturn文をいれてみたのだ。結果として

–結果–
<html>
<body>
  test1
</body>
</html>

return文以降は実行されない。つまりreturn文以降の処理を停止し、呼出元に制御が戻るわけだ。
関数内で使うだけかと思ってたけど・・・勉強になりました。

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なのだ。これで余計な改行や空白文字が入る(ブラウザに送出される)ということはなくなる。盲点だけど、すごく便利な裏技だ。

外部と通信する際に設定しておきたい項目

2007/03/19 | PHPの基本

マッシュアップという言葉のせいではないけれど、外部のサービスと連携することが多くなった。また連携する、ということでなくても、外部の情報をとってくる、という機会が多い。そんなときにこの設定は有効だ。

ini_set(‘default_socket_timeout’,10);

これで接続に10秒以上かかれば、通信をやめてくれる。

外部の情報を以下のように取得する場合、

$html=file_get_contents(‘http://www.hoge.com’);

通信状態とか相手のサーバの込み具合にもよるけれど、すぐに応答がない場合がある。そんなときは上記で設定した秒数が過ぎると接続をあきらめてくれる。つまり「できれば取得したいけれど、出来なければやむをえない」というルーチンを組み込む場合には最適な設定だ。


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