2008/04/27

function構造プログラムのミソ

先の記事でも書いているようにfunction構造を基本にプログラムを書き出した。

ここで、functionの中と外で変数が使えないので、そのスクリプト内独自のfunction部分に関しては、
すべて次のように記述するようにした。

// 呼び出し元
$message = get_record($message);

// エラーメッセージがなければ表示
if(count($message["fatal"]) == 0){
$message = disp_result($message);
}
// エラーメッセージがあるならエラー表示
else{
$message = disp_error($message);
}

exit_operation($message);

// 独自function
function get_record(&$message){
$message["debug.print"]["process"] = "レコードの取得処理開始!";

// プログラムつらつらと
  // エラー処理とか
if($getdatamiss){
$message["fatal"]["get_record"] = "致命的なエラー発生";
}
else{
$message["result"]["get_record"] = "正常に処理を完了";
}

// 中で通知したものを返す
return $message;

} // function END

みたいな感じで、$messageを常に投げて投げ返してやっていく形をとってみた。
さぁどうなることやら。

PHPで取得したMYSQLのresultの扱い

今までfunctionすらちゃんと使っていなかったので、
各機能をすべてfunction化して行くと中々面倒な事が起こってくる。

functionが無いと、後々面倒なのは差し置いて、すべての変数がglobal扱いで、
どこからでも参照できるが、function外で宣言された変数を利用する場合は、
引数として渡すか、global関数で取り込まないといけない。

そんな単純な事をしていると、function内で取得したmysql_queryの結果変数を、
そのまま引数の$messageに渡す、つまり次のような事をすると、

$result = mysql_query($query);
$message["record"] = mysql_fetch_assoc($result);

この$message["record"]には$resultのmysqlポインタが渡されただけのようで、
この後に次の行為を行うと、return $messageをしても、mysqlデータベースの値を
取得できなくなってしまう。

mysql_free_result($result);

イメージ的にはassocをしてレコードの内容を取得したので、その行レコードだけもって
帰れると思っていたが、assocで帰ってくるのもポインタだという事で。

結局、忘れないように、

// 開放すると取得できなくなる!
// mysql_free_result($result);

とする運びになった。
むぅん。

2007/12/06

ちょっぴりVBA

なんかこのブログがフルイングリッシュ化されてしまって、ブルーですが。
どうもアキノタノヨウコです。
本日はPHPではなく、VBAの事を少しだけ。

■ゴールデンバット
「マイクソロフトアクセスを触った事を無い人は少々イメージがつきにくいと思うだらが、君たち私たちが触れた事が常識っぽいネスカフェ・エクセルなどにもあるボタンを配置するだら。」

■ゴールデンバット
「ここでエクセルなどではマクロを開始するボタンをなどをVBA作成画面の方で作成可能なように、アクセスでも同様に設定が可能で、さらにそれは簡単で詳細にプログラムすることができるだら。」

■ゴールデンバット
「ほんでまぁ、今回はそんなボタンに対するクリックなどのイベントに対するVBAを設定する場合に、アクセスの場合はダブルクリックをすると、VBAの作成画面に突入して、イベントプロシージャ部分の、VBA作成画面に突入するだら。」

■ゴールデンバット
「んで、そんなイベントプロシージャのようにクリック時などの動作をプログラムする部分と、通常の関数的扱いであるsubプロシージャやfunctionプロシージャがあるだらが、それらの違いを若干考えてみるだら。」

■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
1:イベントプロシージャはイベントがクリックやマウスが上にくるなど、そのイベントプロシージャ自体が受け取るアクションが特定されているため、それ以外の引数などを持つことはできない、また、アクションが発端で動作するために、返り値という概念も基本的には持たない。

2:subプロシージャは、返り値を持たない、任意の引数を受け取る事ができるプログラム郡で、同様の動作を複数の局面で利用したり、繰り返したり、まとめたりする場合に作成する。

3:functionプロシージャは、その名の通り他言語で言う関数と同じで、任意の引数を持つ事ができ、任意の変数や値、配列を、functionプロシージャを実行した元に返す戻り値を持つ事ができる。
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

といった所だろうか、たいした内容ではないのでこのまとめをもって、本案件を採用するだら!

2007/11/06

phpファイルで扱う変数とHTMLで扱う文字の取り扱い

今回は初心者向けの内容に回帰してみよう。コミュで質問があったので。

