助太刀会計CodeReading-新規作成画面までの流れ
今回は、nendo_joho()から追っていきます。
nendo_joho関数(sukedachikaikei/Kaikei/Menu.php内)
<?php function nendo_joho($user_id) { $obj_uknk = new UserKankyoCommonDataModule( $this->cust_id, $this->user_name); $obj_nendo = new NendoJohoCommonDataModule( $this->cust_id, $this->user_name); $obj_uknk->SetUserID($user_id); $obj_uknk->get_data("ksn"); if($obj_uknk->numrows() < 1){ $obj_uknk->num_val(1); $obj_uknk->update(); } $obj_nendo->SetKessanID($obj_uknk->num_val()); if($obj_nendo->open() and $obj_nendo->numrows() > 0) { $obj_nendo->get_data(0); $this->kessan_ki = $obj_nendo->kessan_ki(); } } ?>
この関数でしていることは、まずUserKankyoCommonDataModuleクラスの
コンストラクタを呼び出して生成したオブジェクトを変数$obj_uknkに
代入しています。
UserKankyoCommonDataModuleクラス(sukedachikaikei/Common/Dtm/DtmCUserKankyo.php内)
- このクラスはBaseCommonDataModuleクラスのサブクラスです。
- コンストラクタでは、$cust_id,$user_nameに値を入れ($cust_id=10,$user_name="oss")、
DBへの接続を試みていますが、失敗します。
生成されるオブジェクトは、
のようになります。
UserKankyoCommonDataModule Object
(
[user_id] =>
[category] =>
[cust_id] => 10
[user_name] => oss
[exec_ID] =>
[rows] =>
[read_id] =>
[seq_id] =>
[db_arr] => Array
(
)
)
NendoJohoCommonDataModuleクラス(sukedachikaikei/Common/Dtm/DtmCNendoJoho.php内)
- このクラスは-このクラスはBaseCommonDataModuleクラスのサブクラスです。
- コンストラクタでは、$cust_id,$user_nameに値を入れ($cust_id=10,$user_name="oss")、
DBへの接続を試みていますが、失敗します。
生成されるオブジェクトは、
のようになります。
NendoJohoCommonDataModule Object
(
[kessan_id] =>
[check_date] =>
[cust_id] => 10
[user_name] => oss
[exec_ID] =>
[rows] =>
[read_id] =>
[seq_id] =>
[db_arr] => Array
(
))
次に、$obj_uknkに、SetUserID()の結果を代入しています。
SetUserID関数(sukedachikaikei/Common/Dtm/DtmCLoginUser.php内)
<?php function SetUserID($id) { $this->user_id = $id; } ?>
ここで、引数で渡ってきている$idは、$user_idの値1なので、
UserKankyoCommonDataModuleオブジェクトは、
のようになります。
UserKankyoCommonDataModule Object
(
[user_id] => 1
[category] =>
[cust_id] => 10
[user_name] => oss
[exec_ID] =>
[rows] =>
[read_id] =>
[seq_id] =>
[db_arr] => Array
(
))
続いてget_data()に引数"ksn"を渡している箇所です。
この関数は、kigyo_joho()調査時に出現していたのですが、
条件式内の結果で調べなくても結果が分かっていたため、後回しにしていました。
get_data関数(sukedachikaikei/Common/Dtm/DtmCBase.php内)
<?php function get_data($row) { return $this->fetch_array($row); } ?>
ここで、引数$rowには、渡すときには、文字列"ksn"がはいっていますが、
get_data()で受け取るときには、0になります。
この0を引数として、fetch_array()を呼び出します。
fetch_array関数(sukedachikaikei/Common/Dtm/DtmCBase.php内)
<?php function fetch_array($row) { $this->db_arr = ""; if($this->exec_ID and $this->numrows() > $row) { $this->db_arr = pg_fetch_array($this->exec_ID, $row); } return is_array($this->db_arr); } ?>
ここで、exec_IDの値は、FALSE(初期値のまま)、numrows()は、以下のような処理を
しています。
numrows関数(sukedachikaikei/Common/Dtm/DtmCBase.php内)
<?php function numrows() { if($this->rows == "") { if($this->exec_ID) { $this->rows = pg_numrows($this->exec_ID); } else { $this->rows = -1; } } return $this->rows; } ?>
ここで、変数rowsは、空の文字列になるので、2行目の条件はtrueです。
3行目はexec_IDの値がFALSEのため、elseの処理がおこなわれます。
よって、rowsの値は"-1"が返ります。
fetch_array()では、exec_IDがFALSEの時点で偽となり、処理はおこなわれず、
is_array()の結果が返ります。
is_array()はphp組み込みの関数で、引数が配列かどうかチェックします。
ここで、db_arrはfetch_array()のはじめで""にされているので、FALSEが返ります。
と、考えていたのですが、get_data()の戻り値が$obj_uknkへ代入された後に
画面に表示してみると、
となっており、db_arrに値が入っています!?これはどこかで処理を間違えているようです。
UserKankyoCommonDataModule Object
(
[user_id] => 1
[category] => ksn
[cust_id] => 10
[user_name] => oss
[exec_ID] => Resource id #15
[rows] => 1
[read_id] =>
[seq_id] =>
[db_arr] => Array
(
[0] => 1
[usk_num_val] => 1
[1] =>
[usk_char_val] =>
)
)
usk_num_valがどこで呼ばれているのか知りたいので、全ソースに対してusk_num_valで
grepをかけてみます。すると、
内のGetSql(),UpdateSql(),num_val()の計3箇所で使われていることが分かりました。
DtmCUserKankyo.php
このうち、GetSql(),num_val()は以前に使ったことがあります。
というか、同名の関数があるということは??
今までみていたGetSql()は、sukedachikaikei/Common/Dtm/DtmCBase.php内のGetSql()で、
今回該当したGetSql()は/sukedachikaikei/Common/Dtm/DtmCUserKankyo.php内のGetSql()
です。
そしてDtmCUserKankyo.php内のUserKankyoCommonDataModuleクラスは、
DtmCBase.php内のBaseCommonDataModuleのサブクラス・・・。ということは、
メソッドがオーバーライドされているってことでしょうか!?
そうだと仮定してちょっと戻ってみます!!!