遅すぎるけど、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)