PHP 資料庫操作類
阿新 • • 發佈:2019-02-20
<?php interface IMysqliUtil { /** * 插入資料 * * @param $tbname 表名 * @param $data 表資料 */ function insert($tbname, $data); /** * 刪除資料 * * @param $tbname 表名 * @param $data 表資料 */ function delete($tbname, $data); /** * 更新資料 * * @param $tbname 表名 * @param $data 表資料 */ function update($tbname, $data); /** * 查詢資料 * * @param $tbname 表名 * @param $condition 條件 */ function from($tbname, $condition); /** * 查詢資料,根據主鍵值 * * @param $tbname 表名 * @param $id 主鍵值 */ function get($tbname, $id); /** * 通過原生的sql語句獲取資料 * * @param $sql 執行的sql語句 */ function getRowsBySql($sql); /** * 事務回滾 */ function rollback(); /** * 開始事務 */ function beginTransaction(); /** * 提交事務 */ function commit(); /** * 釋放結果集 */ function free(); } ?> <?php class MysqliUtil implements IMysqliUtil { private $db_host; private $db_user; private $db_psw; private $db_database; private $coding; // 資料庫編碼,GBK,UTF-8,gb2312 private $mysqli; private $result; private $show_error = true; // 是否開啟顯示錯誤 private $bulletin = true; // 是否開啟錯誤記錄 function __construct() { $this->db_host = 'localhost'; $this->db_user = 'root'; $this->db_psw = '123456'; $this->db_database = 'test'; $this->coding = 'utf-8'; $this->_connect (); } /* * 增加記錄 */ public function insert($tbname, $data) { if (is_array ( $data [0] )) { // 增加多條記錄 $this->_insert_many ( $tbname, $data ); } else { // 增加一條記錄 $this->_insert_one ( $tbname, $data ); } } /* * 刪除記錄 */ public function delete($tbname, $data) { if (is_array ( $data [0] )) { // 刪除多條記錄 $sql = $this->_delete_many ( $tbname, $data ); } else { // 刪除一條記錄 $sql = $this->_delete_one ( $tbname, $data ); } } /* * 更新資料 */ public function update($tbname, $data) { if (is_array ( $data [0] )) { // 更新多條記錄 $this->_update_many ( $tbname, $data ); } else { // 更新一條記錄 $this->_update_one ( $tbname, $data ); } } /* * 查詢資料 */ public function from($tbname, $condition, $start = -1, $pageSize = 0) { $sql = "select * from $tbname "; if ($condition) { $sql .= $condition; } if ($start >= 0 && $pageSize > 0) { $sql .= " limit $start,$pageSize"; } $rows = $this->getRowsBySql ( $sql ); return $rows; } /* * 根據表主鍵值獲得單條記錄 */ public function get($tbname, $id) { $PrimaryColumn = $this->_getPRY ( $tbname ); $sql = "select * from $tbname where $PrimaryColumn=$id"; $rows = $this->getRowsBySql ( $sql ); return $rows [0]; } /* * 通過原生的sql語句獲取資料 */ public function getRowsBySql($sql) { $re = $this->mysqli->query ( $sql ); while ( $row = $re->fetch_assoc () ) { $rows [] = $row; } return $rows; } /* * 事務回滾 */ public function rollback() { $this->mysqli->rollback (); } /* * 開始事務 */ public function beginTransaction() { $this->mysqli->autocommit ( false ); } /* * 提交事務 */ public function commit() { $this->mysqli->commit (); } /* * 釋放結果集 */ public function free() { $this->result = null; } // ///////////////private private function _connect() { $this->mysqli = new mysqli ( $this->db_host, $this->db_user, $this->db_psw, $this->db_database ); if ($this->mysqli->connect_error) { die ( 'Connect Error (' . $this->mysqli->connect_errno . ') ' . $this->mysqli->connect_error ); } $this->mysqli->query ( "SET NAMES $this->coding" ); } // 執行sql語句 private function _query($sql) { $this->result = $this->mysqli->query ( $sql ); return $this->result; } // 獲得主鍵列名 function _getPRY($tbname) { $rows = $this->getRowsBySql ( "describe $tbname" ); foreach ( $rows as $row => $filed ) { if ($filed ['Key'] == 'PRI') return $filed ['Field']; } } // 增加一條記錄 private function _insert_one($tbname, $data) { $sql = "INSERT INTO $tbname set "; foreach ( $data as $field => $value ) { $sql .= "$field='$value',"; } if ($data [$this->_getPRY ( $tbname )] > 0) { $sql = substr ( $sql, 0, strlen ( $sql ) - 1 ); } else { $sql .= $this->_getPRY ( $tbname ) . '=' . ($this->_getMaxId ( $tbname ) + 1); } $this->_query ( $sql ); if ($this->mysqli->errno > 0) { $this->_show_error ( $sql, $this->mysqli ); } } // 增加多條記錄 private function _insert_many($tbname, $datas) { foreach ( $datas as $data ) { $this->insert_one ( $tbname, $data ); } } // 刪除一條記錄 private function _delete_one($tbname, $data) { $PrimaryColumn = $this->_getPRY ( $tbname ); $PrimaryValue = $data [$PrimaryColumn]; $sql = "DELETE FROM $tbname WHERE $PrimaryColumn='$PrimaryValue'"; $this->_query ( $sql ); } // 刪除多條記錄 private function _delete_many($tbname, $datas) { foreach ( $datas as $data ) { $this->delete_one ( $tbname, $data ); } } // 更新一條記錄 private function _update_one($tbname, $data) { $PrimaryColumn = $this->_getPRY ( $tbname ); $PrimaryValue = $data [$PrimaryColumn]; $sql = "UPDATE $tbname SET "; foreach ( $data as $field => $value ) { $sql .= " $field='$value',"; } $sql = substr ( $sql, 0, strlen ( $sql ) - 1 ) . " WHERE $PrimaryColumn='$PrimaryValue'"; $this->_query ( $sql ); if ($this->mysqli->errno > 0) { $this->_show_error ( $sql, $this->mysqli ); } } // 更新多條記錄 private function _update_many($tbname, $datas) { foreach ( $datas as $data ) { $this->update_one ( $tbname, $data ); } } // 獲取一個表的主鍵列的最大值 private function _getMaxId($tbname) { $PrimaryColumn = $this->_getPRY ( $tbname ); $sql = "select max($PrimaryColumn) as maxId from $tbname"; $rows = $this->getRowsBySql ( $sql ); $insertId = $rows [0] ['maxId'] + 1; return $rows [0] ['maxId']; } // 解構函式,自動關閉資料庫,垃圾回收機制 public function __destruct() { if (! empty ( $this->result )) { $this->free (); } $this->mysqli->close (); } // 輸出顯示sql語句 private function _show_error( $sql , $mysqli) { if (! $this->show_error) { return; } echo "<fieldset>"; echo "<legend><font color='red'>錯誤資訊提示:</font></legend><br />"; echo "<div style='font-size:14px; clear:both; font-family:Verdana, Arial, Helvetica, sans-serif;'>"; echo "<div>"; echo "<font color='#999999'>錯誤號:" . $mysqli->errno . "</font>"; echo "</div><br />"; echo "<div>"; echo "<font color='#999999'>錯誤原因:" . $mysqli->error . "</font><br />"; echo "</div>"; echo "<font color='#999999'><pre>你的sql語句:<br>" . $sql . "</pre></font>"; if ($this->bulletin) { $this->_recordError ( $sql, $mysqli ); } echo "<br />"; echo "</div>"; echo "</fieldset>"; echo "<br />"; } private function _recordError($sql, $mysqli) { $time = date ( "Y-m-d H:i:s" ); $message = "\r\n 錯誤號:" . $mysqli->errno; $message .= "\r\n 錯誤原因:" . $mysqli->error; $message .= "\r\nsql語句:$sql"; $message .= "\r\n時間 :$time"; $message .= "\r\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r\n"; $server_date = date ( "Y-m-d" ); $filename = $server_date . ".txt"; $file_path = "error/" . $filename; $file = "error"; // 設定檔案儲存目錄 // 建立資料夾 if (! file_exists ( $file )) { if (! mkdir ( $file, 0777 )) { // 預設的 mode 是 0777,意味著最大可能的訪問權 die ( "upload files directory does not exist and creation failed" ); } } // 建立txt日期檔案 if (! file_exists ( $file_path )) { // echo "建立日期檔案"; fopen ( $file_path, "w+" ); // 首先要確定檔案存在並且可寫 if (is_writable ( $file_path )) { // 使用新增模式開啟$filename,檔案指標將會在檔案的開頭 if (! $handle = fopen ( $file_path, 'a' )) { echo "不能開啟檔案 $filename"; exit (); } // 將$somecontent寫入到我們開啟的檔案中。 if (! fwrite ( $handle, $message )) { echo "不能寫入到檔案 $filename"; exit (); } // echo "檔案 $filename 寫入成功"; echo "——錯誤記錄被儲存!"; // 關閉檔案 fclose ( $handle ); } else { echo "檔案 $filename 不可寫"; } } else { // 首先要確定檔案存在並且可寫 if (is_writable ( $file_path )) { // 使用新增模式開啟$filename,檔案指標將會在檔案的開頭 if (! $handle = fopen ( $file_path, 'a' )) { echo "不能開啟檔案 $filename"; exit (); } // 將$somecontent寫入到我們開啟的檔案中。 if (! fwrite ( $handle, $message )) { echo "不能寫入到檔案 $filename"; exit (); } // echo "檔案 $filename 寫入成功"; echo "<font color='#999999'>——錯誤記錄被儲存!</font>"; // 關閉檔案 fclose ( $handle ); } else { echo "檔案 $filename 不可寫"; } } } } ?>