2016/04/29

あいわな6



終わらないマイクテストw
右下側からの突破は不可能そうだったので、他の抜け道を探してみたら…。

2009/04/21

htmlテンプレート置換表示時の特性

コメントアウトした部分を対象に置換命令などを行っていると、
思わぬ所で通常起こりえないバグが発生するw

例えばトップページからリンク先に行き、トップページに戻った時だけ、
テーブルタイトルが増殖したり、そんな根拠ははっきりしてるが、
同じページに対して同じ処理をしているはずなのに!

という、厄介な事が起きる場合がある。

無駄な処理はちゃんと消しておきましょう。

php-textareaの特性

※textareaからマルチラインで渡される引数はhiddenフォームに埋め込むと持ち運びできない。
確認画面で一度表示するのであれば、潔く一度確認画面の時点で何かに記録するしかない。

環境依存かもしれないが、\r\nを
に置換しようが何をしようが、入らないものは入らない。
[]や【】が含まれている場合だけかもしれないが、hiddenに入らないことがある。

2009/04/15

htmlテンプレートやdbのカラム名の重要性

今までは、手書きでちまちまと、置換対象の文字列を、php側とhtml側、db側の要素名をそれぞれある程度、適当につけてきたので、そりゃーもう面倒な毎日だったが、

頭の中をよく整理してみれば、ルールをいくつか決めるだけで、
いろーんな事が手軽になる。


たとえば、htmlテンプレート上の置換は、
$arg$
みたいな感じだが、
特にinputフォームの要素には、
$input_arg$
みたいにしておくと、同じ画面で登録済みのデータも列記する場合に
$arg$と書いてて同じ変数名なので同時に消えましたみたいな事を回避できる。
ので、
$list_arg$としておくと便利。
さらに、意味を含ませていけば、セレクトボックスなんかはもちろん
$select_arg$にしておくとよい。
また、マスターテーブルから取得するような値は、格カラム名にselectを意味するものをつけておくとよい。
$list_real_arg$とか$list_select_arg$とか。

そうやっとけば、mysql_field_nameなどでカラム名がある間ループさせ、
$arg = mysql_field_name($i);
$_SERVER["INPUT"]["input_".$arg] = $tmp[$arg];
$i++;
終わったら、テンプレートファイルをfile_dataとして、置換関数を用意しておき、
array_walk($file_data,'input_replace');
とかで対応できるだろ?

イチイチ$_SERVER["INPUT"]["INPUT_M_ADMIN_name"] = とか書くのは卒業したかったんだ、ほんと。
人の皮向けました。

htmlテンプレート置換処理時間の検証

fileでテンプレートのhtmlを取得し、埋め込まれた変数を置換する場合、array_searchでとか書かれた部分の位置を取得し、forでfileで取得したテンプレートの該当部分だけを置換するのは良いとして、array_walkで、arrayに対して$_SERVER["arg"]とかで総当り置換をかける場合と、fileで取得したarrayを通常の変数に.=してしまってから、str_replaceやpreg_replaceした方が早いか気になっていたので検証してみた。

やることはそのまんまで、置換要素をfor1~1000で用意して、array_walkする場合と、fileを通常変数化してからforの中でstr_replaceしてみると、

array_walkのが早かった。
step数はかなり多いのになぁ。

厳密にはfileじゃなくてfopenとかfile_get_contentsでやってみたが、array_walkに負けた。

テンプレート配列への1000個の要素置換で0.18秒 と0.14秒ぐらいの差。

よほど他の処理が重くなければ、テンプレート置換処理自体はさほどの処理影響を与えないともいえる。
というか1000個も要素あっても画面的にみにくくてしょうがないので、現実的にはもっと置換要素は少ないはずでしょぅ。

うまー。

2008/12/09

dllっぽいphpの使い方?

久々にまじめにプログラムを書いていたら、なんとなく形が出来た。

基本的な表示するデータは全て$_SESSIONに持つ形を取る。
例えばHTML上のとかがあれば、$_SESSION["INPUT"]["name"]といった形で保持する。

さらに、必須入力の項目とかで警告を返したいメッセージとかは$_SESSION["REPORT"]["name"]といった形で保持してみる。

すると、.phpファイルに寄らず、sessionで変数が保持されるので、破棄するタイミングをみすると色々面倒だし、アクセス範囲がグローバルだからいけないんだぞ?見たいな指摘をされそうだが、

human_regist.phpで登録フォームを表示し、human_regist_process.phpで処理(入力内容の検査)をし、結果を先の$_SESSIONに持つ。

エラーがなければ、human_regist_confirm.phpで入力内容を表示し、確認ボタンを押すと、human_regist_process.phpでさらに実際の登録処理を行い、エラーがなければ、human_regist_result.phpに移動するといった形の処理が出来た。

エラー時は呼び出し元のphpにheaderで移動し、置換対象のREPORTにwarningを表示する。

正常に進んだ後は、処理プログラムはブラウザの戻るとかで評価されないので、多重登録などの対策にいいかどうかはしらん。

ともかく、なんか表示用のプログラムと処理用のプログラムに明確に分かれた気がして気分が良い。
ご理解ご協力ありがとう御座いました。

2008/05/26

レコードの更新登録のミソ

通常、新規登録からコーディングして行くので、当然あとで更新処理を分岐を用いて盛り込んでいくのだが、これが結構めんどくさい。

もし更新フラグが存在すれば、登録処理をすっ飛ばして更新処理へ分岐なんて事をするのだが、このような場合にもうひとつ分離しきれないと勝手に決定してみたのがファイル実体をアップロードした場合の処理。(実際は可能であるので誤解を頑張って生む事にする)

updateという文法を忘却のかなたへ捨てて、insertの後は、さらにinsertして、いらないものをdeleteしちゃえば良い。

これに関しては多くのレコードが動く場合にはオススメできないが、上記のような状況ではすまーとになる。

なぜなら、更新時もそのままinsert処理を終え、その後にはじめて更新フラグがあるならば、更新フラグの示すレコードを削除するという、まっすぐ流れる処理だからだ。

経験者なら当然こんな処理もした身に覚えがあるだろう?

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プロシージャを実行した元に返す戻り値を持つ事ができる。
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

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