2007/07/24

携帯忘れてた

おいおいsessionとか使えたっけ?なんかHTTP_REFERRERとかとれてないっぽいぞ。
$_SERVERをprint_rしたら悲惨な結果が。
うぅむ。

2007/07/13

sessionの役目

 データ層にアクセスするのは頻繁でない事が好まれる。
データの破損や、データの整合性を高めるためには必要な気配り。

PHPではsessionが簡単に利用できるのは知っていると思うが、
session_start();
さえ言ってしまえば、配列だろうがなんだろうが$_SESSIONに格納することができる。

こいつはphp.iniや.htaccess(api版)により、sessionの有効範囲を指定していない場合、
画面を閉じるまでの間有効となる。

そこで、通販の場合の注文予定商品や、ページをまたぐテスト問題の回答を行う際に、
$_SESSION["cart"][$itemnumber] = $amount;
と、商品番号と数を保持したり、
$_SESSION["qustion"][$question_number] = $answer;
と、問題番号と回答番号を保持したりしておき、

注文確定時や、回答採点時に、

foreach($_SESSION["question"] as $key => $value){
$insert_query = "insert into answer_log values($key,$value,,,,,); ";
}
のように、問題番号に対する回答を登録したりする。

その他にも、ページ単位のアクセスログなんかも、度々記録されるとたまったもんじゃないが、
画面を閉じたというアクションを取得する方法をしらんので、その場合は$_SESSIONは活用できない。

とりあえずfileに格納しておいて、cronなどのサーバサイド自動実行処理を利用し、定期的に収集するのがオーソドックスなやりかたじゃないだろうか。

まぁ、便利やわ。
リンクの引数が多すぎる場合とかも$_SESSION["post"]とかで持っといても良いしね。

2007/07/11

ページ間引数(昇順・降順切り替え)

昇順や降順にする分はajaxのよさげなもんもありそうだが、そっちに疎い私はそんなもんはこの世に存在してるんだ凄いね。ぐらいでほっとく。必要に迫られない限りはこのブログの投稿なみにごり押しで早くするべし。

さて、sortっつーかデータベース前提なんだが、fileでもsortとかrsortとかあるからなんとかなるよ、理論だけ気合で把握。

リンク部分にクエリの一部か、ストアド(予め任意に予約しとくクエリセット)のキーをセットしといて発動させるわけだが、当該ページにアクセスする際に、sortに関した引数が無い場合はasc側のクエリ。
ある場合はdesc側のクエリを実行してくれりゃそれで済む。

もちろん前のページ移動時と同様にそのページに渡されている情報は保持しないといけない、ページ番号とかね。

整列した瞬間1ページ目に戻ったりしたらナイーブな気持ちが漂うからね。

一番手っ取り早いのはstr_replaceとかでascをdescに書き換えるとか。

たこ焼きくいてぇ。

ページ間引数(ページ制御の場合)

ページをあらわす変数以外は前のページの情報をもっとかんとだめ。

ただし、前のページで私の手法を使わずに登録時の引数なども受け取っている場合は、それも除外しないと、ページ移動するたんびに増殖(編集)するはめになる。

基本的には$_REQUESTをforeachとかでまわして、keyが除外対象でないものは全て並列引数にするか、input type hidden の記述セットで用意して、リンクやformタグ内に配置する。

GETとPOSTの利用箇所判断基準

GETはリンクのけつにつくので、アドレスばれるのが嫌な人用とか、

そんなんべつにええがな。

GETで移動した先のページは、同じGETアドレスで再度実行できてしまうのが問題で、

POSTで移動した先のページにもう一度POSTアドレスで移動した場合は情報の有効期限切れが起こるわけだ。(情報の再送信要求)

登録処理とか、編集時にログとってるときとか、連続でなんどもされると困るところはPOST。

逆に戻れた方が良い箇所とかはGETという選択になる。

私の場合は登録などはPOSTで通し、実行後にheader(location)などで登録処理をしたアドレスのページからとっとと移動してしまう。

古いやり方でいうならば、登録ありがとう御座いましたのページに逝っちゃうわけだ。

頑張れ若者たちよ。

ページ間引数(register_globals)

off で。昔はon多様だったが、まぁonの場合はonの場合でクリアしちゃえ。

$_POSTや$_GETも使わない。
$_REQUEST一本で。
前ページから、
input type text name first_your_name

とかの値が飛んできたら

echo $_REQUEST["first_your_name"];

とかで扱うし、複数フォームや、グループが見えるなら、

input type text name form1[first_your_name]
input type text name form1[last_your_name]

とかと

input type text name registed[first_your_name]
input type text name registed[last_your_name]

とかで飛ばして

echo $_REQUEST["form1"]["first_your_name"]
echo $_REQUEST["registed"]["first_your_name"]

とかで表示したり、まぁ扱う。

生で扱うと他の変数との区分けが面倒だ。
ただし、input name に配列を使うと、javascript の扱い、特に[1]とかの指定がちょっとだけ特殊。
操作的には思い通りにできるが、[]これが元々javascriptで扱いが違うので "[" + int + "]" とかで
指定しないと思ったとおりに動かない。

まぁ頑張れば解る。
ていうかinputタグとか有効なんかいこのブログ。やられた。

変数に長文を代入する方法

ヒアドキュメント方式は使わない

短文の場合

$body = "本文";

とか

$ouie = "追加";
$body = "本文".$ouie."←追加されますた";

というように代入させるので、無理やりヒアドキュメントで、

$body = "
ここに書いていく。
";

こんな感じにする。

例をあげると

$torikomona = "病";
$body = "
ここに病気の変数をいれます
".$torikomona."
よっしゃきたこれ。
";

みたいな使い方。

まぁ、ダブルクォートとかのエスケープを気にしたくない人はヒアドキュメントで。
なんとなく記述量は多少増えるが、曖昧さの無い代入方法が好きだ。
愛しいぜ。

2007/07/10

HTML-表示処理-display:noneの活用

参考資料ページ登録フォームや、
参考資料に対する問題の登録フォームを共通画面で処理する際に、
問題項目の登録が必要だったり不要だったりする場合。

不要になりうる項目のグループに特定の置換キーを設定しておき、
問題ページであるか、資料ページであるかの区分キーが変化した際に、
onchange="document.form.submit();" を食わし、action先を同じページにする。

再度読み込まれるscriptソース中に、区分キーの判別を組み込み、
if(!$_REQUEST["kubun"] $_REQUEST["kubun"] == "1"){
$html_source = str_replace("置換対象キーグループ","style:display:on;",$htmlsource);
}
else{
$html_source = str_replace("置換対象キーグループ","style:display:none;",$htmlsource);
}

で切り替えて表現する。

☆前提条件としてHTMLソースを全て変数に読み込み、変更箇所をstr_replaceをもって置換し、
最後にechoすることが必要。