<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        Thinkphp與Oracle之間的各種問題

        來源:懂視網 責編:小采 時間:2020-11-09 13:02:06
        文檔

        Thinkphp與Oracle之間的各種問題

        Thinkphp與Oracle之間的各種問題:Thinkphp對Oracle的支持簡直弱爆,只做到了基本的操作,就連事務都不支持。今天來手動改一改DbOracle.class.php,讓它稍微好用一些吧。 首先是insert。原來的insert應該沒有什么問題,但實際項目中更多的是需要在插入的時候遇到已存在的記錄則進行更新。于是
        推薦度:
        導讀Thinkphp與Oracle之間的各種問題:Thinkphp對Oracle的支持簡直弱爆,只做到了基本的操作,就連事務都不支持。今天來手動改一改DbOracle.class.php,讓它稍微好用一些吧。 首先是insert。原來的insert應該沒有什么問題,但實際項目中更多的是需要在插入的時候遇到已存在的記錄則進行更新。于是

        Thinkphp對Oracle的支持簡直弱爆,只做到了基本的操作,就連事務都不支持。今天來手動改一改DbOracle.class.php,讓它稍微好用一些吧。 首先是insert。原來的insert應該沒有什么問題,但實際項目中更多的是需要在插入的時候遇到已存在的記錄則進行更新。于是

        Thinkphp對Oracle的支持簡直弱爆,只做到了基本的操作,就連事務都不支持。今天來手動改一改DbOracle.class.php,讓它稍微好用一些吧。

        首先是insert。原來的insert應該沒有什么問題,但實際項目中更多的是需要在插入的時候遇到已存在的記錄則進行更新。于是,利用Oracle中的MERGE INTO來實現這一點。

        public function insert($data, $options = array(), $replace = false)
        {
         if (!$replace) {
         return parent::insert($data, $options, $replace);
         }
         $values = $fields = array();
         $this->model = $options['model'];
         $sql_merge = 'MERGE INTO ' . $this->parseTable($options['table']) .
         ' using (select 1 from dual) ' .
         ' ON (' . $this->parseValue($data[$options['marge_key']]) . ' is not null and ' . $this->parseValue($data[$options['marge_key']]) . ' = ' . $options['marge_key'] . ')';
         //insert
         foreach ($data as $key => $val) {
         //主鍵值為空時,不插入主鍵
         if ($this->parseKey($key) == $this->parseKey($options['marge_key'])
         && $val == null
         ) {
         } elseif (is_array($val) && 'exp' == $val[0]) {
         $fields[] = $this->parseKey($key);
         $values[] = $val[1];
         } elseif (is_scalar($val) || is_null(($val))) { // 過濾非標量數據
         $fields[] = $this->parseKey($key);
         if (C('DB_BIND_PARAM') && 0 !== strpos($val, ':')) {
         $name = md5($key);
         $values[] = ':' . $name;
         $this->bindParam($name, $val);
         } else {
         $values[] = $this->parseValue($val);
         }
         }
         }
         $sql_insert = 'INSERT (' . implode(',', $fields) . ') VALUES (' . implode(',', $values) . ')';
         //update
         if (isset($data[$this->parseKey($options['marge_key'])])
         || $data[$this->parseKey($options['marge_key'])] == null
         ) {
         unset($data[$this->parseKey($options['marge_key'])]);
         }
         $sql_update = 'UPDATE '
         . $this->parseSet($data)
         . $this->parseWhere(!empty($options['where']) ? $options['where'] : '')
         . $this->parseOrder(!empty($options['order']) ? $options['order'] : '')
         . $this->parseLimit(!empty($options['limit']) ? $options['limit'] : '');
         $sql = $sql_merge . ' WHEN MATCHED THEN ' . $sql_update . ' WHEN NOT MATCHED THEN ' . $sql_insert;
         return $this->execute($sql, $this->parseBind(!empty($options['bind']) ? $options['bind'] : array()));
        }
        

        不支持事務是Thinkphp連接Oracle時的另一個問題,框架作者似乎已經做過適配,但是應該是沒有測試,留下一堆bug。DbOracle.class.php中已經有了startTrans,commit,rollback等,稍作修改即可。

        Thinkphp對數據庫的所有操作最終都是匯集到query或execute上來執行,但這兩個函數里放了一句$this->mode = OCI_COMMIT_ON_SUCCESS;活生生的把事務扼殺了,所以,這里先把兩個函數里的這句注釋掉。

        然后,驚人得發現execute()中調用oci_execute時根本沒有傳入mode!前面辛辛苦苦改mode又是何苦,果斷加上oci_execute($stmt, $this->mode)。

        接下來才是讓事務生效的重頭戲。在事務的幾個開關函數中加入對mode的修改,在startTrans()中,將mode設為OCI_DEFAULT,commit和rollback中將將mode設為改回OCI_COMMIT_ON_SUCCESS。這三個函數大概就是這樣子的:

        /**
         * 啟動事務
         * @access public
         * @return void
         */
         public function startTrans() {
         $this->initConnect(true);
         if ( !$this->_linkID ) return false;
         //數據rollback 支持
         if ($this->transTimes == 0) {
         $this->mode = OCI_DEFAULT;
         }
         $this->transTimes++;
         return ;
        }
        /**
         * 用于非自動提交狀態下面的查詢提交
         * @access public
         * @return boolen
         */
        public function commit(){
         if ($this->transTimes > 0) {
         $result = oci_commit($this->_linkID);
         if(!$result){
         $this->error();
         return false;
         }
         $this->mode = OCI_COMMIT_ON_SUCCESS;//陳宣亦 2014.11.09 14:07
         $this->transTimes = 0;
         }
         return true;
        }
        /**
         * 事務回滾
         * @access public
         * @return boolen
         */
         public function rollback(){
         if ($this->transTimes > 0) {
         $result = oci_rollback($this->_linkID);
         if(!$result){
         $this->error();
         return false;
         }
         $this->mode = OCI_COMMIT_ON_SUCCESS;//陳宣亦 2014.11.09 14:07
         $this->transTimes = 0;
         }
         return true;
        }
        

        還有一個頭疼的問題就是日期類型轉換,我還在尋找一種便捷的方法來解決這個問題。以后再補充上來吧。

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        Thinkphp與Oracle之間的各種問題

        Thinkphp與Oracle之間的各種問題:Thinkphp對Oracle的支持簡直弱爆,只做到了基本的操作,就連事務都不支持。今天來手動改一改DbOracle.class.php,讓它稍微好用一些吧。 首先是insert。原來的insert應該沒有什么問題,但實際項目中更多的是需要在插入的時候遇到已存在的記錄則進行更新。于是
        推薦度:
        標簽: php 的所有 問題
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 国产99久久久国产精免费| 亚洲日韩国产AV无码无码精品| 深夜福利在线视频免费| 日本中文一区二区三区亚洲| 无套内射无矿码免费看黄| 国产一级淫片a免费播放口之 | 亚洲成Av人片乱码色午夜| 中国一级特黄高清免费的大片中国一级黄色片| 四虎国产精品免费视| 一区二区三区精品高清视频免费在线播放 | 日本红怡院亚洲红怡院最新| a毛片免费观看完整| 国产V亚洲V天堂A无码| 三年片在线观看免费观看大全一| 91亚洲国产在人线播放午夜| 日本最新免费网站| 亚洲日本va在线观看| 国产精品国产自线拍免费软件| 美女黄色免费网站| 亚洲人成网站在线播放vr| 99热在线免费播放| 最新亚洲精品国偷自产在线 | 国产亚洲美女精品久久久| a在线免费观看视频| 亚洲韩国在线一卡二卡| 成人免费福利电影| AAAAA级少妇高潮大片免费看| 亚洲免费视频网站| 在线观看免费宅男视频| jizz免费观看视频| 亚洲综合视频在线观看| 又大又黄又粗又爽的免费视频| 中文在线观看免费网站| 亚洲乱码一区av春药高潮| 四虎影院永久免费观看| 免费国产在线视频| 天天爽亚洲中文字幕| 国产亚洲欧洲Aⅴ综合一区 | 久久综合亚洲色HEZYO国产| 久久不见久久见免费视频7| 大桥未久亚洲无av码在线|