• <fieldset id="8imwq"><menu id="8imwq"></menu></fieldset>
  • <bdo id="8imwq"><input id="8imwq"></input></bdo>
    最新文章專題視頻專題問(wèn)答1問(wèn)答10問(wèn)答100問(wèn)答1000問(wèn)答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題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關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
    問(wèn)答文章1 問(wèn)答文章501 問(wèn)答文章1001 問(wèn)答文章1501 問(wèn)答文章2001 問(wèn)答文章2501 問(wèn)答文章3001 問(wèn)答文章3501 問(wèn)答文章4001 問(wèn)答文章4501 問(wèn)答文章5001 問(wèn)答文章5501 問(wèn)答文章6001 問(wèn)答文章6501 問(wèn)答文章7001 問(wèn)答文章7501 問(wèn)答文章8001 問(wèn)答文章8501 問(wèn)答文章9001 問(wèn)答文章9501
    當(dāng)前位置: 首頁(yè) - 科技 - 知識(shí)百科 - 正文

    Thinkphp與Oracle之間的各種問(wèn)題

    來(lái)源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-09 13:02:06
    文檔

    Thinkphp與Oracle之間的各種問(wèn)題

    Thinkphp與Oracle之間的各種問(wèn)題:Thinkphp對(duì)Oracle的支持簡(jiǎn)直弱爆,只做到了基本的操作,就連事務(wù)都不支持。今天來(lái)手動(dòng)改一改DbOracle.class.php,讓它稍微好用一些吧。 首先是insert。原來(lái)的insert應(yīng)該沒(méi)有什么問(wèn)題,但實(shí)際項(xiàng)目中更多的是需要在插入的時(shí)候遇到已存在的記錄則進(jìn)行更新。于是
    推薦度:
    導(dǎo)讀Thinkphp與Oracle之間的各種問(wèn)題:Thinkphp對(duì)Oracle的支持簡(jiǎn)直弱爆,只做到了基本的操作,就連事務(wù)都不支持。今天來(lái)手動(dòng)改一改DbOracle.class.php,讓它稍微好用一些吧。 首先是insert。原來(lái)的insert應(yīng)該沒(méi)有什么問(wèn)題,但實(shí)際項(xiàng)目中更多的是需要在插入的時(shí)候遇到已存在的記錄則進(jìn)行更新。于是

    Thinkphp對(duì)Oracle的支持簡(jiǎn)直弱爆,只做到了基本的操作,就連事務(wù)都不支持。今天來(lái)手動(dòng)改一改DbOracle.class.php,讓它稍微好用一些吧。 首先是insert。原來(lái)的insert應(yīng)該沒(méi)有什么問(wèn)題,但實(shí)際項(xiàng)目中更多的是需要在插入的時(shí)候遇到已存在的記錄則進(jìn)行更新。于是

    Thinkphp對(duì)Oracle的支持簡(jiǎn)直弱爆,只做到了基本的操作,就連事務(wù)都不支持。今天來(lái)手動(dòng)改一改DbOracle.class.php,讓它稍微好用一些吧。

    首先是insert。原來(lái)的insert應(yīng)該沒(méi)有什么問(wèn)題,但實(shí)際項(xiàng)目中更多的是需要在插入的時(shí)候遇到已存在的記錄則進(jìn)行更新。于是,利用Oracle中的MERGE INTO來(lái)實(shí)現(xiàn)這一點(diǎn)。

    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) {
     //主鍵值為空時(shí),不插入主鍵
     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))) { // 過(guò)濾非標(biāo)量數(shù)據(jù)
     $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()));
    }
    

    不支持事務(wù)是Thinkphp連接Oracle時(shí)的另一個(gè)問(wèn)題,框架作者似乎已經(jīng)做過(guò)適配,但是應(yīng)該是沒(méi)有測(cè)試,留下一堆bug。DbOracle.class.php中已經(jīng)有了startTrans,commit,rollback等,稍作修改即可。

    Thinkphp對(duì)數(shù)據(jù)庫(kù)的所有操作最終都是匯集到query或execute上來(lái)執(zhí)行,但這兩個(gè)函數(shù)里放了一句$this->mode = OCI_COMMIT_ON_SUCCESS;活生生的把事務(wù)扼殺了,所以,這里先把兩個(gè)函數(shù)里的這句注釋掉。

    然后,驚人得發(fā)現(xiàn)execute()中調(diào)用oci_execute時(shí)根本沒(méi)有傳入mode!前面辛辛苦苦改mode又是何苦,果斷加上oci_execute($stmt, $this->mode)。

    接下來(lái)才是讓事務(wù)生效的重頭戲。在事務(wù)的幾個(gè)開(kāi)關(guān)函數(shù)中加入對(duì)mode的修改,在startTrans()中,將mode設(shè)為OCI_DEFAULT,commit和rollback中將將mode設(shè)為改回OCI_COMMIT_ON_SUCCESS。這三個(gè)函數(shù)大概就是這樣子的:

    /**
     * 啟動(dòng)事務(wù)
     * @access public
     * @return void
     */
     public function startTrans() {
     $this->initConnect(true);
     if ( !$this->_linkID ) return false;
     //數(shù)據(jù)rollback 支持
     if ($this->transTimes == 0) {
     $this->mode = OCI_DEFAULT;
     }
     $this->transTimes++;
     return ;
    }
    /**
     * 用于非自動(dòng)提交狀態(tài)下面的查詢提交
     * @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;
    }
    /**
     * 事務(wù)回滾
     * @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;
    }
    

    還有一個(gè)頭疼的問(wèn)題就是日期類型轉(zhuǎn)換,我還在尋找一種便捷的方法來(lái)解決這個(gè)問(wèn)題。以后再補(bǔ)充上來(lái)吧。

    聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

    Thinkphp與Oracle之間的各種問(wèn)題

    Thinkphp與Oracle之間的各種問(wèn)題:Thinkphp對(duì)Oracle的支持簡(jiǎn)直弱爆,只做到了基本的操作,就連事務(wù)都不支持。今天來(lái)手動(dòng)改一改DbOracle.class.php,讓它稍微好用一些吧。 首先是insert。原來(lái)的insert應(yīng)該沒(méi)有什么問(wèn)題,但實(shí)際項(xiàng)目中更多的是需要在插入的時(shí)候遇到已存在的記錄則進(jìn)行更新。于是
    推薦度:
    標(biāo)簽: php 的所有 問(wèn)題
    • 熱門(mén)焦點(diǎn)

    最新推薦

    猜你喜歡

    熱門(mén)推薦

    專題
    Top
    主站蜘蛛池模板: 无码人妻精品一区二区在线视频| 99精品国产高清一区二区麻豆| 蜜臀久久99精品久久久久久小说| 影视网欧洲精品| 国产精品视频一区二区三区无码| 无码精品蜜桃一区二区三区WW | 2018国产精华国产精品| 久久久久久久亚洲精品| 99热热久久这里只有精品68| 97精品国产一区二区三区| 亚洲精品国精品久久99热一| 欧美国产成人精品一区二区三区 | 日韩精品中文字幕第2页| 国产精品福利区一区二区三区四区 | 久久久久人妻精品一区| 亚洲人成国产精品无码| 免费精品久久久久久中文字幕 | 国产精品拍天天在线| 乱色精品无码一区二区国产盗| 亚洲&#228;v永久无码精品天堂久久 | 在线精品自拍无码| 亚洲精品动漫人成3d在线| 拍国产乱人伦偷精品视频| 国产综合色产在线精品| 国产精品国产三级国产潘金莲| 嫩草影院久久国产精品| 精品无人区麻豆乱码1区2区| 99re6在线精品免费观看| 国产精品视频色拍拍| 国内精品久久久人妻中文字幕| 日韩人妻无码精品一专区| 亚洲国产精品一区二区成人片国内| 亚洲国产av无码精品| 亚洲视频在线精品| 亚洲精品中文字幕乱码三区| 亚洲日韩精品无码一区二区三区| 亚洲国产精品不卡毛片a在线| 亚洲国产成人乱码精品女人久久久不卡 | 香蕉依依精品视频在线播放 | 极品精品国产超清自在线观看| 国产亚洲福利精品一区|