PHP関連のちょっとした覚え書き
戻る
最終更新日 2002/11/22
2002/10/25
2002/07/23
2002/05/29
2002/01/24
2002/01/11
2001/08/21
*注意
これは私自身の為の覚え書きです。
全てのシステムでここに記述された内容が有効とは限りません。
また内容には勘違い、もしくは間違いがあるかもしれません。
TurboLinux Server 6.1 + α を使用しています。
PHP+Apche+PostgresでのPHPコンフィグレーションオプション
2002/05/28 php4.2.x追加
2001/06/28
PHP4
./configure --with-apxs=/usr/local/apache/bin/apxs \
--with-pgsql \
--enable-sigchild \
--enable-sysvsem \
--enable-sysvshm \
--with-gd \
--with-jpeg-dir=/usr/lib \
--enable-mbregex \
--enable-versioning <-- PHP3と共存させる場合
for php4.0.5
./configure --with-apxs=/usr/local/apache/bin/apxs \
--with-pgsql \
--enable-sigchild \
--enable-sysvsem \
--enable-sysvshm \
--with-gd \
--with-jpeg-dir=/usr/lib \
--enable-mbregex \
--enable-versioning <-- PHP3と共存させる場合
for php4.0.6
./configure --with-apxs=/usr/local/apache/bin/apxs \
--with-pgsql \
--enable-sigchild \
--enable-sysvsem \
--enable-sysvshm \
--with-gd \
--with-jpeg-dir=/usr/lib \
--with-png-dir=/usr/lib \ <-- 注意 php4.0.6 では明示的に指定する
--with-zlib-dir=/usr/lib \ <-- 注意 php4.0.6 では明示的に指定する
--with-ttf \ <-- 注意 php4.0.6 では明示的に指定する
(Freetype 1.x)
--enable-versioning \ <-- PHP3と共存させる場合
--enable-mbregex \
--enable-mbstring \ <-- 注意 日本語処理(マルチバイト?)の為に
--enable-mbstr-enc-trans <-- 注意 日本語処理(マルチバイト?)の為に
for php4.2.1 with gd2
./configure --with-apxs=/usr/local/apache/bin/apxs \
--with-pgsql \ <-- PostgrSQLを利用
--enable-sigchild \
--enable-sysvsem \
--enable-sysvshm \
--with-gd \ <-- gdを利用する
--with-jpeg-dir=/usr/lib \ <-- gdでjpegを利用する場合
--with-png-dir=/usr/lib \ <-- gdでpngを利用する場合
--with-zlib-dir=/usr/lib \
--with-freetype-dir=/usr/local/lib \ <-- freetype2
--enable-gd-native-ttf \ <-- gdでttfを利用する場合
--enable-mbregex \ <-- 日本語処理の為に
--enable-mbstring \ <-- 日本語処理の為に
--enable-mbstr-enc-trans \ <-- 日本語処理の為に
--with-mcrypt <-- Mcrypt暗号化関数を利用する場合
*gd1.xを利用する場合は
--with-freetype-dir=/usr/local/lib
--enable-gd-native-ttf
ではなく
--with-ttf
とする。
cgi版を作るには
./configure --enable-force-cgi-redirect \
:
以下略
:
"--with-apxs=...." ではなく "--enable-force-cgi-redirect" を指定する
**PostgrSQLをソースからインストールからそのままインストールした時は
"/etc/ld.so.conf"に "/usr/local/pgsql/lib"を追加しておくとよいかも。
**PHP4とPostgrSQLのバージョンには注意が必要です。
PHP4.0.4ではPostgrSQLの 7.1.xは利用できないようです。
make時にヘッダーファイルが無いと怒られます。
TOPへ
PHPによるグラフィックの取扱
2001/10/30 gd 2.xについて追加
2001/06/28
2000/08/08 初版
PHPでは gdライブラリーを使うことにより PNG, JPEG , WBMP のイメージファイル
を取扱う事が可能となる。
(gd ライブラリーの 1.6.x 以前では gifファイルが使用可能であったが 1.8.x以降は
gifファイルは使用できない)
gdライブラリーのソースはこちら。
gdライブラリーを使う場合以下のライブラリーが必要となる。
(各ライブラリーは gd のインストールする前にインストールされている必要がある。)
libpng
jpeg-6b かそれ以降のバージョン
zlib
freetype
2000/11/25 |
Turbolinux Server 6.1の場合以下のものををインストールする。
(*-devel-*はgd/phpのmake時に必要)
png |
libpng-1.0.5-1
libpng-devel-1.0.5-1
|
zlib |
zlib-1.1.3-3
zlib-devel-1.1.3-3
|
jpeg |
libjpeg-6b-7
libjpeg-devel-6b-7
|
TrueType |
freetype-1.2-3
freetype-devel-1.2-3
|
|
|
JPEGを使用する場合は、Makefileを編集する。 |
2001/02/15 |
TrueType font を使用する場合、Makefileを編集する。
(日本語を使用する場合は必ず)
|
2001/04/13 |
freetypeをrpmでインストールした場合ヘッダーファイルがシステムのincludeディレクトリーではなくincludeディレクトリー
の下にfreetypeディレクトリーが作成されその下にインストールされる場合があります。
その場合、freetypeのヘッダーファイルをシステムのincludeディレクトリーにコピーするかMkaefileを修正する。
(freetype-devel-1.3.1-3.i386.rpmの場合 /usr/include/freetypeにヘッダーファイルがインストールされます)
|
2001/04/13 |
make install でヘッダーファイルが /usr/local/include にイン
ストールされます。
/usr/local/include がない場合はあらかじめ作成しておく。
|
gdの構築には configureコマンドがないので、Makefileを修正後、make ;make install を行う。
画像形式に JPEG,PNG、そして TrueType font を使用する場合は以下の部分を修正する。
Makefile
14行目あたり
CFLAGS=-O -DHAVE_JPEG -DHAVE_LIBTTF <-- '-DHAVE_JPEG','-DHAVE_LIBTTF'を追加
26行目あたり
LIBS=-lm -lgd -lpng -lz -ljpeg -lttf <-- '-ljpeg','-lttf' を追加
43行目あたり
INCLUDEDIRS=-I. -I/usr/include/freetype -I/usr/local/include -I/usr/include/X11 -I/usr/X11R6/include/X11
<-- 追加する
PHPのコンフィグレーション時に "--with-gd" を追加し Apache+PHPのインストール
に従いインストールを行う。
2000/11/25 |
JPEGを使用する場合は、明示的に JPEG の使用を指定する。
--with-jpeg-dir=[gdで使用するJPEGのlibがあるdir]
exp.) --with-jpeg-dir=/usr/lib
|
2001/06/28 |
PHP4.0.6の場合、以下のオプションを明示的に指定する必要がある。
gd を使う場合 zlib が必要なので 以下のオプションを使用する。
--with-zlib-dir=[gdで使用するZLIBのlibがあるdir]
exp.) --with-zlib-dir=/usr/lib
PNG を使用する場合は、以下のオプションを使用する。
--with-png-dir=[gdで使用するPNGのlibがあるdir]
exp.) --with-png-dir=/usr/lib
FreeType 1.x を使用する場合は、以下のオプションを使用する。
--with-ttf
|
PHP4での透明pngファイルについて
gd-1.8.3 + PHP4(DSO版)の場合 ImageColorTransparent で既存の画像ファイル
から透明色のID取得は失敗する。(httpdが落ちます) 2000/08/08現在
gd 2.x 01/10/30 追加
TrueType 1.xのサポートがなくなり TrueType 2.xのサポートとなりました。
また、Makefileは編集無しでいけそうです。
TurboLinux Server 6.1 の場合 freetype2(TrueType 2.x)のrpmパッケージは無いので
TurboLinux Workstation 7 のソースパッケージを持ってきて rpm パッケージを作成
するのが手軽で良いでしょう。
phpのconfigure時に次のオプションを指定する
--with-freetype-dir=/usr/local/lib
--enable-gd-native-ttf
|
* "--with-ttf"(for Freetype 1.x)は指定しない
*インストール時の注意
古いバージョンの gd がある場合、それにあわせてインストールのディレクトリーを
設定(/usr/local/xxx)するか、古いバージョンは削除する。
古いバージョンが残っていると "make test"が失敗するかも。
それ以外にも不都合があるかも。
TOPへ
PHP+IBM DB2について
IBM DB2 を PHP から使用する場合は ODBC 経由でのアクセスとなる。
この場合 ODBCドライバーとして iODBC と OpenLink ODBC ドライバーが必要となる。
Apache+php4+IBM DB2 DSOモード
make時に /usr/bin/ld: cannot find -ldb2 (-ldb2 が見付からない)
等となる場合、'config_vars.mk' の EXTRA_LDFLAGS に DB2の libパスを追加する。(無理矢理モード)
Apache+php4+IBM DB2 スタティックモード
configureで /usr/bin/ld: cannot find -ldb2 (-ldb2 が見付からない)等の
エラーとなる場合は src/Configuration.tmpl の 'EXTRA_LIBS' に DB2の libパスを追加する。
exp.) EXTRA_LIBS='-L/usr/IBMdb2/V6.1/lib'
Apacheの自動起動
DB2を組み込んだ Apahe を自動起動する場合 Apacheの起動コマンド apachectl に
export DB2INSTANCE=db2inst1
の様に DB2 のインスタンスを設定する
DB2をアクセスする為の PHP コーディング
DB2アクセスの為には iODBC と Openlink ODBC ドライバーに対する設定を行う。
(各iniファイルの内容はドライバーに添付の説明書を参照)
ex.)
<?
putenv("ODBCINI=/usr/local/openlink/bin/odbc.ini");
putenv("ODBCINST=/usr/local/openlink/bin/odbcinst.ini");
putenv("LD_LIBRARY_PATH=/usr/local/openlink/lib");
$dsn="db2db";
$usr="zzzzzz";
$password="xxxxx";
$con=odbc_connect("$dsn","$usr","$password") ;
:
:
:
?>
TOPへ
PHP4の日本語文字処理について
2002/01/24 最終更新
2001/10/26
2001/06/28
2000/08
*PHP4.0.6 で php4_jstring の機能が取り込まれました。
関数は jstr_xxx から mb_xxx となります。
PHPのコンフィグレーション時に 以下のオプションを使用する。
--enable-mbstring
--enable-mbstr-enc-trans
以下、PHP4.0.6以前のバージョンに対して
PHP3の場合は国際化バージョンを使用することにより日本語の文字処理を行う
ことができるが PHP4はまだ国際化が行われていない為、PHP3と同様の処理が
行えない。
しかし、外部モジュールを使用する事によりPHP3と同定度の処理が可能となる。
必要となるモジュールは ftp://night.fminn.nagano.nagano.jp/php4/ から入手
php4_jstring-20010205.tar.gz (2001/02/17 現在)
php4_jstring-1.1.1.tar.gz (2002/01/24 現在)
*注意*
"php4_jstring-1.1.1"から関数名は"mb_xxx"に変更されています。
以前の"jstr_xxx"は利用できません。
インストールは添付の READMEファイルを参考にする。
ex.) 共有モジュール(ダイナミックリンク)の場合
$ tar zxfv php4_jstring-*.tar.gz
$ cd jstring
$ phpize
$ ./configure --enable-jstring
$ make
$ su
# make install
make[1]: Entering directory `/home/ora/src/jstring'
installing shared modules into /usr/local/lib/php/extensions/debug-non-zts-20000609
make[1]: Leaving directory `/home/ora/src/jstring' ↑
インストールされたディレクトリー
#
|
(モジュール jstring.so が "/usr/local/lib/php/extensions/debug-non-zts-20000609"にインストールされる。)
php.ini の内容を修正する
extension_dir = /usr/local/lib/php/extensions/debug-non-zts-20000609
enable_dl = On
|
PHP3に対応する関数は READMEファイルを参照。
jstringの関数を使用する場合は dl() 関数によりモジュールをロードする。
$kanji_str = "感じ漢字幹事" ;
dl("jstring.so") ;
if (function_exists(jstr_convert_encoding)) { ← 新旧日本語モジュール チェック
jstr_convert_encoding($kanji_str,"utf-8" ) ;
} else {
mb_convert_encoding($kanji_str,"utf-8" ) ;
}
|
jstr_convert_encoding($kanji_str,"utf-8","auto" ) ;
*注 変換前の文字コードに "auto" を指定して下さい。
クライアントが Win系の場合、処理の方法により漢字コードを正常に認識
できないようです。
ちなみに i18n_convert の場合は無くても大丈夫でした。
インストール後は Apache を再起動する。
追記:PHP4で"jstring"モジュールが正常に動作しない場合。
古いバージョンから新しいバージョンにアップグレードすると、古いヘッダーファイルが残っているため
"jstring"が正常に動作しない場合がある。(ようです。)
Apacheのエラーログを見ると
/usr/local/apache/bin/httpd: error in loading shared libraries: /usr/local/lib/php
/extensions/debug-non-zts-20001214/jstring.so: undefined symbol: php_register_ini_entries
みたいなエラーが記録されていることがあります。
("php_register_ini_entries"なんてのは無い!といってます。)
この場合は古いファイルを消して再インストールをしましょう。
/usr/local/include/php
/usr/local/lib/php
この二つのディレクトリーを消せばいいかも。
TOPへ
PHP4のマルチバイト文字に対応した正規表現
2002/01/24 最終更新
外部モジュールを使用する事によりマルチバイト文字に対応した正規表現が可能となる。
必要となるモジュールは ftp://night.fminn.nagano.nagano.jp/php4/ から入手
PHP4のバージョンによりモジュールが異なることに注意。
詳細は付属のドキュメントを参照のこと。
PHP4.1.0以前
php4_mbregex-1.2.1.tar.gz (2002/01/24 現在)
PHP4.1.0以降
php4_mbregex-1.3.1.tar.gz (2002/01/24 現在)
インストールは添付の READMEファイルを参考にする。
(基本的には"jstring"と同じです。)
ex.) 共有モジュール(ダイナミックリンク)の場合
$ tar zxfv php4_mbregex-*.tar.gz
$ cd jstring
$ phpize
$ ./configure --enable-mbregex
$ make
$ su
# make install
make[1]: Entering directory `/home/ora/src/mbregex'
installing shared modules into /usr/local/lib/php/extensions/debug-non-zts-xxxxxxxx
make[1]: Leaving directory `/home/ora/src/mbregex' ↑
インストールされたディレクトリー
#
|
すでに"jstring"がインストールされている場合はこれで終わり。
"jstring"と同じ場所にモジュールがインストールされます。(されるはず)
"jstring"をインストールしていない場合は"PHP4の日本語文字処理について"を
参考に "php.ini" を修正する
TOPへ
PHP+Oracle DSO版作成の手引
php+Oracle の DSO版を通常の手順で作成した場合、Apacheの起動が行えなくなる。
これを回避する為、Apacheのビルドに工夫が必要となる。
Apacheの configure を行った後、 src/Makefile の 'EXTRA_LDFLAGS' に '-lpthread' を
追加する。
ex.) $ cd apache_1.3.12
$ ./configure
$ vi src/Makefile
EXTRA_LDFLAGS='-lpthread'
$ make
$ su
# make install
TOPへ
ファイルアップロード時の注意点
2000/11 更新
PHP3の場合
Windowsクライアントから Web経由でのファイルアップロードを
行う場合、ファイル名がフルパスとなってします。
(Linuxではファイル名のみ)
この場合、PHPによりファイル名のみを取り出す命令を書く必要がある。
ただし、PHPのファイルシステム関数の basename() 関数は そのままで
は Unix系のパス区切り文字(/)にしか対応していないため使用できない。
そのため、ファイルアップロードの場合、クライアント側のosをチェック
し、ファイル名のみを取り出すコードを書くか、またはソースファイルを
修正する必要がある。
(MACの場合は?)
修正するソース
PHP3 --> functions/string.c
void php3_basename関数でWin用のコードがあるので有効にする。(二箇所)
PHP4の場合
PHP4で、Windowsクライアントから Web経由でのファイルアップロードを
した場合はファイル名のみが引き渡されるのでOK。
TOPへ
PHP3とPHP4の共存
00/08/04
Apacheで PHP3 と PHP4 を共存させるには PHPをDSO版で作成する必要がある。
この場合、configureのオプションに
--enable-versioning --enable-track-vars
を追加する。
TOPへ
PHPを使った Webメールの送信
01/08/08 最終更新
01/07/05
00/12/14
PHPでは mail()関数を使うことにより Webブラウザ上から簡単にメールを送信できる。
PHPで日本語のメールを送る場合は各バージョンにより以下の関数が使用できる。
PHP3 国際化版 mail()関数
PHP4.0.6 以前 + "jstring" module jstr_send_mail()関数
PHP4.0.6 以降 mb_send_mail()関数
*注意!
MTA(≒メールサーバー)に qmail を使用している場合は以下の点に注意すること。
qmail の場合 メールヘッダーの Date フィールドに曜日が付きません。
([RFC 2822] では曜日はオプションです。)
PC用のメールソフトであれば影響が少ないと思われますが、携帯などでは
日付/時刻が正常に表示できないものが有るようです。
Dateフィールドに曜日をつける場合、mail()関数の引数にDateフィールドを
渡しましょう。
以下、サンプル --> PHP4.0.6 以前 + "jstring" module
<?
$add_headers1 = "X-Mailer: PHP(Web mail)" ;
$add_headers2 = "Date: ". date( "D, j M Y G:i:s +0900") ; // Dateフィールド
jstr_send_mail($mailto,$subject,$mess
,"Return-Path: $from\nFrom: $from\n$add_headers1\n$add_headers2\n") ;
?>
|
どうしても PHP4でmail()関数を使用したい場合は以下を参考。
mail()関数は日本語に対応していないためメールヘッダー、subjectの
内容、本文の内容等、以下の処理を自分でやらなければならない。
1.メールヘッダーの追加
2.subjectのエンコード
3.本文の文字コード変換
1.メールヘッダーの追加
日本語のメールを送信する場合は最低、次のヘッダーを設定する。
Content-Type: text/plain; charset=iso-2022-jp
Content-Transfer-Encoding: 7bit
MIME-Version: 1.0
|
2.subjectのエンコード
Subject に日本語を使用する場合、そのままでは subject が文字化けしてしまう。
(文字化けしないメールソフトもあるが、それは単にそのメールソフトの独自拡張で
あり、文字化けするのが本来の仕様である。)
Subject を文字化けしないようにするには base64でエンコードを行う必要がある。
その後、それを =?ISO-2022-JP? と ?= ではさみ Subject とする。
PHP4の場合、jstr_encode_mimeheader()関数を使用すれば =?ISO-2022-JP? と ?=
が付加された結果が得られるのでこれを使用する。
PHP3の場合は、i18n_mime_header_encode を使用する。
例) "おたすけ"をjstr_encode_mimeheader()関数で処理すると
=?ISO-2022-JP?B?GyRCJCokPyQ5JDEbKEI=?=
といった感じで結果が得られる。
01/08/08 追加
jstr_encode_mimeheader()を使用する場合には注意が必要である。
エンコードする文字列に日本語と1バイト文字が混在する場合、
jstr_encode_mimeheader(文字列)では正しい結果が得られない場合がある。
正しい結果を得る為には
jstr_encode_mimeheader(文字列, 文字コード, 変換前の文字コード,改行文字)
とする必要が有る。("README"にはこの記載がないようです。)
また"改行文字"には "\n"(LF,0x0A)を指定すること。(これは重要です)
$subj = jstr_encode_mimeheader($subject,"JIS","EUC-JP","\n") ; //Subject のエンコード
|
* i18n_mime_header_encode() については未確認。
3.本文の文字コード変換
メール本文はJISコードにする必要がある。
jstr_convert_encoding()関数で文字コード変換を行う。
以下、サンプル --> PHP4.0.6 以前 + "jstring" module
<?
dl("jstring.so"); // "jstring" moduleのロード
$mailto = "dareka@dokoka.no.jp" ; // 相手のメールアドレス
$from = "watasi@koko.no.jp" ; // 自分のメールアドレス
$subj = jstr_encode_mimeheader($subject) ; //Subject のエンコード
$subj = jstr_encode_mimeheader($subject,"JIS","EUC-JP","\n") ; //Subject のエンコード
$add_headers1 = "X-Mailer: PHP(Web mail)" ;
$add_headers2 = "Content-Type: text/plain; charset=iso-2022-jp" ;
$add_headers3 = "Content-Transfer-Encoding: 7bit" ;
$add_headers4 = "MIME-Version: 1.0" ;
$add_headers5 = "Date: ". date( "D, j M Y G:i:s +0900") ; // Dateフィールド
// 本文をJISコードに変換(元がJISなら不要)
$messj = jstr_convert_encoding($mess,"JIS","EUC") ;
mail($mailto,$subj,$messj,"Return-Path: $from\nFrom: $from\n
$add_headers1\n$add_headers4\n$add_headers2\n$add_headers3\n$add_headers5\n") ;
?>
|
TOPへ
FORMでのデータ受渡の注意点
01/04/24
受け渡すデータに ",',\,NUL の文字があると初期設定では自動で '\'でエスケープ
される。
つまり、受け取った後、'\'を stripslashes()で取り除く必要がある。
これをやめたければ、php.ini のmagic_quotes_gpcを Off に設定する。
TOPへ
配列のソートについて
01/04/26
配列(table)をソートするには sort() 関数が使用できる。
使用方法の詳細はマニュアルを参照。
利用上の注意
子供の手が届かないところに保管してください。
日中の車内に放置しないでください。
ソートを行う場合配列中の一要素をキーとして昇順に並べ替えられるが、配列が多次元の場合
注意が必要である。
例えば、 $tbl[][] のような配列の場合、
通常は
$tbl[0][0] = "k" ;
$tbl[1][0] = "o" ;
$tbl[2][0] = "o" ;
$tbl[3][0] = "r" ;
$tbl[0][1] = "3" ;
$tbl[1][1] = "2" ;
$tbl[2][1] = "1" ;
$tbl[3][1] = "5" ;
という風にデータをセットしていくが、処理上、必ずしもこうできない場合がある。
例えばこうである。
$tbl[0][1] = "3" ;
$tbl[1][1] = "2" ;
$tbl[2][1] = "1" ;
$tbl[3][1] = "5" ;
$tbl[0][0] = "k" ;
$tbl[1][0] = "o" ;
$tbl[2][0] = "o" ;
$tbl[3][0] = "r" ;
こうなった場合、sort()関数で $tbl[][0] をキーとして並べ替えようとしても
期待した結果とならない。
この場合、ソートのキーは $tbl[][1] となる。
この sort() 関数はどうやら最初にセットされた要素をキーと認識する様である。
これはこれで使い方によっては便利である。
が、やはり配列の最初の要素をキーにしたいのが人情であるから、この場合、
すなおに、ソート用に別配列を準備しましょう。
TOPへ
特定ディレクトリーで PHP を無効にする
01/06/28
特定ディレクトリーで PHP を無効にするにはApacheのhttpd.confで
<LocationMatch>/<DirectoryMatch>ディレクティブを利用する
PHPにおけるPHPの有効/無効の設定ディレクティブは engineディレクティブとなる
PHP3とPHP4ではその記述が異なる。
PHP4 −−> php_admin_flag engine off
PHP3 −−> php3_engine off
例えばユーザーのホームディレクトリーでPHP4を無効にしたい場合は以下の設定を
Apache の httpd.conf に追加する。
PHP3の場合 'php_admin_flag engine' を 'php3_engine' にする。
<DirectoryMatch /home/>
php_admin_flag engine off
</DirectoryMatch>
|
これにより /home 以下のディレクトリーに対しては PHP4 が無効になる。
すなわち ユーザー の htmlディレクトリーは通常 /home/ユーザーID/public_html なので
これによって "http://www.hoge.hoge.jp/~ユーザーID/ "での PHPは無効となる。
ユーザーのホームディレクトリーをURLパスで制限する場合。
<LocationMatch /[~].*/>
php_admin_flag engine off
</LocationMatch>
|
<LocationMatch>/<DirectoryMatch>ディレクティブは正規表現を利用した
URLパス/ディレクトリーパス表現が可能である。
これは<Location>/<Directory>ディレクティブに対し '~'(チルダ)を使用
したのと同意である。
<LocationMatch /[~].*/>
は<Location>ディレクティブだと
<Location ~/[~].*/>
となる(と思われる。自信なし)
<LocationMatch>/<DirectoryMatch>/<Location>/<Directory>ディレクティブ
において '~'(チルダ)はあくまでも '~'(チルダ)であり決してホームディレクト
リーを表現するものではない。(これも自信なし)
(ただし最初に現れる'~'(チルダ)は正規表現の指定を示す)
ユーザーのホームディレクトリーをURLで制限する場合に
<LocationMatch ~*>
とするのは誤りである。
この場合 '~'(チルダ)は正規表現の指定であり、また'*'はワイルドカードとなり、
結果全てのURLパスで PHPが無効となる。(というかこれをやるとそうなる)
特定のURLパスに対してPHP4を無効にしたい場合は以下の様にする。
例) www.hoge.hoge.jp/hoge/user/ 以下での PHP利用を無効化
<LocationMatch /hoge/user/>
php_admin_flag engine off
</LocationMatch>
|
この場合 PHPのコンテンツにアクセスするとそのソースがソースとして表示される。
TOPへ
Cookieの落とし穴
02/01/11
*PHPにおいてクッキーを削除する場合、"setcookie"の引数のクッキー内容に空文字("")を
指定し、有効期限を過去に設定する。
しかし、実際にはクッキーの内容は空文字としてブラウザーに送られるのではなく"deleted"
がクッキーの内容として送られる。
クッキー内容に空文字("")にした場合、有効期限の設定有無に関わらず1年前の日付が設定される。
(PHP4.0.xの場合)
Netscapeの場合過去の日付は認識できない様である。
端末の日付より過去の日付は"0"つまり"Thu Jan 01 09:00:00 1970"となる(みたい)。
(Netscape 4.7x)
一部のブラウザーではクッキーの処理にバグがある様でクッキーが正常に削除されない
場合がある。(IE5の初期版で現象が発生)
その為、クッキーの内容の有無のみでクッキーのセット状態をチェックするのは危険である。
危険な例)
if (isset($cookie_name)) {
echo "クッキーあり" ;
} else {
echo "クッキーなし" ;
}
|
上記の例ではブラウザー側で正常にクッキーが削除されない場合、常に"クッキーあり"となるので
以降の処理で不具合が発生する可能性がある。
ブラウザー側で正常にクッキーが削除されない場合に対応する為には以下の様なチェックが必要である。
対応した例)
if (isset($cookie_name)) {
if ($cookie_name != "deleted") {
echo "クッキーあり" ;
} else {
echo "クッキーなし" ;
}
} else {
echo "クッキーなし" ;
}
|
*当然の事としてクッキーの内容に通常は"deleted"を使用してはならない。
追記1.
クッキーを削除する場合、多くの場合以下の書式で削除が可能である。
(ただし、これはちょっと行儀が悪いやり方である)
setcookie ("cookie_name", "", "");
|
しかし!一部のブラウザーでは何かの拍子に突然上記の方法では削除できなくなる場合がある。
(IE5 SP2で確認)
この様な気まぐれなブラウザーがあるので(それも多くの人がこれ)もう少し行儀よく、クッキーを
セットした場合と同様の書式で削除する必要がある。
// クッキーセット
setcookie ("cookie_name", "eat me", "","/path/koko");
// クッキー削除
setcookie ("cookie_name", "" , "" , "/path/koko");
|
TOPへ
Cookieその2
02/05/29
PHP4 のバージョンによっては setcookie() のパラメータをキチンと指定しなければ
ならないようです。
例えば php4.0.4 あたりだと
// cookie をセット
setcookie("eat_me","please eat","","/path/koko") ;
|
でも大丈夫だったりしますが("expire"を未指定[無期限?])
PHP4.2.1だと
Warning: setcookie() expects parameter 3 to be long, string given in ....
|
などと怒られます。(Warningなので気にならない方もいるかもしれませんが...)
素直に期限付きで設定しましょう.
// cookie をセット 一時間有効
setcookie("eat_me","please eat",time()+3600,"/path/koko") ;
|
さらに、当然の如く、クッキーの削除もキチンとやりましょう。
// cookie を削除
setcookie("eat_me","",time()-3600,"/path/koko") ;
|
TOPへ
認証処理付き、ファイルのダウンロード
02/07/23
認証処理を行った後にファイルをダウンロードさせるには?
:
:
<FORM METHOD="POST" ACTION="download1.php">
ユーザーID<input type="text" name="user_id"><br>
パスワード<input type="password" name="pass"><br>
<input type="submit" name="gogo2" value="ダウンロード">
</form>
:
:
ダウンロードページ download1.php
<?
ob_start() ; // おまじない
:
認証処理
:
if (認証OK) {
$fname = "hogehoge.txt" ;
header("Content-disposition: attachment; Filename=$fname");
header("Content-type: application/lstoctet-stream; name=$fname"); ← ファイルに対応したヘッダーを設定する
$fpx = fopen($fname,"r") ;
while (!feof ($fpx)) { echo fgets($fpx,2048) ; }
fclose($fpx) ;
}
ob_end_flush() ; // おまじない
?>
TOPへ
SSL接続でphpが動作しない?
02/10/25
http.confのsslの部分に以下の設定をします。
httpd.conf
<VirtualHost _default_:443>
:
:
<IfModule mod_php4.c> ← これはなくてもいい
php_admin_flag engine on
</IfModule>
:
:
</VirtualHost>
|
TOPへ
ページをリロードしてページの途中から表示
たとえば、入力フォームで入力値をチェックしエラーの場合、その項目を
ページの頭に表示したい時など。
こちらを参照。