今回は,不具合修正のためにリリースされた PHP 4.3系の最新版PHP 4.3.7およびPHP5のリリース候補版PHP5.0.0RC3,そして,その他のPHP関連の情報としてPHP5プログラミング・コンテストとデータベース抽象化レイヤーPDOに関して解説する。

PHP 4.3.xのセキュリティ・ホールを修正したPHP 4.3.7がリリース

 4月15日にPHP 4.3.6がリリースされた後,主にWindows版に存在した不具合を修正したPHP 4.3.7が6月3日にリリースされた。このバージョンでは,Windows版において存在したコマンド文字列をエスケープする関数(escapeshellcmd() およびescapeshellarg())の入力検証に存在したセキュリティ上の問題(任意のコマンドを実行されてしまう)が修正されている。このため,Windows版のPHPを使用し,かつ,上記の関数を使用しているユーザーは,早期のバージョン更新が推奨されている。

 また,その他の比較的マイナーなものも含めて合計30件のバグが修正されているため,PHP 4.3.xを使用しているその他のユーザーについてもバージョン更新が推奨される。

 また,PHPにバンドルされている以下のライブラリが更新されている。

  • イメージライブラリGD(バージョン2.0.23)

     なお,変更点に関する詳細は,「PHP 4.3.7 Release Announcement」(http://www.php.net/release_4_3_7.php)を参考にしてほしい。

     開発の中心は既にPHP5に移行しており,PHP 4.3系での新たな機能追加は行われないこととなっているが,今後もバグ修正作業は行われる予定である。

    PHP 5.0.0RC3がリリース

     1ヶ月以内に予定されるPHP 5の正式リリースに向けて開発が進んでいる。6月8日にPHP 5.0.0RC3(リリース候補3版)がリリースされた。このバージョンでは,23件のバグ修正が行われている。このバージョンが正式リリース前の最後のリリース候補版となる予定で,いよいよ,PHP5のリリースも間近にせまってきた。

     PHP 5.0.0RC3における主な変更点を以下に示す。

  • InterBaseにおいて,UDF(ユーザー定義関数)内でPHPコードが実行できる機能が追加された。
  • PDFを動的に生成する機能をサポートするライブラリPDFLibをサポートする拡張モジュールpdfが,PECLに移動された。
  • var_dump()関数がprivate/proteced定義されたクラスのプロパティの値もダンプにも対応した。

     なお,PHP 5.0.0RC2からの変更点の詳細については,ChangeLog(http://www.php.net/ChangeLog-5.php#5.0.0RC3)を参照していただきたい。

     以下にPHP 5.0.0 の新機能のうちで前回までに解説していなかったMySQLiモジュールについて説明する。

    MySQLの最新版に対応するmysqliモジュール

     PHPでは従来よりMySQLデータベースをサポートしている。PHP5では,従来から含まれているmysql拡張モジュールに加えて,MySQL 4.1以降で定義される新しいAPIをサポートする拡張モジュールmysqliが追加されている。mysqliは「Improved MySQL extension」を意味し,文字通りMySQL拡張モジュールの改良版にあたる。

     mysqli拡張モジュールは,従来MySQL 4.1.1alphaをサポートしていたが,最新のMySQL 4.1.2alphaおよびこれ以降のバージョンをサポートするように変更された。なお,MySQL 3.xおよびMySQL 4.0.xを使用する場合は,従来のmysql拡張モジュールを使用する必要がある。

     mysqliの特徴を以下に示す。

    1. 「デュアルAPI」をサポートし,オブジェクトAPIと関数APIの2種類のAPIを使用可能である。

    2. MySQL 4.1以降でサポートされるプリペアド・クエリのような新しいバイナリ・プロトコルを使用可能で,実行処理を効率化・高速化できる。

    3. MySQLクライアント・ライブラリの高度な接続オプションを指定可能。

     一方,従来のmysqlモジュールで省略可能だった接続ハンドラはmysqliモジュールでは明示的に指定する必要があるため,注意を要する。

     mysqliを拡張モジュールとしてインストールする手順を以下に示す。--with-mysqliのオプションとして,mysql_configコマンドのパスを指定する。

    cd ext/mysqli
    phpize
    ./configure --with-mysqli=/usr/bin/mysql_config
    make
    make install

     この後,設定ファイルphp.iniに以下を追加することでmysqliモジュールが使用可能となる。

    extension=mysqli.so

    なお,拡張モジュールがインストールされたディレクトリをphp.iniにて以下のように指定しておく必要がある。

    extension_dir = "/usr/lib/php/extensions/no-debug-non-zts-20040412/"

     デュアルAPIの例として,ゲストブックからデータを抽出,出力する簡単なPHPスクリプトを示す。まず,関数APIを使用する場合は,以下のように記述できる。

    $dbh = mysqli_connect('localhost','','','test');
    $result = mysqli_query($dbh,'SELECT * from guestbook');
    while ($row = mysqli_fetch_assoc($result)) {
     print $row['name'].':'.$row['comment']."\n";
    }
    ?>

     一方,オブジェクトAPIを使用する場合は以下のように記述する。

    $dbh = new mysqli('localhost','','','test');
    $result = $dbh->query('SELECT * from guestbook');
    while ($row = $result->fetch_assoc()) {
     print $row['name'].':'.$row['comment']."\n";
    }
    ?>

     上記,2種類のコードの出力はまったく同じである。

     次にプリペアド・クエリと変数バインドを行うスクリプトの例を示す。プリペアド・クエリを使用することにより,引数のみが異なる同一のSQLクエリ文を複数回使用する際に構文解析が一回ですむため,実行を効率化できる。また,変数バインドにより,SQLクエリで使用される変数にPHPの変数をバインドすることで,変数の代入,取得を容易にすることができる。例としてゲストブックにデータを挿入するスクリプトを以下に示す。

    $dbh = new mysqli('localhost','','','test');
    $stmt = $dbh->prepare('INSERT INTO guestbook VALUES (?,?)'); // クエリを解析
    $stmt->bind_param('ss',$name,$comment); // 変数をバインド

    $name = 'jiro'; $comment = 'test comment 1.'; // テスト用入力1
    $stmt->execute(); // クエリ実行

    $name = 'saburo';$comment = 'test comment 2.'; // テスト用入力2
    $stmt->execute(); // クエリ実行
    ?>

     3行目のprepare()メソッドによりSQL文の解析が行われ,ステートメント・オブジェクトが返される。構文解析は,上の例のように複数のレコードを挿入する場合でも同一のSQL文について一回だけ行えばよい。ステートメントオブジェクトのbind_paramメソッドによりPHP変数とバインドすることで,クエリ文に指定した?の部分に値が挿入される。

     execute()メソッドが実行された際にクエリに代入される値のみが,データベースサーバー側に送信され,パース済みのクエリに代入されて実行される。

     mysqliのオブジェクトAPIは,ユーザー側でサブクラス化して機能を拡張することが可能である。mysqliは拡張性と高い機能を両立しており,MySQLの新機能を使用したいユーザーにはなくてはならないモジュールと言えるだろう。

    PHP5プログラミング・コンテスト開催

     PHPのスクリプト・エンジンを開発するイスラエルZend社により,PHP5を対象としたプログラミング・コンテストが開催されることになった。このコンテストは,PHP5の新機能の有用性を一般にアピールすることを意図しており,PHP5で強化されたオブジェクト機能やXMLサポートなどの新機能を活用することが参加者に求められている。このコンテストには,個人またはチーム単位で誰でも参加することができる。参加者は,PHP5の新機能を駆使してSQLデータベースの管理ツールといったアプリケーションを作成することが求められる。

     このコンテストは5月31日から開催され,エントリの締め切りは9月19日,入賞者発表は10月11日となっている。優勝者にはDell Inspiron 600mまたはApple iPod Miniが商品として贈られる。また,参加者全員にZend製品の100ドル割引券,PHP専門誌php|architectの5ドル割引券が贈られる。参加方法などの詳細は,Zend社のWebサイトを参照していただきたい。PHP5の新機能を早期に体験してみたい方や腕に覚えのある方は挑戦してみてはいかがだろうか?

     なお,このコンテストでは,既存のアプリケーション・クラス(PEARなど)も含めて(ZE1互換モードではなく)PHP5ネイティブモードで警告を発生せずに動作することが求められている。現時点で標準クラスPEARのパッケージの多くは,PHP5ネイティブモードで互換性に関する警告を発生するため,標準クラスのPEARまで使用できないというのは生産的でないとメーリングリストやblog上で議論になった。

     この指摘については,PHP5のネーティブモードで動作するアプリケーションのコンテストであることと,PEARなどの標準的クラスをPHP5にポートするきっかけとなることも狙っていることから設定された規定であることが主催者より説明されている。詳細は,FAQ(http://www.zend.com/php5/contest/faq.php)を参照していただきたい。