1. 程式人生 > >PHP TP 事務、Try Catch REPLACE INTO

PHP TP 事務、Try Catch REPLACE INTO

注意事項:

  1、事務的開啟關閉,以及回滾;

  2、try。catch的作用在於防止一些未知的異常丟擲

  3、REPLACE INTO 語句使用原生(後臺表必須帶主鍵,沒有更新會出問題滴

  4、簡要說下三者的區別:insert into 最普遍的插入,如果表中存在主鍵相同的資料,執行會報錯。

             replace into 如果表中存在主鍵相同的資料則根據主鍵修改當前主鍵的資料,反之則插入(存在就修改,反之插入

             insert ignore  如果表中存在主鍵相同的資料不在插入該條資料,反之則插入(存在則忽略,反之插入

  5、借鑑網址:https://www.cnblogs.com/fillt/archive/2018/05/31/9118238.html

 

 

    $transaction = M();
        $transaction->startTrans();//開啟事務

        try {

            //$updateList=[];
            $insertList=[];
            foreach($dateList as $kl=>$vl) {

                $save['roomPrice']['date']=$vl
; $insertList[]=$save['roomPrice']; //方法一 01:正常的TP 插入,先判斷存在,再判斷插入還是更新 /*//判斷更新還是插入,分配到不同陣列 $checkCount=count($roomPriceM->where(['room_id'=>$save['roomPrice']['room_id'],'date'=>$vl])->select()); if($checkCount==0){// 此房間不存在該日期價格--插入 $insertList[]=$save['roomPrice']; }else{// 更新 $updateList[]=$save['roomPrice']; }
*/ } //方法二,原生插入REPLACE INTO //獲取欄位名 $fields='`'.implode("`,`", array_keys($insertList[0])).'`'; foreach ( $insertList as $kr=>$vr){ $values='';//每次置空 foreach($vr as $kv=>$vv){ $values[]=$vv; } //變數值重組 $valuesStr='"'.implode("\",\"", $values).'"'; //原生語句 $sqlStr='REPLACE INTO `hotel_room_prices` ('.$fields.') VALUES ('.$valuesStr.');'; //執行原生語句 $re=M()->execute($sqlStr); Ptn::filebug('影響資料條數 roomPrices表:'.$re, 'roomPrices_Update/InsertInfo'); } //方法一 02:正常的TP 插入,先判斷存在,再判斷插入還是更新 /*if(!empty($insertList)){ $resRoom = $roomPriceM->addAll($insertList); Ptn::filebug('插入影響資料條數 roomPrices表:'.$resRoom, 'roomPrices_InsertInfo'); } if(!empty($updateList)){ foreach($updateList as $ku=>$vu){ $resRoom = $roomPriceM->where(['room_id'=>$vu['room_id'],'date'=>$vu['date']])->save($updateList); Ptn::filebug('更新影響資料條數 roomPrices表:'.$resRoom, 'roomPrices_UpdateInfo'); } }*/ $transaction->commit();//關閉事務 $code = 0; $msg = '更新成功'; }catch (\Exception $e){ $transaction->rollback();//事務回滾 return $e->getMessage(); }