PHPによるCGIスクリプト
以下は古い情報になります。PHPのバージョンがアップしているので、変わっていることもあると思われます。
本サイトをはじめようと思ったとき、見栄えから動的なものにしようと考え、CGIスクリプトの作成方法を検討しました。
その結果、PerlかPHPのどちらかにしようということになりましたが、結局PHPにしました。
→その決断に至る経緯はよく覚えていません。
→それに動的なわりには、本サイトの全体的な見た目はすごく地味です。
さて、本来はPHPのプログラムをインストールして、プログラムを作成すべきところなのでしょうが、無謀にもテキスト入力で行うことにしました。
C言語ライクなPHPですが、Web上は情報満載であり、なんとかできそうな感じなのではじめました。
でもN88BASICぐらいしかプログラム言語を本格的に扱ったことがない自分にとっては、なかなかハードルが高すぎたようです。
特に、実際やってみて思ったのですが、やった本人でないとわからない問題などもあって非常に苦労しました。
ここでは、その辺のあまりWebでは書いていない気がついた情報を掲載しようと思います。
超低レベル編
まず慣れるまで、上級者では考えられないような基本的文法ミスをすることがあります。(俺だけ?)
・ホームページの中に、<?php と ?>で囲んでプログラムを記述しますが、
なんで動かないかとよく見ると、<php? とか <?とか書いているときがあります。
・if文の条件全体の初めと終わりは、( )で囲まなければなりませんが、これをよく忘れます。
・同じくif文で、不等号は<>でよいのですが、等しいは”==”でなければなりません。
・変数は接頭語として$が必要ですが、これををよく忘れます。
→結局、javascriptと混同してしまっているのです
・演算処理の式のあとの ”;” をよく忘れます。
クォテーションで囲む
ホームページを作成する際、HTMLで作成しますが、””で囲まなければならない記述があります。
しかし、HTMLの中にPHPを記述するとき、<?php?>を挿入しますが、この中で””で囲んで、
さらにその中にHTMLの””を記述したい場合があります。この時は、PHPは’’で囲み、
HTMLはそのまま””で囲みます。実際には下記のような感じです。
print '<input type=text name="name" value="'.$name.'">さん<br>';
ただし、改行コードの\r\nを入れたい場合は、’と”は上記例の逆でなければなりません。
カタカナ「ソ」のバグ
かなりショボイ”ドわすれ検索”ですが、カタカナで作ろうと思ったら動きませんでした。
$result = str_replace( ○, ソ, $word); で完璧にバグります。なぜ?
fopenのパラメータ
fopenでファイルを開いて書き込みを行うのに、複数のパラメータがあり、どれを使用すべきか迷います。
マニュアルには以下のように書いてあります。
r+ 読み書き可能な状態で開きます。ファイルポインタはファイルの先頭におく。
w 書き込みのみで開きます。ファイルポインタはファイルの先頭におく。
a 追加書き込みモードです。ファイルポインタをファイルの終端におく。
x 書き込みのみで開きます(新規でない場合はエラー)。ファイルポインタはファイルの先頭におく。
実際に、”あいうえおかきくけこ”というデータのファイルが存在し、”さしすせそ”というデータを、
上記パラメータでそれぞれ書き込むと以下のようになります。
r+ ”さしすせそかきくけこ” →先頭から既存データに上書き
w ”さしすせそ” →既存データを破棄し新規ファイル作成
a ”あいうえおかきくけこさしすせそ” →終端から既存データに追加書き込み
w+ と a+ という読み込みも可のモードがありますが、以下のように使用すべきかと思います。
ファイルオープンしたら、書き込みが終わるまでロックしておきます。
このとき、掲示板等で使用する時には、読み込みも可にしておかないと他の人が見れないことになります。
改行コード
改行したいときは”\n”を記述しますが、なぜかこれだけでは改行してくれないときがあります。
ネットで調べると、キャリッジリターン”\r”を併用して、”\r\n”と記述すれば良いと書いてあるものが存在します。
ということは、すべて”\r\n”で良いと思いこれで行ってみると、時には一行余計な空白行が入ってしまう場合があります。
結局は結果で判断するしかありませんが、OSとかで実行結果が変わってしまうのであれば制御できません。
ディレクトリ位置
PHPの使い方関係をWebで調べていると、フォルダ(ディレクトリ)位置を示すのに、"/dir/".$filenameと書いてあるのが大半ですが、
私の使用しているプロバイダのサーバーは"./dir/".$filename と記述(右の.は文字列連結のため必要です)しないと動作しませんでした。
この辺は実際に遭遇してみないとわからない問題です。
また、関連してパーミッションも4(読み込みだけ可能)から7(全て許容)までありますが、
6で十分と思っても7にしてあげないと動作しない場合があるようです。
クッキー
クッキー関数は使ってみると非常に役に立ちます。ただし引数がいくつかあるうち、最低”クッキー名”と”書き込む内容”を
指定すれば良いようなことを書いている情報サイトがありますが、”保存期間”も指定する必要があるようです。
その後、クッキーを利用してPHPのプログラムを作成しておりましたが、1サーバーからは20個しか発行できないということがわかりました。
これだと、すぐに枯渇してしまいますが、配列関数によって回避できることがわかりました。
その辺の内容は、”そふぃ”さんのPHP入門サイトに書いてありますので、是非一読すべきと思います。
他のサイトは”じじい”には”イミフ”なのですが、ここに書いていることはなんとか理解できます。
ちなみに、私なりのクッキーの利用の仕方を、”そふぃ”さんのサイトなどを参考に以下に記述します。
・クッキーの読み込み
if( isset($_COOKIE["クッキー名"]) ){
foreach($_COOKIE["クッキー名"] as $number => $value){
$クッキー名[$number] = $value ;
}
}
※$numberと$valueはどういう変数名を使用しても良い
・クッキーの書き込み
for( $i = 1 ; $i <= 使用するクッキーの数 ; $i++ ) {
setcookie("クッキー名[$i]", $cook[$i] ,time()+60*60*24);
}
※$cook[$i]というようにできるのは、$cook[1],$cook[2]・・・と変数で指定されている場合
そうでない場合は、setcookie("クッキー名[1]", クッキー値1 ,time()+60*60*24);
setcookie("クッキー名[2]", クッキー値2 ,time()+60*60*24);
・・・ というようにひとつずつ書き込み
配列変数
配列変数を使用する場合、$hensu[$i]というように、[]内の数値も変数として使いたい時があります。
このとき、続けて[$i+1]も使おうと思って、$hensu[$i+1]と記述してもうまくいきませんでした。
これは、たとえば$iが3のときに当然$i+1は4と認識してくれると思いきや、これができないのです。
そのまま文字列として、”3+1”で認識されるので、$hensu[4]ではなく$hensu[3+1]という判断をされて、
PHPのプログラム上では不正な動作をします。
対処方法としては、予め$j=$i+1;という演算を行って、$hensu[$j]のように記述します。
データの受け渡し
PHPの妙味は、アクセスした人の対応やその時の状況によって、次のページに遷移したときの結果が
変わるということです。そのためのデータの受け渡しに関するメモです。
<form method="post" action="次のページ">
<input type="text" name="name" value="値"> →これはセレクトメニューやラジオボタンもあり得る
</form">
最初のページは上記のような場合がよくあるパターンであると思います。2ページ目での受け取りは、
$hensu = $_POST["name"];です。 →POSTとGETとREQUESTの違いをおぼえておいた方がよいかも
3ページ目以降に飛ばす場合の手法としては、以下の2つの方法があるかと思います。
session管理 これが王道
※飛ばすページ
$_SESSION["名前"] = $関数名; →次のページへ送る準備完了
※受け取るページ
session_start; →必ずHTMLの記述の前に記述
$適当な名前 = $_SESSION["名前"];
hiddenで飛ばす じじいの手抜き手法
<input type="hidden" name="name" value="値">
警告対策
あるとき、いくつものページ表示でWarningが発生していました。原因は、CGIサーバーのバージョンアップに伴い、
PHPがバージョン4から5に上がった際に、環境が変わったようです。
この手の問題は有名なことであり、ネット検索で比較的簡単に対処方法がわかりました。
・タイムゾーンの指定
時間関数を使用する場合、タイムゾーンを設定しないとエラーになるようです。
対策は、関数を使用する前に、date_default_timezone_set("Japan");と記述します。
・ファイル形式変更
UTF-8で保存したファイルで、エラーが出ます。これは、UTF-8では先頭のBOMというものが付いているためだそうで、
対策としては、UTF-8N形式で保存し直します。
・最終対策
どうしてもWarningが出てしまう場合、最終手段として、下記の文を入れて表示させないようにします。
error_reporting(0);
トップページへ