搜尋
首頁後端開發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
PHP如何識別用戶的會話?PHP如何識別用戶的會話?May 01, 2025 am 12:23 AM

phpIdentifiesauser'ssessionSessionSessionCookiesAndSessionId.1)whiwsession_start()被稱為,phpgeneratesainiquesesesessionIdStoredInacookInAcookInAcienamedInAcienamedphpsessIdontheuser'sbrowser'sbrowser.2)thisIdallowSphptpptpptpptpptpptpptpptoretoreteretrieetrieetrieetrieetrieetrieetreetrieetrieetrieetrieetremthafromtheserver。

確保PHP會議的一些最佳實踐是什麼?確保PHP會議的一些最佳實踐是什麼?May 01, 2025 am 12:22 AM

PHP會話的安全可以通過以下措施實現:1.使用session_regenerate_id()在用戶登錄或重要操作時重新生成會話ID。 2.通過HTTPS協議加密傳輸會話ID。 3.使用session_save_path()指定安全目錄存儲會話數據,並正確設置權限。

PHP會話文件默認存儲在哪裡?PHP會話文件默認存儲在哪裡?May 01, 2025 am 12:15 AM

phpsessionFilesArestoredIntheDirectorySpecifiedBysession.save_path,通常是/tmponunix-likesystemsorc:\ windows \ windows \ temponwindows.tocustomizethis:tocustomizEthis:1)useession_save_save_save_path_path()

您如何從PHP會話中檢索數據?您如何從PHP會話中檢索數據?May 01, 2025 am 12:11 AM

ToretrievedatafromaPHPsession,startthesessionwithsession_start()andaccessvariablesinthe$_SESSIONarray.Forexample:1)Startthesession:session_start().2)Retrievedata:$username=$_SESSION['username'];echo"Welcome,".$username;.Sessionsareserver-si

您如何使用會議來實施購物車?您如何使用會議來實施購物車?May 01, 2025 am 12:10 AM

利用會話構建高效購物車系統的步驟包括:1)理解會話的定義與作用,會話是服務器端的存儲機制,用於跨請求維護用戶狀態;2)實現基本的會話管理,如添加商品到購物車;3)擴展到高級用法,支持商品數量管理和刪除;4)優化性能和安全性,通過持久化會話數據和使用安全的會話標識符。

您如何在PHP中創建和使用接口?您如何在PHP中創建和使用接口?Apr 30, 2025 pm 03:40 PM

本文解釋瞭如何創建,實施和使用PHP中的接口,重點關注其對代碼組織和可維護性的好處。

crypt()和password_hash()有什麼區別?crypt()和password_hash()有什麼區別?Apr 30, 2025 pm 03:39 PM

本文討論了PHP中的crypt()和password_hash()的差異,以進行密碼哈希,重點介紹其實施,安全性和對現代Web應用程序的適用性。

如何防止PHP中的跨站點腳本(XSS)?如何防止PHP中的跨站點腳本(XSS)?Apr 30, 2025 pm 03:38 PM

文章討論了通過輸入驗證,輸出編碼以及使用OWASP ESAPI和HTML淨化器之類的工具來防止PHP中的跨站點腳本(XSS)。

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脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。