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

うちの型落ちMacもぽちぽちとアップデートかけていたりする訳ですが。最近ちょっと多くないですかー?Big Surさん?ちょっと勘弁して欲しいんですけど!確かに明らかにクライアントとして使用すべきMac
Read more
当初は常識的に?レンタルサーバー上でクーロン実行考えていたですが。良く良く考えてみれば。私が今クーロンで実行させたいと思っているスクリプトは、レンタルサーバーで実行する必要全然ない、んですよねー。要は
Read more
php7.2 へのバージョンアップが予定通り、レンタルサーバーさんでされました。一応、事前にドキュメント読んだりはしたつもりだったですが。出ました。思いっ切り出ましたね!エラー。しかも、ちょっと恥ずか
Read more
全然気づいていなかったけれども。コンテンツサイトでjstreeが動かなくなっていたんですよね。ちょっと前にごちょごちょ弄くってはいたので、何かやらかしたか?!と思っていたのですが。(ほら、jsだから、
Read more
ちょっと都合に付き、MySQLをサイトで使うようにしようかなと思い立ちました。でもいきなりレンタルサーバー様でMySQL使うのはリスキー。取り敢えず、検証環境で使えるように、とうことで、やはりNASで
Read more

Recent Comments

Information

緊急連絡は現在ありません。

Recent Update

さて。改装しておよそ1か月経過しました。といっても、見かけは変えてないつもりなのでわからないでしょーが。今回の改装ポイントは、前は完全関数型使用でした、が、今回は可能な限りクラス使用しています。うん、
Read more
DjangoでのエラーをADMINSにメール送信出来る環境を整え。なかなか良い感じにバグフィックス出来るようになってきたな~Sentryお役御免か?なんて良い気になってましたよ、ハイ。すいません、私で
Read more
うちの型落ちMacもぽちぽちとアップデートかけていたりする訳ですが。最近ちょっと多くないですかー?Big Surさん?ちょっと勘弁して欲しいんですけど!確かに明らかにクライアントとして使用すべきMac
Read more
PythonとDjangoアップデートであります。早いですよ、やっぱり!(Pythonも3.9。。。4はいつ頃なんだっけ?確かもうスケジュールされてたような。あれ、Djangoだけかな)Djangoで
Read more
サイト改装、というか、プログラム&フレームワーク切替から少々時間経過しました。(確か8月頭に処理した筈)思わぬエラーや自分的見落としやらミスによるエラー対応もほぼほぼ終了。終息したかなっと思ってます。
Read more

Preview

Information(Board)

サイト改装しました! といいつつ、表向きは全く変わらない(ように作った)筈です。 何かおかしいところがございましたら、ご連絡頂けると助かります。
Read more