搜尋
首頁後端開發php教程php pdo資料庫操作封裝類別程式碼

  1. /**

  2. * 데이터베이스 PDO 운영
  3. */
  4. class MysqlPdo {
  5. public static $PDOStatement = null;
  6. /**
  7. * 데이터베이스 연결 매개변수 구성
  8. * @var array
  9. * @access public
  10. */
  11. public static $config = array();
  12. /**
  13. * 영구 연결 사용 여부
  14. * @var bool
  15. * @access public
  16. */
  17. public static $pconnect = false;
  18. /**
  19. * 오류 메시지
  20. * @var string
  21. * @access public
  22. */
  23. public static $error = '';
  24. /**
  25. * 싱글톤 모드, Pdo 클래스의 유일한 인스턴스와 데이터베이스의 연결 리소스를 저장합니다.
  26. * @var object
  27. * @access public
  28. */
  29. protected static $link;
  30. /**
  31. * 데이터베이스 연결 여부
  32. * @var bool
  33. * @access public
  34. */
  35. public static $connected = false;
  36. /**
  37. * 데이터베이스 버전
  38. * @var string
  39. * @access public
  40. */
  41. public static $dbVersion = null;
  42. /**
  43. * 현재 SQL 문
  44. * @var string
  45. * @access public
  46. */
  47. public static $queryStr = ' ';
  48. /**
  49. * 마지막으로 삽입된 레코드의 ID
  50. * @var 정수
  51. * @access public
  52. */
  53. public static $lastInsertId = null;
  54. /**
  55. * 영향을 받은 레코드 수를 반환합니다.
  56. * @var 정수
  57. * @access public
  58. */
  59. public static $numRows = 0;
  60. // 트랜잭션 명령어 수
  61. public static $transTimes = 0;
  62. /**
  63. * 생성자,
  64. * @param $dbconfig 데이터베이스 연결 관련 정보, array('ServerName', 'UserName', 'Password', 'DefaultDb', 'DB_Port', 'DB_TYPE')
  65. */
  66. 공용 함수 __construct($dbConfig=''){
  67. if (!class_exists('PDO') ) self::throw_Exception("지원되지 않음: PDO");
  68. //매개변수가 전송되지 않으면 기본 데이터 정의가 사용됩니다
  69. if (!is_array($dbConfig)) {
  70. $dbConfig = 배열(
  71. '호스트 이름' => DB_HOST,
  72. '사용자 이름' => DB_USER,
  73. '비밀번호' => DB_PWD,
  74. '데이터베이스' => DB_NAME,
  75. '호스트 포트' => ; DB_PORT,
  76. 'dbms' => DB_TYPE,
  77. 'dsn' => DB_TYPE.":host=".DB_HOST.";dbname=".DB_NAME
  78. );
  79. }
  80. if(empty($dbConfig['hostname'])) self::throw_Exception("데이터베이스 구성이 정의되지 않음");
  81. self::$config = $dbConfig;
  82. if(empty( self:: $config['params'])) self::$config['params'] = array();
  83. /**************************************멋진 분배기************ *******************************/
  84. if (!isset(self::$ link) ) {
  85. $configs = self::$config;
  86. if(self::$pconnect) {
  87. $configs['params'][constant('PDO::ATTR_PERSISTENT')] = true;
  88. }
  89. {
  90. self::$link = new PDO( $configs['dsn'], $configs['username'], $configs['password'],$configs[ 'params' 시도 ]);
  91. } catch (PDOException $e) {
  92. self::throw_Exception($e->getMessage());
  93. }
  94. if(!self::$link ) {
  95. self::throw_Exception('PDO 연결 오류');
  96. false 반환;
  97. }
  98. self::$link->exec('SET NAMES '.DB_CHARSET);
  99. self: :$dbVersion = self::$link->getAttribute(constant("PDO::ATTR_SERVER_INFO"));
  100. // 연결을 성공적으로 표시
  101. self::$connected = true;
  102. // 데이터베이스 연결 구성 정보 등록 취소
  103. unset($configs);
  104. }
  105. return self::$link;
  106. }
  107. /**
  108. * 쿼리 결과 해제
  109. * @access 함수
  110. */
  111. 정적 함수 무료 () {
  112. self::$PDOStatement = null;
  113. }
  114. /************************/
  115. /* 데이터베이스 작업*/
  116. /************************/
  117. /**
  118. * 모든 쿼리 데이터 가져오기
  119. * @access 함수
  120. * @return 배열
  121. */
  122. 정적 함수 getAll($sql=null) {
  123. if($sql != null)
  124. {
  125. self::query($sql) ;
  126. }
  127. //데이터 세트 반환
  128. $result = self::$PDOStatement->fetchAll(constant('PDO::FETCH_ASSOC'));
  129. return $result;
  130. }
  131. /**
  132. * 쿼리 결과 가져오기
  133. * @access 함수
  134. * @param string $sql SQL 명령
  135. * @param 정수 $seek 포인터 위치
  136. * @return 배열
  137. */
  138. 정적 함수 getRow($sql=null) {
  139. if($sql != null)
  140. {
  141. self::query($sql ) ;
  142. }
  143. // 배열 세트 반환
  144. $result = self::$PDOStatement->fetch(constant('PDO::FETCH_ASSOC'),constant('PDO::FETCH_ORI_NEXT')) ;
  145. return $result;
  146. }
  147. /**
  148. * SQL 문을 실행하여 쿼리 또는 작업 수행을 자동으로 판단
  149. * @access 함수
  150. * @param string $sql SQL 명령
  151. * @return 혼합
  152. */
  153. 정적 함수 doSql($sql='') {
  154. if(self::isMainIps($sql) ) {
  155. return self::execute($sql);
  156. }else {
  157. return self::getAll($sql);
  158. }
  159. }
  160. /**
  161. * 지정된 ID를 기준으로 테이블의 레코드 검색(단일 테이블 작업에만 해당)
  162. * @access 함수
  163. * @param 정수 $priId 기본 키 ID
  164. * @param string $tables 데이터 테이블 이름
  165. * @param string $fields 필드 이름
  166. * @return ArrayObject 테이블 레코드
  167. */
  168. 정적 함수 findById($tabName,$priId,$fields='*'){
  169. $sql = 'SELECT %s FROM %s WHERE id=%d';
  170. self 반환: : getRow(sprintf($sql, self::parseFields($fields), $tabName, $priId));
  171. }
  172. /**
  173. * 尋找記錄
  174. * @access function
  175. * @param string $tables 資料表名
  176. * @param mixed $where 查詢條件
  177. * @param string $fields 欄位名稱
  178. * @param string $order 排序
  179. * @param string $limit 取多少條資料
  180. * @param string $group 分組
  181. * @param string $having
  182. * @param boolean $lock 是否加鎖
  183. * @return ArrayObject
  184. */
  185. 靜態函數 find($tables,$where="",$fields='*',$order=null,$limit=null,$group=null,$ having=null) {
  186. $sql = 'SELECT '.self::parseFields($fields)
  187. .' FROM '.$tables
  188. .self::parseWhere($where)
  189. .self::parseGroup($group)
  190. .self::parseHaving($having)
  191. .self::parseOrder( $order)
  192. .self::parseLimit($limit);
  193. $dataAll = self::getAll($sql);
  194. if(count($dataAll)==1){$rlt=$ dataAll[0];}else{$rlt=$dataAll;}
  195. return $rlt;
  196. }
  197. /**
  198. * 插入(單一)記錄
  199. * @access function
  200. * @param mixed $data 資料
  201. * @param string $table 資料表名
  202. * @return false | integer
  203. */
  204. function add($data,$table) {
  205. //過濾提交資料
  206. $data=self::filterPost($table,$data);
  207. foreach ($data as $key=>$val){
  208. if(is_array( $ val) && strtolower($val[0]) == 'exp') {
  209. $val = $val[1]; // 使用表達式 ???
  210. }elseif (is_scalar($val)){
  211. $val = self::fieldFormat($val);
  212. }else{
  213. //刪除複合物件
  214. 繼續;
  215. }
  216. $data[$key] = $val;
  217. }
  218. $fields = array_keys($data);
  219. array_walk($fields, array($this, 'addSpecialChar'));
  220. $fieldsStr = implode(',', $fields);
  221. $values = array_values($data);
  222. $valuesStr = implode(',', $values);
  223. $sql = '插入'.$table.' ('.$fieldsStr.') VALUES ('.$valuesStr.')';
  224. return self::execute($sql);
  225. }
  226. /**
  227. * 更新記錄
  228. * @access function
  229. * @param mixed $sets 資料
  230. * @param string $table 資料表名
  231. * @param string $where 更新條件
  232. * @param string $limit
  233. * @param string $order
  234. * @return false | integer
  235. */
  236. 靜態函數update($sets,$table,$where,$limit=0,$order='') {
  237. $sets = self::filterPost($table,$sets);
  238. $sql = '更新「.$表」。 self::execute($sql );
  239. }
  240. /**
  241. * 儲存某個欄位的值
  242. * @access function
  243. * @param string $field 要儲存的欄位名稱
  244. * @param string $value 欄位值
  245. * @param string $ table 資料表
  246. * @param string $where 儲存條件
  247. * @param boolean $asString 欄位值是否為字串
  248. * @return void
  249. */
  250. 靜態函式setField($field, $value, $table, $condition="", $asString=false ) {
  251. //如果有'(' 視為SQL 指令更新否則更新欄位內容為純字串
  252. if(false === strpos($value,'(') || $asString) $value = '"'.$value .'"';
  253. $sql = '更新'.$table.' SET '.$field.'='.$value.self::parseWhere($condition);
  254. 回傳self::execute( $sql);
  255. }
  256. /**
  257. * 刪除記錄
  258. * @access function
  259. * @param mixed $where 為條件Map、Array或String
  260. * @param string $table 資料表名
  261. * @param string $limit
  262. * @param string $order
  263. * @return false | integer
  264. */靜態函式($where,$table,$limit='',$order='' ) {
  265. $sql = 'DELETE FROM '.$table.self::parseWhere($where).self::parseOrder($order).self::parseLimit($limit);
  266. 回傳self::執行($sql);
  267. }
  268. /**
  269. ----------------------------------------------- -----------
  270. * 修改或儲存資料(僅用於單表操作)
  271. * 有主鍵ID則為修改,無主鍵ID則為增加
  272. * 修改記錄:
  273. ---------------------------------------------- ------------
  274. * @access function
  275. ---------------------------- ------------------------------
  276. * @param $tabName 表名
  277. * @param $aPost 提交表單的$_POST
  278. * @param $priId 主鍵ID
  279. * @param $aNot 要排除的一個字段或數組
  280. * @param $aCustom 自訂的數組,附加到資料庫中保存
  281. * @param $isExits 是否已經存在存在:true, 不存在:false
  282. ------------------------------- ---------------------------
  283. * @return Boolean 修改或儲存是否成功
  284. -------- --------------------------------------------------
  285. */
  286. 函數saveOrUpdate($tabName, $aPost, $priId="", $aNot="", $aCustom="" , $isExits=false) {
  287. if(empty($tabName) || !is_array($aPost) || is_int($aNot)) return false;
  288. if(is_string($aNot) && !empty($aNot)) $aNot = array($aNot);
  289. if(is_array($aNot) && is_int(key ) ($aNot))) $aPost = array_diff_key($aPost, array_flip($aNot));
  290. if(is_array($aCustom) ) && is_string(key($aCustom))) $aPost = array_merge($aCustom))) $aPost = array_merge($aCustom))) $aPost = aPostge($aPost , $aCustom);
  291. if (empty($priId) && !$isExits) { // 新增
  292. $aPost = array_filter ($aPost, array($this, 'removeEmpty'));
  293. return self::add($aPost, $tabName);
  294. }else { //修改
  295. return self::update($aPost, $tabName, "id=".$priId);
  296. }
  297. }
  298. /**
  299. * 取得最近一次查詢的sql語句
  300. * @access function
  301. * @param
  302. * @return String 執行的SQL
  303. */
  304. 靜態函數getLastSql() {
  305. $link = self::$link;
  306. if (!$link ) return false;
  307. 回傳self::$queryStr;
  308. }
  309. /* *
  310. * 取得最後插入的ID
  311. * @access function
  312. * @param
  313. * @return integer 最後插入時的資料ID
  314. */
  315. 靜態函式getLastInsId(){
  316. $link = self::$link;
  317. if ( !$link ) return false;
  318. 回傳self::$lastInsertId;
  319. }
  320. /**
  321. * 取得DB版本
  322. * @access function
  323. * @param
  324. * @return string
  325. */
  326. 靜態函數getDbVersion(){
  327. $link = self::$link;
  328. if ( !$link ) return false;
  329. return self::$dbVersion;
  330. }
  331. /**
  332. * 取得資料庫的表格資訊
  333. * @access function
  334. * @return array
  335. */
  336. static function getTables() {
  337. $info = array();
  338. if(self::query ("顯示表格")) {
  339. $result = self::getAll();
  340. foreach ($result as $key => $val) {
  341. $info[$key] = current( $ val);
  342. }
  343. }
  344. return $info;
  345. }
  346. /**
  347. * 取得資料表的欄位資訊
  348. * @access function
  349. * @return array
  350. */
  351. 靜態函數getFields($tableName) {
  352. //取得資料庫連線
  353. $link = self::$link;
  354. $sql = "SELECT
  355. ORDINAL_POSITION ,COLUMN_NAME, COLUMN_TYPE, DATA_TYPE,
  356. IF(ISNULL(CHARACTER_MAX ) AS MAXCHAR,
  357. IS_NULLABLE, COLUMN_DEFAULT, COLUMN_KEY, EXTRA, COLUMN_COMMENT
  358. FROM
  359. INFORMATION_SCH! 🎜 >self::$queryStr = sprintf($sql, $tableName);
  360. $sth = $link->prepare($sql);
  361. $sth->bindParam(':tabName', $ tableName);
  362. $sth->execute();
  363. $result = $sth->fetchAll(constant('PDO::FETCH_ASSOC'));
  364. $info = array();
  365. foreach ($ result as $key =>; $val) {
  366. $info[$val['COLUMN_NAME']] = array(
  367. 'postion' => $val['ORDINAL_POSITION'],
  368. 'name' => $val[ 'COLUMN_NAME'],
  369. 'type' => $val['COLUMN_TYPE'],
  370. 'd_type' => $val['DATA_TYPE'],
  371. 'length' => $val ['MAXCHAR'],
  372. 'notnull' => (strtolower($val['IS_NULLABLE']) == "否"),
  373. 'default' => $val['COLUMN_DEFAULT'],
  374. 'primary' => (strtolower($val['COLUMN_KEY']) == 'pri'),
  375. 'autoInc' => (strtolower($val['EXTRA']) == ' auto_increment' ),
  376. 'comment' => $val['COLUMN_COMMENT']
  377. );
  378. }
  379. //有錯誤則發送異常
  380. self::haveErrorThrowException(); return $info;
  381. }
  382. /**
  383. * 關閉資料庫
  384. * @access function
  385. */
  386. 靜態函式close() {
  387. self::$link = null;
  388. }
  389. / **
  390. * SQL指令安全過濾
  391. * @access function
  392. * @param string $str SQL指令
  393. * @return string
  394. */
  395. static function escape_string($str) {
  396. return addslashes($str);
  397. }
  398. /*************************/
  399. /* 內部操作方法*/
  400. /*************************/
  401. /**
  402. * 有錯誤拋出例外
  403. * @access function
  404. * @return
  405. */
  406. 靜態函式haveErrorThrowException() {
  407. $obj = 空(self::$PDOStatement) ? self::$link : self::$PDOStatement;
  408. $arrError = $obj->errorInfo();
  409. if($arrError[0] !== '00000') { // 有錯誤訊息
  410. self::$error = $arrError[0]."|".$arrError[2]. "
    [ SQL ] : ".self::$queryStr."
    ";
  411. self::throw_exception(self::$error);
  412. 回傳false;
  413. }
  414. //主要針對execute()方法發送例外狀況
  415. if(self::$queryStr=='' )self::throw_exception('查詢為空

    [ SQL 語句] :');
  416. }
  417. /**
  418. * where分析
  419. * @access function
  420. * @param mixed $where 查詢條件
  421. * @return string
  422. */
  423. 靜態函式parseWhere($where ) {
  424. $whereStr = '';
  425. if( is_string($where) || is_null($where)) {
  426. $whereStr = $where;
  427. }
  428. 回傳空($ whereStr)?'':' WHERE '.$whereStr;
  429. }
  430. /**
  431. * 訂單分析
  432. * @access 函數
  433. * @param mix $order 排除訂單
  434. * @return string
  435. */
  436. 靜態函數parseOrder($order) {
  437. $orderStr = '';
  438. if(is_array($order))
  439. $orderStr .= ' ORDER BY '.implode(',', $order);
  440. else if(is_string($order) && !empty($order))
  441. $orderStr .= ' ORDER BY '.$order;
  442. return $orderStr;
  443. }
  444. /**
  445. * 限制分析
  446. * @access 函數
  447. * @param string $limit
  448. * @return string
  449. */
  450. 靜態函數parseLimit($limit) {
  451. */
  452. 靜態函數parseLimit($limit) {
  453. $limitStr = '';
  454. if(is_array($limit) )) {
  455. if(count($limit)>1)
  456. $limitStr .= ' LIMIT '.$limit[0]. ' , '.$limit[1].' ';
  457. else
  458. $limitStr .= ' LIMIT '.$limit[0].' ';
  459. } else if(is_string($limit) && !empty($limit)) {
  460. $limitStr .= ' LIMIT '.$limit.' ';
  461. }
  462. 回傳$limitStr;
  463. }
  464. /**
  465. * 그룹 분할
  466. * @access 함수
  467. * @param 혼합 $group
  468. * @return 문자열
  469. */
  470. 정적 함수 parseGroup($group) {
  471. $groupStr = '';
  472. if(is_array($group))
  473. $groupStr .= ' GROUP BY '.implode(',', $group);
  474. else if(is_string($group) && !empty($group))
  475. $groupStr .= ' GROUP BY '.$group;
  476. empty($groupStr)?'':$groupStr;
  477. }
  478. /**
  479. * have分析
  480. * @access 함수
  481. * @param string $having
  482. * @return string
  483. */
  484. 정적 함수parseHaving($having) {
  485. $havingStr = '';
  486. if(is_string($having) && !empty($having))
  487. $havingStr .= ' HAVING '.$having;
  488. return $havingStr;
  489. }
  490. /**
  491. * 필드 분할
  492. * @access 함수
  493. * @param 혼합 $필드
  494. * @return 문자열
  495. */
  496. function parseFields($fields) {
  497. if(is_array($fields)) {
  498. array_walk($fields, array($this, 'addSpecialChar'));
  499. $fieldsStr = implode(',', $fields);
  500. }else if(is_string($fields) && !empty($fields)) {
  501. if( false === strpos($fields,'`') ) {
  502. $fields =explode(',',$fields);
  503. array_walk($fields, array($this, 'addSpecialChar'));
  504. $fieldsStr = implode(',', $fields );
  505. }else {
  506. $fieldsStr = $fields;
  507. }
  508. }else $fieldsStr = '*';
  509. return $fieldsStr;
  510. }
  511. /**
  512. * 데이터 업데이트 시 호출되는 분석 설정
  513. * @access 함수
  514. * @param 혼합 $값 ​​
  515. * @return 문자열
  516. */
  517. 비공개 함수 parseSets($sets) {
  518. $setsStr = '';
  519. if(is_array($sets)){
  520. foreach ($sets as $key=> $val){
  521. $key = self::addSpecialChar($key);
  522. $val = self::fieldFormat($val);
  523. $setsStr .= "$key = ".$val. ",";
  524. }
  525. $setsStr = substr($setsStr,0,-1);
  526. }else if(is_string($sets)) {
  527. $setsStr = $sets;
  528. }
  529. return $setsStr;
  530. }
  531. /**
  532. * 필드 서식 지정
  533. * @access 함수
  534. * @param 혼합 $value
  535. * @return 혼합
  536. */
  537. 정적 함수 fieldFormat(&$value) {
  538. if(is_int($value)) {
  539. $value = intval($value);
  540. } else if(is_float($value)) {
  541. $value = floatval($value);
  542. } elseif(preg_match('/^(w* ( |-|*|/)?w*)$/i',$value)){
  543. // 支持在字段的值里face直接使用其它字段
  544. // 例如 (점수 1) (이름)必须包含括号
  545. $value = $value;
  546. }else if(is_string($value)) {
  547. $value = '''.self::escape_string($value).''';
  548. }
  549. return $value;
  550. }
  551. /**
  552. *
  553. 에 따라 필드 및 테이블 이름에 ` 추가* 지침에 사용된 키워드가 mysql에 대해 올바른지 확인
  554. * @access 함수
  555. * @param 혼합 $값
  556. * @return 혼합
  557. */
  558. 정적 함수 addSpecialChar(&$value) {
  559. if( '*' == $value | | false !== strpos($value,'(') || false !== strpos($value,'.') || false !== strpos($value,'`')) {
  560. //如果包含* 或者 使用了sql方法 则不작处理
  561. } elseif(false === strpos($value,'`') ) {
  562. $value = '`'.trim($value).'` ';
  563. }
  564. return $value;
  565. }
  566. /**
  567. ---------------------------------- ----------
  568. * 빈 요소 제거
  569. ------------- ---- ------------
  570. * @access 함수
  571. ---------- ----- ----------------
  572. * @param 혼합 $ 값
  573. ---------------------------- ----- -------------
  574. * @return 혼합
  575. ---------- ---- -----------------
  576. */
  577. 정적 함수 RemoveEmpty($value){
  578. return !empty($value);
  579. }
  580. /**
  581. * 주로 SELECT, SHOW 및 기타 명령에 대한 쿼리 실행
  582. * @access 함수
  583. * @param string $sql sql 명령
  584. * @return 혼합
  585. */
  586. 정적 함수 쿼리($sql='') {
  587. // 获取数据库联接
  588. $link = self::$link;
  589. if ( !$link ) return false;
  590. self::$queryStr = $sql;
  591. //释放前次的查询结果
  592. if ( !empty(self::$PDOStatement) ) self ::free();
  593. self::$PDOStatement = $link->prepare(self::$queryStr);
  594. $bol = self::$PDOStatement->execute();
  595. // 有错误则抛 Out异常
  596. self::haveErrorThrowException();
  597. return $bol;
  598. }
  599. /**
  600. * 데이터베이스 연산 방식
  601. * @access 함수
  602. * @param string $sql 실행문
  603. * @param boolean $lock 잠금 여부(기본값은 잠겨 있지 않음)
  604. * @return void
  605. 공용 함수 실행($sql='',$lock=false) {
  606. if(empty($sql)) $sql = $this->queryStr
  607. return $this->_execute; ($SQL)
  608. }*/
  609. /**
  610. * INSERT, UPDATE, DELETE 실행문
  611. * @access 함수
  612. * @param string $sql sql 명령
  613. * @return 정수
  614. * /
  615. 정적 함수 실행($sql='') {
  616. // 获取数据库联接
  617. $link = self::$link;
  618. if ( !$link ) return false;
  619. self::$queryStr = $sql;
  620. //释放前次的查询结果
  621. if ( !empty(self::$PDOStatement) ) self::free();
  622. $result = $link ->exec(self::$queryStr);
  623. // 있음 false;
  624. } else {
  625. self::$numRows = $result;
  626. self::$lastInsertId = $link->lastInsertId();
  627. return self::$numRows;
  628. }
  629. }
  630. /**
  631. * 데이터베이스 변경 작업인지 여부
  632. * @access private
  633. * @param string $query SQL 명령
  634. * @return boolen 쿼리 작업인 경우 false 반환
  635. */
  636. 정적 함수 isMainIps($query) {
  637. $queryIps = 'INSERT|UPDATE|DELETE|REPLACE|CREATE|DROP|LOAD DATA|SELECT .* INTO|COPY |ALTER|GRANT|REVOKE|LOCK|UNLOCK';
  638. if (preg_match('/^s*"?(' . $queryIps . ')s /i', $query)) {
  639. true를 반환합니다.
  640. }
  641. false 반환;
  642. }
  643. /**
  644. * POST 제출 데이터 필터링
  645. * @access private
  646. * @param 혼합 $data POST 제출 데이터
  647. * @param string $table 데이터 테이블 이름
  648. * @return 혼합 $newdata
  649. */
  650. 정적 함수 filterPost($table,$data) {
  651. $table_column = self::getFields( $table);
  652. $newdata=array();
  653. foreach($table_column as $key=>$val){
  654. if(array_key_exists($key,$data) && ($data[$ 키])!==''){
  655. $newdata[$key] = $data[$key];
  656. }
  657. }
  658. return $newdata;
  659. }
  660. / **
  661. * 거래 시작
  662. * @access 함수
  663. * @return void
  664. */
  665. 정적 함수 startTrans() {
  666. //数据rollback 支持
  667. $link = self::$link;
  668. if ( !$link ) return false;
  669. if (self::$transTimes == 0) {
  670. $link->beginTransaction();
  671. }
  672. self::$transTimes ;
  673. return ;
  674. }
  675. /**
  676. * 비자동 제출 상태에서 쿼리 제출에 사용됩니다.
  677. * @access 함수
  678. * @return boolen
  679. */
  680. 정적 함수 커밋() {
  681. $link = self::$link;
  682. if ( !$link ) return false;
  683. if (self::$ transTimes > 0) {
  684. $result = $link->commit();
  685. self::$transTimes = 0;
  686. if(!$result){
  687. self::throw_Exception( self::$error());
  688. false 반환;
  689. }
  690. }
  691. true 반환;
  692. }
  693. /**
  694. * 트랜잭션 롤백
  695. * @access 함수
  696. * @return bolen
  697. */
  698. 공개 함수 롤백 () {
  699. $link = self::$link;
  700. if ( !$link ) return false;
  701. if (self::$transTimes > 0) {
  702. $result = $link->rollback();
  703. self::$transTimes = 0;
  704. if(!$result){
  705. self::throw_Exception(self:: $error());
  706. false 반환;
  707. }
  708. }
  709. true 반환;
  710. }
  711. /**

  712. * 오류 처리
  713. * @access 함수
  714. * @return void
  715. */
  716. 정적 함수 throw_Exception($err){
  717. echo '
    오류:'.$err.'
    ';
  718. }
  719. }
复代码


陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
在Laravel中使用Flash會話數據在Laravel中使用Flash會話數據Mar 12, 2025 pm 05:08 PM

Laravel使用其直觀的閃存方法簡化了處理臨時會話數據。這非常適合在您的應用程序中顯示簡短的消息,警報或通知。 默認情況下,數據僅針對後續請求: $請求 -

php中的捲曲:如何在REST API中使用PHP捲曲擴展php中的捲曲:如何在REST API中使用PHP捲曲擴展Mar 14, 2025 am 11:42 AM

PHP客戶端URL(curl)擴展是開發人員的強大工具,可以與遠程服務器和REST API無縫交互。通過利用Libcurl(備受尊敬的多協議文件傳輸庫),PHP curl促進了有效的執行

簡化的HTTP響應在Laravel測試中模擬了簡化的HTTP響應在Laravel測試中模擬了Mar 12, 2025 pm 05:09 PM

Laravel 提供简洁的 HTTP 响应模拟语法,简化了 HTTP 交互测试。这种方法显著减少了代码冗余,同时使您的测试模拟更直观。 基本实现提供了多种响应类型快捷方式: use Illuminate\Support\Facades\Http; Http::fake([ 'google.com' => 'Hello World', 'github.com' => ['foo' => 'bar'], 'forge.laravel.com' =>

PHP記錄:PHP日誌分析的最佳實踐PHP記錄:PHP日誌分析的最佳實踐Mar 10, 2025 pm 02:32 PM

PHP日誌記錄對於監視和調試Web應用程序以及捕獲關鍵事件,錯誤和運行時行為至關重要。它為系統性能提供了寶貴的見解,有助於識別問題並支持更快的故障排除

在Codecanyon上的12個最佳PHP聊天腳本在Codecanyon上的12個最佳PHP聊天腳本Mar 13, 2025 pm 12:08 PM

您是否想為客戶最緊迫的問題提供實時的即時解決方案? 實時聊天使您可以與客戶進行實時對話,並立即解決他們的問題。它允許您為您的自定義提供更快的服務

解釋PHP中晚期靜態結合的概念。解釋PHP中晚期靜態結合的概念。Mar 21, 2025 pm 01:33 PM

文章討論了PHP 5.3中介紹的PHP中的晚期靜態結合(LSB),允許靜態方法的運行時間分辨率調用以更靈活的繼承。 LSB的實用應用和潛在的觸摸

自定義/擴展框架:如何添加自定義功能。自定義/擴展框架:如何添加自定義功能。Mar 28, 2025 pm 05:12 PM

本文討論了將自定義功能添加到框架上,專注於理解體系結構,識別擴展點以及集成和調試的最佳實踐。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能