ソフトの砂場(PHP)


2002年9月15日

PHPについても少しは知っておいた方がよさそうな状況になってきたので、せっかくなのでネタにしようという魂胆です。

まずは、インストールから。Webサーバがいるので、Apache2.0.40を取ってきたのですがなぜか動作せず、今回はこだわる気がないので、1.3.26を使うことにしました。こちらは問題なく動作。この違いは、何でしょ?

次に、PHP4.2.3をPHP.NETに探しに行くと、Windows版バイナリは2種類あり、なぜかzip形式の方を取ってきました。これを、C:\PHPに展開。後で気づいたのですが、日本PHPユーザー会によると、このバージョンは日本語処理にバグがある模様。まあ、最初だからいいや。

PHPの方は、php.ini-recommendedというファイルをphp.iniにリネームして、%Windows%ディレクトリにコピーして終わり。php.ini-distというファイルの方が、プログラムを動かすと言う点では、問題が起こりにくいのかもしれません。本当は、ファイルの内容を見ないといけないのでしょうが…

Apacheの設定の方は、いろいろあったのですが、株式会社シュピンネン・ギルドで公開されている方法を参考にしました。

後は、いつものHello Worldを作って動作を確認して、だめ押しで、もう一つ次のようなプログラムで動作を確認しました。

<html>
<head><title>現在時刻</title></head>
<body>
<?php
   print "現在時刻:" . date("Y/m/d H:i:s");
 ?>
</body>
</html>      

一応、何かできそうな感じになったところで、今回はおしまい。PHPの関数名を見ていると、call_user_methodとか、create_functionとか、ちょっと気になる関数があるのですが、それを使える日はやってくるのでしょうか?


2002年9月21日

引き続き、PHPのお勉強。

出力はできるようになったので、今度はフォームから入力してみましょ。次のような、ごく簡単なプログラムを書いてみました。PHPでは、フォームのエレメント名と同じ名前の変数に、値が格納されるようなので、その変数に値が格納されていたら表示する、というものです。

<html>
<head><title>FORMのテスト</title></head>
<body>

<?php
        if (isset($textbox1)) {
                print("<p>入力した文字列は $textbox1 です。</p>");
        }
 ?>

<form method=post>
        <input type=text name='textbox1'>
        <input type=submit value='送信'>
</form>

</body>
</html>

が、これがどうしてもうまく動きません。いろいろやってみましたがうまくいかず、ふとApacheのログを見ると、次のようなエラーメッセージが出ています。

PHP Notice: Undefined variable: textbox1

この変数が未定義なら、うまく動かないのは納得ですが、どうしてこの変数が未定義かな〜と考えていくうちに、最初にインストールした時、php.ini-distとphp.ini-recommendedの2つがあって、後者を選んだことを思い出しました。

調べてみると、まさにその説明がありました。

; - register_globals = Off [Security, Performance]
; Global variables are no longer registered for input data (POST, GET, cookies,
; environment and other server variables). Instead of using $foo, you must use
; you can use $_REQUEST["foo"](includes any variable that arrives through the
; request, namely, POST, GET and cookie variables), or use one of the specific
; $_GET["foo"], $_POST["foo"], $_COOKIE["foo"] or $_FILES["foo"], depending
; on where the input originates. Also, you can look at the
; import_request_variables() function.
; Note that register_globals is going to be depracated (i.e., turned off by
; default) in the next version of PHP, because it often leads to security bugs.
; Read http://php.net/manual/en/security.registerglobals.php for further
; information.

ということで、コメント通りに以下のように修正して、動作を確認できました。

<html>
<head><title>FORMのテスト</title></head>
<body>

<?php
        $textbox1 = $_REQUEST['textbox1']; // ここがポイント
        if (strlen($textbox1) > 0) {
                print("<p>入力した文字列は $textbox1 です。</p>");
        }
 ?>

<form method=post>
        <input type=text name='textbox1'>
        <input type=submit value='送信'>
</form>

</body>
</html>

やはり、新しいことをすると、いろいろありますね。


2002年9月23日

ここまできたら、勢いでデータベースにつないでみましょ。データベースとしては、ここはやはり、DB2でしょう。と思ってDB2に接続する方法を調べてみましたが、Linux上でPHPを再コンパイルする方法はみつかったのですが、Windows上で配布されているバイナリをそのまま使う方法は見つけられませんでした。

やむなく、ODBC経由でDB2に接続することにしました。システムDSNを作れば、できそうな感じです。ユーザDSNやファイルDSNではうまくいかない模様、という情報も得られました。

というわけで、WindowsのODBCデータソースアドミニストレータを起動して、DB2_PHPという名前のシステムDSNを作りました。接続するデータベースは、SAMPLEです。

ODBCを使えるようにするためにphp.iniを書き換えよ、と書いてあるところもありましたが、php.iniを見るとODBCはすでに組み込まれていると書かれているので、PHPの設定は変更しませんでした。

プログラムの方は、見よう見まねで、次のようなものを作りました。実行してみると、うまく動いている模様。

<html>
<head><title>DBへのアクセス</title></head>
<body>

<table border>
<?php
        $con = odbc_connect("DB2_PHP", "ユーザ名", "パスワード");
        if (!$con) {
                print("odbc_connect failed\n");
                exit;
        }

        $ret = odbc_exec($con, "select * from employee");
        if (!$ret) {
                print("odbc_exec failed\n");
                exit;
        }

        $cols = odbc_num_fields($ret);
        while (odbc_fetch_row($ret)) {
                print("<tr>");
                for($i = 1; $i <= $cols; $i++) {
                        print('<td>' . odbc_result($ret, $i) . '</td>');
                }
                print("</tr>\n");
        }

        $ret = odbc_close($con);
 ?>
</table>

</body>
</html>

最初は、while (odbc_fetch_row($ret)) { のところを、

for ($row = 1; odbc_fetch_row($ret, $row); $row++) {

のように、贅沢に書いていましたが、こちらの方が軽量にできていいでしょう(本当に軽量になるかどうかは、ドライバの実装次第ですケド)。


[ソフトの砂場の目次] [ホーム]