1. 程式人生 > >PHP數據庫操作類

PHP數據庫操作類

ceo pre 行數 function php數據庫 魔術方法 new self lose 單例

<?php
/*
設計一個類:mysql數據庫操作類
設計目標:
1,該類一實例化,就可以自動連接上mysql數據庫;
2,該類可以單獨去設定要使用的連接編碼(set  names  XXX)
3,該類可以單獨去設定要使用的數據庫(use  XXX);
4,可以主動關閉連接;
*/

class MySQLDB{

	private $link = null;	//用於存儲連接成功後的“資源”

	//定義一些屬性,以存儲連接數據庫的6項基本信息
	private $host;
	private $port;
	private $user;
	private $pass;
	private $charset;
	private $dbname;

	//實現單例第2步:用於存儲唯一的單例對象:
	private static $instance = null;
	//實現單例第3步:
	static  function GetInstance($config){
		//if( !isset( self::$instance )){	//還沒有該對象
		if( !(self::$instance instanceof self) ){	//這一行代替上一行的判斷,更常見
			self::$instance = new self($config); //就創建並存起來
		}
		return self::$instance;
	}
	//實現單例第4步:私有化這個克隆的魔術方法
	private function __clone(){}

	//實現單例第1步:
	private function __construct($config){
		//先將這些基本的連接信息,保存起來!
		$this->host = !empty($config[‘host‘]) ? $config[‘host‘] : "localhost";	//考慮空值情況,使用默認值代替
		$this->port = !empty($config[‘port‘]) ? $config[‘port‘] : "3306" ;
		$this->user = !empty($config[‘user‘]) ? $config[‘user‘] : "root" ;
		$this->pass = !empty($config[‘pass‘]) ? $config[‘pass‘] : "" ;
		$this->charset = !empty($config[‘charset‘]) ? $config[‘charset‘] : "utf8" ;
		$this->dbname = !empty($config[‘dbname‘]) ? $config[‘dbname‘] : "php39" ;
		
		//然後連接數據庫!
		$this->link  =  mysql_connect("{$this->host}:{$this->port}", "{$this->user}", "{$this->pass}") 
		or die("連接失敗");

		//設定編碼
		//mysql_query("set names {$config[‘charset‘]}");
		$this->setCharset( $this->charset );//這一行代替上一行

		//選定要使用的數據庫名
		//mysql_query("use  {$config[‘dbname‘]}");
		$this->selectDB( $this->dbname );//這一行代替上一行
	}
	//可以設定要使用的連接編碼
	function setCharset( $charset ){
		mysql_query("set names $charset", $this->link);
	}
	//可以設定要使用的數據庫
	function selectDB($dbname){
		mysql_query("use  $dbname", $this->link);
	}
	//可關閉連接
	function closeDB(){
		mysql_close($this->link);
	}

	//這個方法為了執行一條增刪改語句,它可以返回真假結果
	function exec($sql){
		
		$result = $this->query($sql);
		return true;	//因為是增刪改語句,直接返回true就可以
	}
	
	//這個方法為了執行一條返回一行數據的語句,它可以返回一維數組
	//數組的下標,就是sql語句中的取出的字段名;
	function GetOneRow($sql){
		
		$result = $this->query($sql);
		//這裏開始處理數據,以返回數組。此時$result是一個結果集(單行數據)
		$rec = mysql_fetch_assoc( $result );//取出第一行數據(其實應該只有這一行)
		mysql_free_result( $result );	//提前釋放資源(銷毀結果集),否則需要等到頁面結束才自動銷毀
		return $rec;
	}
	
	//這個方法為了執行一條返回多行數據的語句,它可以返回二維數組
	function GetRows($sql){
		
		$result = $this->query($sql);
		//這裏開始處理數據,以返回數組。此時$result是一個結果集(且是多行數據)
		$arr = array();	//空數組,用於存放要返回的結果數組(二維)
		while ( $rec = mysql_fetch_assoc( $result ) ){
			$arr[] = $rec;	//此時,$arr就是二維數組了!
		}
		mysql_free_result( $result );	//提前釋放資源(銷毀結果集),否則需要等到頁面結束才自動銷毀
		return $arr;
	}
	
	//這個方法為了執行一條返回一個數據的語句,它可以返回一個直接值
	//這條語句類似這樣:select  count(*) as c  from  user_list
	function GetOneData($sql){
		
		$result = $this->query($sql);
		//這裏開始處理數據,以返回一個數據(標量數據)!
		$rec = mysql_fetch_row( $result );	//這裏也可以使用fetch_array這個函數!
											//這裏得到$rec仍然是一個數組,但其類似這樣:
											//  array ( 0=> 5 );或者 array( 0=>‘user1‘);
		$data = $rec[0];
		mysql_free_result( $result );	//提前釋放資源(銷毀結果集),否則需要等到頁面結束才自動銷毀
		return $data;
	}

	//這個方法用於執行任何sql語句,並進行錯誤處理,或返回執行結果;
	private function query( $sql ){
		$result = mysql_query($sql, $this->link);
		if( $result === false){
			//對任何sql語句,執行失敗,都需要處理這種失敗情況:
			echo "<p>sql語句執行失敗,請參考如下信息:";
			echo "<br />錯誤代號:" . mysql_errno();	//獲取錯誤代號
			echo "<br />錯誤信息:" . mysql_error();	//獲取錯誤提示內部
			echo "<br />錯誤語句:" . $sql;
			die();
		}
		return $result;	//返回的是“執行的結果”
	}

}
?>

PHP數據庫操作類