読者です 読者をやめる 読者になる 読者になる

助太刀会計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へ代入された後に
画面に表示してみると、


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] =>
)

)
となっており、db_arrに値が入っています!?これはどこかで処理を間違えているようです。
usk_num_valがどこで呼ばれているのか知りたいので、全ソースに対してusk_num_valで
grepをかけてみます。すると、

DtmCUserKankyo.php
内のGetSql(),UpdateSql(),num_val()の計3箇所で使われていることが分かりました。
このうち、GetSql(),num_val()は以前に使ったことがあります。
というか、同名の関数があるということは??
今までみていたGetSql()は、sukedachikaikei/Common/Dtm/DtmCBase.php内のGetSql()で、
今回該当したGetSql()は/sukedachikaikei/Common/Dtm/DtmCUserKankyo.php内のGetSql()
です。
そしてDtmCUserKankyo.php内のUserKankyoCommonDataModuleクラスは、
DtmCBase.php内のBaseCommonDataModuleのサブクラス・・・。ということは、
メソッドがオーバーライドされているってことでしょうか!?
そうだと仮定してちょっと戻ってみます!!!