2005年09月01日

POSTされたデータをセッションに取っておく

情報入力画面からデータを入力する画面では、JavaScriptで入力チェックを行う。
クライアント側でのチェックはそれでよいが、サーバ側でもういちど最初の入力画面に差し戻したい場合には、最初に入力されたデータを取っておく必要がある。単純に考えれば、

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
** (1)入力スクリプト **

$familyname = '';
if($_SESSION['input_familyname']){
$familyname = $_SESSION['input_familyname']
}
このページの初期値として$familynameを設定する。

** (2)データベースへの登録画面 **

$_SESSION['input_familyname'] = $familyname;

** (3)登録完了画面 **

unset($_SESSION['input_familyname']);

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
という流れになる。ところが、入力画面では何十項目も入れる場合があるので、その数ぶん、えんえんとこの表記が続くことになる。書くのも面倒だ。
それで、ちょっとこんなのを作ってみた。

いつでもこれだけ書けばよいので、便利?かな。

=============================================
** (1)入力スクリプト **

//セッションから取り出す。(失敗した時用。)
$ses_header = 'autoreg_';
$ses_headlen = strlen($ses_header);
if(isset($_SESSION[$ses_header.'familyname'])){
foreach($_SESSION as $SESSION_name => $SESSION_value) {
if( !strcmp( substr($SESSION_name,0,$ses_headlen), $ses_header) ){
$tmp_name =
substr($SESSION_name, $ses_headlen, strlen($SESSION_name)-$ses_headlen);
$$tmp_name = $SESSION_value;
}
}
}

** (2)データベースへの登録画面 **

//データをセッションに取っておく。
$ses_header = 'autoreg_';
foreach($_POST as $POST_name => $POST_value) {
$tmp_name = $ses_header.$POST_name;
$_SESSION[$tmp_name] = $POST_value;
}

** (3)登録完了画面 **

//sessionを削除!
$ses_header = 'autoreg_';
$ses_headlen = strlen($ses_header);
foreach($_SESSION as $SESSION_name => $SESSION_value) {
if(substr($SESSION_name,0,$ses_headlen) == $ses_header){
unset($_SESSION[$SESSION_name]);
}
}


=============================================

posted by SDozono at 12:49| Comment(0) | TrackBack(0) | PHP | このブログの読者になる | 更新情報をチェックする

phpMyEdit

phpMyEditを、MYSQLのテーブルエディターとして利用している。
今回のテーマは、「一部のフィールドを自動計算したい」をどう実現するかだ。

ひとつのフィールドには、「単価フィールド*消費税(切り上げor切捨て)」が入ることになっている。PHP的に書けば、

(KIRIAGE == TRUE) ? TANKA + ceil (TANKA * 0.05) : TANKA + floor (TANKA * 0.05);
といった感じになるだろうか。

自分で暗算して手入力するのは野暮ったいので、phpMyEditを使用しつつ、かつ自動計算してフィールドに登録するにはどうすればいいのだろう?

と、ここでマニュアルを読むと、$opts['triggers']を使えばいけそうなことに気が付いた。
この部分だけを、別なphpファイル(例:keisan.php)として切り出し、

$opts['triggers']['insert']['after'] = 'keisan.php';
$opts['triggers']['update']['after'] = 'keisan.php';

として指定してやると、phpMyEditで変更すると、自動的に合計フィールドも計算してくれるようになるのだ。もちろん、合計フィールドはR属性(ReadOnly)にしておく。

う〜ん。phpMyEdit秀悦。
posted by SDozono at 08:47| Comment(0) | TrackBack(0) | PHP | このブログの読者になる | 更新情報をチェックする

2005年08月08日

海外PHPスクリプトを、日本語環境で使用する!

簡単なmb_magic.phpスクリプトを書いてみました。
使い方はソース自体にも書いてありますが、

1) スクリプト中のmysql_queryをすべて、"mb_mysql_query"に書き換える。(ほかも同様。)
  何も考えずに、エディタの一括置換コマンドなどを使って置換してください。
  これがいちばん手っ取り早い方法かと。PHPは関数の再定義ができないので。

  洗練されたPHPスクリプトなら、各関数あたり、1カ所だけ編集すればよいこともあります。

2) サーバとクライアントの文字コードを設定する。
  デフォルトでは、クライアントがWindows、サーバがEUC-JPという設定になっています。
3) 各スクリプトの最初で、このファイルをRequire_onceする。

そうすると、データベースにアクセスする時点で、勝手にコードを変換してくれます。
とりあえずこれで、phpMyEditやら、phpCodegenieやら、その他の海外スクリプトも動いています。

