遅すぎるけど、Mにトライ
2017年6月13日7:00 公開
モデル?それ何?美味しい?(な感)
ずっと、モデル使っていなかったですが。
いや、正確には、とある処理以外は使っていなかったんですが。
少し前に、DB読み込み系と、一般向け書き込み部分は、モデルを使用するように変更しました。
何故に今更感大なんですがねー。
いえ、これ全て、己の無知、及び怠惰さ故にございまする。
何も分かってない状態で、開発(というよりCodeIgniterを使用した改装作業)にGOしちゃいましたからね、私。
とにかく可能な限り、改装終えたいという気持ちが強かった。
うーん、駄目駄目ですね。
という反省はさておき。
問題のモデルです。
何故に当初、モデル使うのを止めたかというと、DB設定時のパラメーターについて特に考えず&調べずコーディングしていたから、に尽きます。
本当にね、少し根気出して調べていれば分かっただろうに、という気持ちと、いやいやあの頃は本当今に比べれば適当かつ勘でやっていたから、結局時間ばっかりかかって大変だったかも、という気もします。
少なくとも、先日の手直しでは週末で充分テストまで行けましたからね。
やっぱり学習コストが少ないと言われている
CodeIgniter
だって、事前にある程度の知識は必要、というか、どんな癖があるのかとか調べておくのは必要かもと痛感しました。
ま、でも、こんな風に思うのも、ある程度理解、というより正確には調べ方や理解の仕方を身につけた後でしか、ないのかもしれませんが。
本当は機能毎にモデル作ると良いんじゃない?と思って始めたんだけど、終わってみれば、ごくごく単純なDBを扱うコアな部分だけを入れたモデルとなりました。
汎用モデル
// 汎用モデル
class Handling_db_model extends CI_Model {
public function __construct()
{
// db設定の切替は、db_chk_by_db_name メソッドで実行する
}
//database SET
private function db_chk_by_db_name($db_name='') {
if (!empty($db_name)) {
$db_name = $db_name;
$control_db = $this->load->database($db_name, true, true);
return $control_db;
} else {
return false;
}
}
//複数DB、複数テーブルに対する処理
public function get_pan_switch_data_pl($db_name='', $where=array(), $get_fields=array(), $table_name=array()) {
$chk_where = $chk_get_fields = $chk_table_name = array();
$out=array();
if (empty($db_name) || empty($where) || empty($get_fields) || empty($table_name)) {return false;}
if (!is_array($db_name) && is_array($where) && is_array($get_fields) && is_array($table_name)) {
if (count($where)===count($get_fields) && count($where)===count($table_name)) {
$chk_db_name = $db_name;
$chk_where = $where;
$chk_get_fields = $get_fields;
$chk_table_name = $table_name;
} else {
return false;
}
} elseif(is_array($db_name) && !is_array($where) && !is_array($get_fields) && !is_array($table_name)) {
$chk_db_name = $db_name[0];
$chk_where[0] = $where;
$chk_get_fields[0] = $get_fields;
$chk_table_name[0] = $table_name;
} else {
return false;
}
$cnt = -1;
$handling_db = $this->db_chk_by_db_name($chk_db_name);
if (empty($handling_db)) {return false;}
for ($d=0; $d < count($chk_db_name); $d++) {
$where_str = !empty($chk_where[$d]) ? $chk_where[$d] : '';
$get_col = !empty($chk_get_fields[$d]) ? $chk_get_fields[$d] : '*';
$chk_table = $chk_table_name[$d];
$sql_Criteria = "SELECT " . $get_col . " FROM `" . $chk_table . '` ' . $where_str;
$query = $handling_db->query($sql_Criteria);
if ($query->num_rows() > 0) {
foreach ($query->result_array() as $row) {
$cnt++;
$fcnt = -1;
foreach ($row as $key => $val) {
$fcnt++;
$out[$cnt][$fcnt] = $val;
$out[$cnt][$key] = $val;
}
}
}
}
$handling_db->close();
return !empty($out) ? $out : false;
}
public function check_table_and_db($db_name='', $table_name='') {
if (!file_exists($db_name)) {return false;}
if (empty($table_name)) {return false;}
$sql_Criteria = 'SELECT name from sqlite_master WHERE type="table" AND name="' . $table_name . '"';
$tmpg = $this->execute_raw_sql_switch_data($db_name, $sql_Criteria);
return (isset($tmpg[0][0]) && !empty($tmpg[0][0])) ? true : false;
}
public function execute_raw_sql_switch_data($db_name='', $sql_str='') {
if (empty($db_name) || empty($sql_str)) {return false;}
$handling_db = $this->db_chk_by_db_name($db_name);
if (empty($handling_db)) {return false;}
$sql_Criteria = $sql_str;
$out = array();
$cnt = -1;
$query = $handling_db->query($sql_Criteria);
if ($query->num_rows() > 0) {
foreach ($query->result_array() as $row) {
$cnt++;
$fcnt = -1;
foreach ($row as $key => $val) {
$fcnt++;
$out[$cnt][$fcnt] = $val;
$out[$cnt][$key] = $val;
}
}
}
$handling_db->close();
return !empty($out) ? $out : false;
}
//任意のDB、テーブルに対する処理
public function get_pan_switch_data($db_name='', $where='', $get_fields='', $table_name='') {
if (empty($db_name)) {return false;}
if (empty($table_name)) {return false;}
$handling_db = $this->db_chk_by_db_name($db_name);
if (empty($handling_db)) {return false;}
$where_str = !empty($where) ? $where : '';
$get_col = !empty($get_fields) ? $get_fields : '*';
$chk_table = $table_name;
$out = array();
$cnt = -1;
$sql_Criteria = "SELECT " . $get_col . " FROM `" . $chk_table . '` ' . $where_str;
$query = $handling_db->query($sql_Criteria);
if ($query->num_rows() > 0) {
foreach ($query->result_array() as $row) {
$cnt++;
$fcnt = -1;
foreach ($row as $key => $val) {
$fcnt++;
$out[$cnt][$fcnt] = $val;
$out[$cnt][$key] = $val;
}
}
}
$handling_db->close();
return !empty($out) ? $out : false;
}
// 以下、更新系
//任意のDB、テーブルに対する処理
public function set_pan_switch_data($db_name='', $table_name=array(), $set_keys=array(), $set_vals=array(), $wheres=array()) {
if (empty($db_name)) {return false;}
if (empty($table_name)) {return false;}
$set_proc = $set_table = $set_where = $set_data = array();
$set_cnt = -1;
if (count($wheres) > 0) {
for ($c=0; $c < count($wheres); $c++) {
// データが存在する場合は update
$chk_where = $wheres[$c];
$chk_table = $table_name[$c];
if (empty($chk_where)) {
$set_cnt++;
$set_proc[$set_cnt] = 'INSERT';
$set_table[$set_cnt] = $chk_table;
$set_where[$set_cnt] = '';
$set_data[$set_cnt] = $set_vals[$c];
} else {
$chk_fields = '*';
$tmpg = $this->get_pan_switch_data($db_name, $chk_where, $chk_fields, $chk_table);
if (!empty($tmpg) && isset($tmpg[0][0])) {
if (empty($set_keys[$c]) && empty($set_vals[$c])) {
//$chk_proc[$c] = 'DELETE';// 処理対象外
} else {
$set_cnt++;
$set_proc[$set_cnt] = 'UPDATE';
$set_table[$set_cnt] = $chk_table;
$set_where[$set_cnt] = $chk_where;
$set_data[$set_cnt] = $set_vals[$c];
}
} else {
$set_cnt++;
$set_proc[$set_cnt] = 'INSERT';
$set_table[$set_cnt] = $chk_table;
$set_where[$set_cnt] = '';
$set_data[$set_cnt] = $set_vals[$c];
}
}
}
} else {
for ($c=0; $c < count($table_name); $c++) {
$set_cnt++;
$set_proc[$set_cnt] = 'INSERT';
$set_table[$set_cnt] = $table_name[$c];
$set_where[$set_cnt] = '';
$set_data[$set_cnt] = $set_vals[$c];
}
}
if (count($set_proc) < 1) {
$error_message = 'error --> sql処理設定';
$this->db_handling_err($error_message, true);
return true;
}
$handling_db = $this->db_chk_by_db_name($db_name);
if (empty($handling_db)) {
$error_message = 'error --> database 設定取得';
$this->db_handling_err($error_message, true);
return true;
}
$handling_db->trans_begin();
$data_exchange_cnt = -1;
for ($d=0; $d < count($set_proc); $d++) {
$data = array();
$data = $set_data[$d];
if (empty($data)) {continue;}
if ($set_proc[$d]==='INSERT') {
$handling_db->set($data);
$handling_db->insert($set_table[$d]);
$data_exchange_cnt++;
} elseif($set_proc[$d]==='UPDATE') {
$where_str = str_replace('WHERE', '', $set_where[$d]);
$where_str = str_replace('where', '', $where_str);
if (empty($set_where)) {continue;}
$handling_db->where($where_str);
$handling_db->set($data);
$handling_db->update($set_table[$d]);
$data_exchange_cnt++;
} else {
continue;
}
}
if ($handling_db->trans_status() === FALSE) {
$handling_db->trans_rollback();
$error_message = 'error --> rollback ';
$this->db_handling_err($error_message, true);
return true;
} else {
$handling_db->trans_commit();
$error_message = 'end --> sql count : ' . $data_exchange_cnt;
$this->db_handling_err($error_message, false);
return false;
}
}
private function db_handling_err($error_message='', $error_on=true) {
$debug_write_on = false;
if (!empty($_SESSION['deb_on'])) {$debug_write_on = true;}
if ($debug_write_on) {
if ($error_on) {
echo 'データ更新エラー';
echo '<br>';
echo 'app';
echo '<br>';
echo $error_message;
exit;
} else {
// 正常時デバッグ用
}
} else {
return $error_on;
}
}
}
やっぱり処理によってDB、テーブル操作は全く異なるので、その辺りはlibraryじゃないかな、というパターンです。
で、それぞれの処理向けに作っていたlibrary内でDBに関する処理をしている所を、従来のDB(私の場合、SQLite)アクセス用のlibraryと今回作成のモデルのどちらを呼び出すか切り替えるように変更。
したは良いけれど。
うーん、ちょっと失敗したかな?
寧ろ、DBアクセス用libraryの中で切り替えるようにすべきだったかも。
そうすれば、変更箇所はすっごく少なくて済むものね。
……元々、生SQL渡しているし。
パス渡しているところは何とかしなきゃだけど、そこもdatabase設定のところ弄れば何とかなる。
でもねー。
アクティブレコード使いたかったんだな。
ということで取り敢えずは良いか、な感じに自分を収めてみた。
……ただ、更新用のプログラム(閲覧には関係ないから、レンタルサーバーには置いてない、というか動かないようにしている)については、まだちょっとモデル使うパターンは上手く動いていないっぽい。
かなり無茶してるからね。
うーん、ということで現状微妙な感じ。(いや、このモデルプログラム自体はこのままで良いと思うけど)
メニューページ
メインコンテンツ
タグ別
公開日別
Popular Entries
Recent Comments
Information
Recent Update
Preview
Information(Board)