1. 程式人生 > >PHP 資料庫操作類

PHP 資料庫操作類

<?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 不可寫";
			}
		}
	}
}
?>