// ================================================
// mb_magic.php Ver 1.0 // 2005-06-23
// You can set the codes of Scripts and Database.
// (C) 2005 S.Dozono
// ================================================
//
// usage:
// 1) include this script in your project.
// 2) change
// mysql_query() -> mb_mysql_query()
// mysql_db_query() -> mb_mysql_db_query()
// mysql_fetch_array() -> mb_mysql_fetch_array()
// mysql_fetch_row() -> mb_fetch_row()
// mysql_result() -> mb_mysql_result()
//
// 【スクリプトとデータベースの文字コードを指定できるようになります。】
// (1) このスクリプトをインクルードする。
// (2) mysql_query関数の頭に、mb_を追加する。
// (3) mysql_fetch_array関数の頭にmb_を追加。
// (4) mysql_fetch_row, mysql_fetch_assocなども同じように。
// (5) これで指定コードでの運用ができるようになるはずです。
// (6) スクリプトの英和翻訳まではしてくれません。(^_^)ご自分で!
// ……GPLで公開します。

define("DB_CODE","EUCJP-win"); //データベースの文字コード
define("SCRIPT_CODE","SJIS-win"); //スクリプトのコード
define("DB_FIRST_SETTING","SET NAMES UJIS"); //MYSQLの文字コードを設定(MYSQL 4.1以降用)

function mb_conv2DB($text)
{
return mb_convert_encoding($text, DB_CODE, SCRIPT_CODE);
}

function mb_conv2SCRIPT($text)
{
return mb_convert_encoding($text, SCRIPT_CODE, DB_CODE);
}

/* Writing to DB */

function mb_mysql_query($query, $resource='')
{
$tmp_query = DB_FIRST_SETTING;

if($resource != ''){
mysql_query($tmp_query, $resource);
} else {
mysql_query($tmp_query);
}

$qry = mb_conv2DB($query);

if($resource != ''){
$ret = mysql_query($qry, $resource);
} else {
$ret = mysql_query($qry);
}
return $ret;
}

function mb_mysql_db_query($database, $query, $resource)
{
$tmp_query = DB_FIRST_SETTING;
mysql_db_query($database, $tmp_query, $resource);

$qry = mb_conv2DB($query);
$ret = mysql_db_query($database, $qry, $resource);
return $ret;
}

/* Reading from DB */

function mb_mysql_result($result, $row, $field='')
{
if($field != ''){
$mixed = mysql_result($result, $row, $field);
} else {
$mixed = mysql_result($result, $row);
}
$ret = mb_conv2SCRIPT($mixed);
return $ret;
}

function mb_mysql_fetch_array($result, $result_type)
{
$row = mysql_fetch_array($result, $result_type);
if(!is_array($row)){
return $row;
}
while(list ($key, $val) = each($row)) {
$row[$key] = mb_conv2SCRIPT($val);
}
return $row;
}

function mb_mysql_fetch_assoc($result)
{
$row = mysql_fetch_assoc($result);
if(!is_array($row)){
return $row;
}
while(list ($key, $val) = each($row)) {
$row[$key] = mb_conv2SCRIPT($val);
}
return $row;
}

function mb_mysql_fetch_row($result)
{
$row = mysql_fetch_row($result);
if(!is_array($row)){
return $row;
}
while(list ($key, $val) = each($row)) {
$row[$key] = mb_conv2SCRIPT($val);
}
return $row;
}

posted by SDozono at 11:54| Comment(0) | TrackBack(2) | PHP | このブログの読者になる | 更新情報をチェックする

2005年07月30日

Zend Optimizerをめぐる実験

Fedora Core 4 + PHP 5.0.4 + (クライアント:Windows IE 6.0)という環境に、Zend Optimizer 2.5.10 を入れた。
すると、PHPのスクリプトが動かなくなったので調査開始。

すると、
header ("location: XXX.php ");
が動かなくなっていることが判明。絶対URLで指定しないといけなくなってしまった。

例えば、
header ("location: http://www.example.com/XXX.php");
などとしないといけない。
この辺のことを詳しくは、PHPのマニュアルを参照してください。

仕様として、絶対URLを指定したほうがよいとマニュアルにも書いてあるのだが、人の書いた部分まで直すのはちょっと面倒……などの理由でその他の解決方法がないか探した。
結局、Zend Optimizer 2.5.7 を入れ直したところ、相対URLでも動くようになった。
とりあえず、これで解決したことにしている。
しかし、2.5.10以降は相対URLではだめなのだろうか……。

ちなみに、解決方法も先のURLに書いてあって、


header("Location: http://".$_SERVER['HTTP_HOST']
.dirname($_SERVER['PHP_SELF'])
."/".$relative_url);

と書けば、絶対URLを作ってくれる。

だから、

function my_header($relative_url)
{

}
みたいなラッパーを作ってしまえば、変更はそんなに難しくはない。

ここでふと思った素朴な疑問が、ひとつ上のフォルダを指定している
header ("location: ../XXX.php");

みたいなものはどうなるのか?ということ。
結論からいうと、上記の解決方法で問題なく動きます。

ちなみに、ブラウザの指定でも、

http://www.example.com/oya/../kodomo.php

のような指定がデキルンデスネ。知らなかった。こうするとどこに飛んでしまうでしょう?
どうぞ実験してみてください。

posted by SDozono at 11:59| Comment(0) | TrackBack(0) | PHP | このブログの読者になる | 更新情報をチェックする
WebとCTI、VoIP技術の高みを目指して - 技術者の24時間
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。