「PHP5徹底攻略」サポートページ |
|
このページでは、ソフトバンク・クリエイティブ社刊行の「PHP5徹底攻略」 (通称:赤マンモス本 -- ISBN 4-7973-2906-8) についてのサポートを行います。 ご指摘・お問い合わせがありましたら、出版社のページからお寄せください。 |
(2010/02/26)
パート2 | part2.lzh |
パート3 | part3.lzh |
郵便番号データ | 13tokyo.lzh |
宴会サーバー | enkai-0.7.tar.gz |
本書のソースコードはPHP 5.0.0環境を前提としています。 本書の刊行後、PHPに大きな変更があったため、オリジナル版サンプルスクリプトはそのままでは最新のPHP環境では動作しなくなっています。 オリジナル版サンプルスクリプトを動作させたい場合は、本書執筆時の環境(Vine Linux 3.0+SQLite-2.x+PHP-5.0.0相当)を用意する必要がありますのでご注意ください。 また、従来は宴会サーバーのサービスをインターネットに向けて公開しておりましたが、古い環境で数多のセキュリティーホールを抱えたまま動かし続けると、皆様の環境に悪影響を与える可能性があります。 つきましては、誠に残念ですが、宴会サーバー実稼働サイトのサービスを終了させていただきましたのでご了承ください。 |
(2008/12/18)
sqlite に関する大きな変更に伴い、
本書のサンプルもそのままでは動かなくなってしまいました。
このため、後述の通り該当部分(ただし宴会サーバー部分を除く)を
PDO(PHP Data Object)で書きなおすことで、
ある程度動くように対応しました。 ちなみに、当ページも、ようやく XHTML+CSS2 に移行しました。 |
概要 | Vine Linux 3.0 | Cent OS 5.2 |
---|---|---|
php4 | パッケージ名:php4 | メンテナンスの終了に伴い収録されなくなった |
php5 | パッケージ名:php5 | パッケージ名:php 本書のサンプルを実行するのに必要な最小限のパッケージ: php php-cli php-mbstring php-common php-pdo sqlite Cent OS 5.2 提供の php には sqlite モジュールが 提供されていないので、自作パッケージを提供中です。 |
apache | パッケージ名: httpd(1.3) / apache2(2.0) |
パッケージ名:httpd(2.2) |
httpd.conf | 設定しなくても動作していた | 設定ファイルの修正が必要(後述) |
lha | 標準で収録 | 収録されない(後述) |
sqlite | パッケージ名:sqlite(2.x) コマンド名:sqlite |
パッケージ名:sqlite(3.x) コマンド名:sqlite3 ※コマンド名が変わっているので注意!! |
php.ini | 変更内容を本文内で指示 | 内部コードを UTF-8 にする方向で提示(後述) |
OSの文字コード | EUC-JP | UTF-8(後述) |
機能 | sqlite ver.2.0 | PDO::sqlite(sqlite3) |
---|---|---|
データベース への接続 |
$db_handle = sqlite_open( $ファイルへのパス名 [, $モード [, &$エラー文字列 ]] ); |
$db_obj = new PDO( 'sqlite:ファイルへのパス名'); |
SQLクエリー の実行 (更新系) |
sqlite_query( $db_handle , SQL文); |
$db_obj->exec(SQL文) |
SQLクエリー の実行 (参照系) |
$result = sqlite_query(i $db_handle , SQL文); $array = sqlite_fetch_XXXX( $result); |
$statement = $db_obj->prepare(SQL文); // 準備 $statement->bindXXXX(カラム, 値); // パラメータへの値の代入 $statement->execute(); // 実行 $row = $statement->fetch(PDO::FETCH_ASSOC); // 値の取り出し |
PDOの場合、他のデータベースエンジンを使う場合でも接続文字列が異なるだけで後は同じなので、ひとつ覚えると後が楽になります。現在はデータベースへの標準のアクセス方法としてPDOが推奨されているようなので、特に必要がなければPDOを使うようにしましょう。
オリジナル版(賞味期限切れ) | PDO::sqlite対応版 |
---|---|
part2.lzh | part2.tar.gz(*1) |
part3.lzh | part3.tar.gz(*1) |
13tokyo.lzh | 13tokyo.tar.gz |
(なし) | part4.tar.gz(*2) |
enkai-0.7.tar.gz |
以下は、プロンプトが '$' で始まるものは一般ユーザで実行可能、'#' で始まるものは root 権限が必要なことを表しています。また、'/path/to' の部分は読者の環境で逐次いずれかのディレクトリに読み換えてください。
以下のように読み替えてください。
$ rpm -qa …インストール済みの全パッケージのリストを表示 $ rpm -qa|grep php … php(Ver.5)がインストールされているかどうかの確認 $ rpm -q sqlite … SQLite(Ver.3)のコマンド(sqlite3)がインストールされているかどうかの確認
サンプルの動作確認用として、Cent OS 5.2 向けのRPM パッケージを作成しました。お手元の環境ではサンプルがうまく動かない場合に、各自の責任の下にインストールしてください。環境によってはうまくインストールできない場合があるかもしれません。
$ cd /tmp $ wget http://yum.net-newbie.com/newbie.repo # cp /tmp/newbie.repo /etc/yum.repos.d/ # yum --enablerepo=newbie install php php-pdo php-mbstring php-cli php-common
なお、お手元の環境で part2 の createdb.php (P.44) が動くようであればすでに pdo_sqlite が組み込まれていると思われますので、 無理にインストールし直す必要はありません。
内部コードとして UTF-8 をベースにする場合、設定ファイルは以下の ようになります。
$ cat /etc/php.ini (抜粋) [mbstring] mbstring.language = Japanese mbstring.internal_encoding = UTF-8 mbstring.http_input = auto mbstring.http_output = pass mbstring.encoding_translation = Off mbstring.detect_order = auto mbstring.substitute_character = none; mbstring.func_overload = 0 mbstring.strict_encoding = Off
本サイトで公開しているパッケージでは、上記の設定を行ったphp.iniをインストールするようにしています。
今回は、以下の環境で動作確認を行いました。お試しの際は必ずしもこれと同じバージョンでなくても構いませんが、php が 5.2 以降であることを推奨します。
$ php -v PHP 5.2.8 (cli) (built: Dec 17 2008 12:10:45) Copyright (c) 1997-2008 The PHP Group Zend Engine v2.2.0, Copyright (c) 1998-2008 Zend Technologies
Cent OS 5.2 収録の httpd では UserDir 機能がデフォルトで無効になっているので、以下の手順で有効にする必要がありました。
# vi /etc/httpd/conf/httpd.conf UserDir disabled … コメントアウト(行頭に # を入れる) UserDir public_html … アンコメント(行頭の # をはずして有効にする) <Directory /home/*/public_html> 〜 <Directory> … アンコメント # service httpd restart
lha コマンドは Cent OS には収録されていないようです。
今回の配布物は、標準の tar で展開できるように変更しました。
$ cd $ pwd /home/hotta $ wget http://net-newbie.com/support/pdo/part2.tar.gz $ ls part2.tar.gz $ mkdir -p public_html $ cd public_html $ tar xzf ../part2.tar.gz $ ls part2 $ ls part2 calendar.php createdb.php flock.php printf.php counter.php escape.php hello_world.php qdriver.php counter2.php escape2.php hitandblow.php question.php counter3.php eval.php numcheck.php simplemail.php
なお、lha コマンドは以下の手順でインストールできます。本家(日本郵便)のサイトで配布している郵便番号データは相変わらず lzh 形式のようなので、最新版をダウンロードして使うする場合は入れておいた方がよいかもしれません。
# cd /tmp $ wget http://dag.wieers.com/rpm/packages/rpmforge-release/rpmforge-release-0.3.6-1.el5.rf.i386.rpm # rpm -Uvh /tmp/rpmforge-release-0.3.6-1.el5.rf.i386.rpm # vi /etc/yum.repos.d/rpmforge.repo ( 念のため enabled = 0 にしておく) # yum --enablerepo=rpmforge install lha
ダウンロードする rpmforge-release パッケージのバージョンの次の el5 は、 (Redhat) 'E'nterprise 'L'inux 5(RHEL5)を意味しています。 Cent OS 5.x は RHEL5 互換なのでこれを選択することになります。 これ以外のディストリビューション(Fedora Core等)/バージョンをお使いの方は、 http://dag.wieers.com/rpm/packages/rpmforge-release/ の中で適切な パッケージを選択してください。
コマンド名としての 'sqlite' は、すべて 'sqlite3' に読み換えてください。
以下のように読み換えてください。
$ cd $ pwd /home/hotta …ご自分のアカウント名に読み換えてください。 $ wget http://net-newbie.com/support/pdo/part3.tar.gz $ ls part2.tar.gz part3.tar.gz public_html $ cd public_html $ tar xzf ../part3.tar.gz $ ls part2 part3 $ ls part3 cvt.sed zip.php zip2.php zip_display.inc zip_search.php zip.html zip.sql zip_check.inc zip_input.inc $ cd
以下の手順で郵便番号データを展開します。
$ cd $ wget http://net-newbie.com/support/pdo/13tokyo.tar.gz $ ls 13tokyo.tar.gz part2.tar.gz part3.tar.gz public_html $ tar xzf 13tokyo.tar.gz $ ls -l 13* -rw-r--r-- 1 hotta Domain Users 366601 6月 29 2004 13tokyo.csv -rw-r--r-- 1 hotta Domain Users 44105 12月 18 2008 13tokyo.tar.gz $ nkf -Lu -w 13tokyo.csv > a $ mv a 13tokyo.csv $ head -5 13tokyo.csv 13101,"100 ","1000000","トウキョウト","チヨダク","イカニケイサイガナイバアイ","東京都","千代田区","以下に掲載がない場合",0,0,0,0,0,0 13101,"102 ","1020072","トウキョウト","チヨダク","イイダバシ","東京都","千代田区","飯田橋",0,0,1,0,0,0 13101,"102 ","1020082","トウキョウト","チヨダク","イチバンチョウ","東京都","千代田区","一番町",0,0,0,0,0,0 13101,"101 ","1010032","トウキョウト","チヨダク","イワモトチョウ","東京都","千代田区","岩本町",0,0,1,0,0,0 13101,"101 ","1010047","トウキョウト","チヨダク","ウチカンダ","東京都","千代田区","内神田",0,0,1,0,0,0
sqlite3 では SQL の COPY ステートメントがなくなってしまったので、 データ全体を INSERT 文に変換することにしました。
$ cd $ echo 'BEGIN;' > 13tokyo.sql $ nkf -Lu -w 13tokyo.csv | sed -f public_html/part3/cvt.sed >> 13tokyo.sql $ echo 'COMMIT;' >> 13tokyo.sql $ head -5 13tokyo.sql BEGIN INSERT INTO zip VALUES('13101','100 ','1000000','トウキョウト','チヨダク','イカニケイサイガナイバアイ','東京都','千代田区','以下に掲載がない場合'); INSERT INTO zip VALUES('13101','102 ','1020072','トウキョウト','チヨダク','イイダバシ','東京都','千代田区','飯田橋'); INSERT INTO zip VALUES('13101','102 ','1020082','トウキョウト','チヨダク','イチバンチョウ','東京都','千代田区','一番町'); INSERT INTO zip VALUES('13101','101 ','1010032','トウキョウト','チヨダク','イワモトチョウ','東京都','千代田区','岩本町'); $ wc -l 13tokyo.sql 3230 13tokyo.sql
ちなみに、sed コマンドの命令として渡している cvt.sed は以下のような感じです。
$ cat public_html/part3/cvt.sed # 行頭にSQL命令を挿入 s/^/INSERT INTO zip VALUES('/ # 最後の12文字(行末までの不要な項目)をカット s/,[01]//g # すべての " を削除 s/"//g # すべての項目を ' でくくる s/,/','/g # 行末の SQL を閉じる s/$/');/
なお(後から気づいたのですが)、 sqlite3コマンドには .import サブコマンドが用意されており、COPY と同等のことが行えるようです。
以下のように実行してください。書籍本文にある 13tokyo.txt は使用しません。
$ cd $ sqlite3 test < 13tokyo.sql $ sqlite3 test SQLite version 3.3.6 Enter ".help" for instructions sqlite> select count(*) from zip; 3228 (← wc -l の出力と同じ) sqlite> select * from zip limit 5; 13101|100 |1000000|トウキョウト|チヨダク|イカニケイサイガナイバアイ|東京都|千代田区|以下に掲載がない場合 13101|102 |1020072|トウキョウト|チヨダク|イイダバシ|東京都|千代田区|飯田橋 13101|102 |1020082|トウキョウト|チヨダク|イチバンチョウ|東京都|千代田区|一番町 13101|101 |1010032|トウキョウト|チヨダク|イワモトチョウ|東京都|千代田区|岩本町 13101|101 |1010047|トウキョウト|チヨダク|ウチカンダ|東京都|千代田区|内神田 sqlite> .q $ ls -l test -rw-r--r-- 1 hotta hotta 529408 12月 14 23:01 test
これ以降は sqlite3 /path/to/test[Enter] で sql アクセスができます。
Chapter-4 で使うプログラムは今回別アーカイブにしました。下記の要領で設置してください。
$ cd $ wget http://net-newbie.com/support/pdo/part4.tar.gz $ ls 13tokyo.csv 13tokyo.tar.gz part3.tar.gz public_html 13tokyo.sql part2.tar.gz part4.tar.gz test $ cd public_html $ tar xzf ../part4.tar.gz $ ls part2/ part3/ part4/ $ cp part4/* . ( mv part4/* . でも可 ) $ ls part2/ part4/ zip2.php zip_display.inc zip_search.php part3/ zip.html zip_check.inc zip_input.inc $ cd
さすがにここは変更が大きすぎる上にコーディングスタイルも古すぎるので、 OOP+Smartyで書きなおす予定です。もうしばらくお待ちください。
。。。の予定でしたが、もはや原形をとどめなくなってしまったので、 残念ながら本節についてはサポートサービスを終了させていただきます。 あしからずご了承ください。
なお、オリジナルのソースは本ページの先頭のところにあります。
誤)(シングルクォーテーション抜け) define(DB, '/home/hotta/public_html/test'); // DB名(パス名) define(RECORD_PER_PAGE, 10); // ページあたりの表示件数 define(DEBUG, FALSE); // デバッグ終了後はFALSEに 正) define('DB', '/home/hotta/public_html/test'); // DB名(パス名) define('RECORD_PER_PAGE', 10); // ページあたりの表示件数 define('DEBUG', FALSE); // デバッグ終了後はFALSEに
『SQLiteでは、BEGINを発行してからCOMMITでデータの更新を確定するまで
そのデータベースはロックされ、ほかのプログラムからの参照/変更が一切
できなくなります。』
とありますが、SQLite 3.0 からこの制限が緩和され、
SELECT に関してははロックされなくなった
ようです。
P.101 の末尾に追加
「4.2 郵便番号検索」の章は P.101にある「4.2.7 入力画面の表示」で終わっていますが、
この次の「4.2.8.検索結果の表示」の節が抜けていました。
誤) | <?php $copy_of_obeject = $object->__clone(); ?> |
正) |
<?php $copy_of_obeject = clone $object; ?> |
予約語 clone が PHP5 β4から導入されましたが、 本家サイトにある サンプルスクリプトの更新が(今現在も)追いついていない模様です。 |