通常phpでは、echoやprint命令を使い、文字列や変数を表示するが、いくつかルールがある。


1、表示命令で通常の文字列を表示する場合

「表示したい文字列をダブルクォーテーション"で囲む」

echo "通常の文字の表示";
(☆shift-JISの文字コードの場合は「表示」の部分が文字化けするので、エスケープする必要あり)

○エスケープの方法1
echo "通常の文字の表\示";
(☆文字化け対象の文字のすぐ後ろに\(¥マーク半角)を足してやる)

○エスケープの方法2
echo addslashes("通常の文字の表示");
(☆文字化け対象の文字を自動的に認識して自動的に\を挿入してくれる)


2、表示命令で変数を表示する場合

この場合は"は必要ない。

$disp_message = "表示したい文字";
echo $disp_message;


3、通常の文章の途中で変数も表示したい場合

.「ピリオド」で分岐点を結合する

$disp_message = "そんなのネェ!";
$disp_lastmessage = "へい!";
$disp_lastmessage2 = "おっぱっぴー";

echo "表示したい文字".$disp_message."こともネェ!".$disp_lastmessage.$disp_lastmessage2;


4、配列を表示する場合

通常の変数と扱いは同じ。

$array["test"] = "天国への会談";

echo $array["test"];


5、HTMLリンクをechoで表示するサンプル

キーワード別でカウント数を集計する、、、構造が無理かw


echo ".$FormData["words"]."(" . $FormData["counts"] . "ポイント)
";


まぁリンク表示はこれでOKのはず。
HTMLの記述はソースを見てね。

キーワード別にカウントアップを行いたいのであれば、キーワードを埋め込むためのアクションが必要。
今回はwords=変数 になっているので、この変数が特定される必要がある。
検索エンジンの検索ワードのカウントなどは、input formなどで入力されたものがpostで渡されたりするので、その渡されたキーワードのカウント数を読み込み、増加させ、表示する事で実現される。

はい、ややこしーややこしー

2007/09/11

データベースのプライマリーキー

たとえばフォルダという概念のデータベースがある場合、フォルダにはさまざまなデータベースがぶら下がる事ができる事は簡単にわかると思う。

そこで主キーをIDなどを利用して、フォルダデータベースで利用されているIDは登録できなくするなんてこともするが、私の場合は常にプライマリーキー=autoincrementなもんで、競合するIDが続々出現しているわけだ。

この理論に対抗するためには、各データベースの登録予想最大数を決めておき、十分なスペースをあけて、autoincrementの開始値を重複しないように工夫する。

なんてことも今だけの回避策なので、隙間なくautoincrement番号でフォルダデータベースという、区分を使いこなしたい場合は、フォルダキーテーブルを作る。

フォルダにぶら下がる可能性のある輩たちはこのフォルダキーテーブルを通して、autoincrement番号を配布していただくわけだ。

はっきりいってこれを今使ってみたりしたが、かなりめんどくさい。

フォルダのように矛盾の生じないテーブルに対して行う分にはある程度の慣用度があるように、私個人的には感じるが、共用したいが関連性の薄いテーブルの組み合わせの場合は、なんとなく作る事がおっくうになってしまう。



その他にこのような共用利用される可能性の高いテーブルでいくと、利用する画像を登録しているテーブル。

商品や伝票やメッセージから参照される可能性があり、番号が重複するわけにはいかないが、ほぼ同じ構造の追加テーブルを各地に作るか、共用するしか管理方法が難しい。

ページ間引数(クエリにマルチバイトの場合)

特にheader(location)とかのアドレスの後方に?name=エチ! とかつけるなら、

エッチ!



$value = urlencode("エチ!");

とかしてからつけなさい。
IEとまるから。

2007/09/10

mysqlテーブル INDEXの有用性とexplain

データベース構造の設計が甘い筆者は、1クエリ1.5秒もかかるようなクエリを完成させたのだが、
そのクエリをexplainし、そのまま参照しているカラムにPrimaryKey(他のクエリから別参照が起こらないのであればだが)や、INDEXを設定することで、なんと0.3秒にまで速度を改善することができた。

10000件のデータで1.5秒が0.3秒になったということは、50000件まで乗っても大丈夫!!稲葉物置!みたいな状況に陥った。

みんなもexplainしてeq_refを愛して病まないテーブル設計をしようぜ!

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に書き換えるとか。

たこ焼きくいてぇ。