<?php
/*
設(shè)計(jì)一個(gè)類霎箍,該類能夠在一實(shí)例化奇钞,就連接上了mysql數(shù)據(jù)庫(kù)澡为!
當(dāng)然,實(shí)例化的時(shí)候景埃,需要傳遞連接數(shù)據(jù)庫(kù)的基本信息:
服務(wù)器地址媒至,端口,用戶名谷徙,密碼拒啰,連接編碼,要使用的數(shù)據(jù)庫(kù)名完慧;
擴(kuò)充需求:
該實(shí)例化后的對(duì)象谋旦,還可以:
1,單獨(dú)去設(shè)定要使用的編碼,
2册着,以及單獨(dú)選擇要使用的數(shù)據(jù)庫(kù)拴孤!
繼續(xù)擴(kuò)充需求:
6,有一個(gè)方法甲捏,可以執(zhí)行“增刪改”語(yǔ)句演熟,并返回受影響的行數(shù)
7,有一個(gè)方法司顿,可以執(zhí)行“返回一行數(shù)據(jù)”的select語(yǔ)句芒粹,并得到一個(gè)一維數(shù)組;
比如:select * from XXX where id = 5;
8大溜,有一個(gè)方法化漆,可以執(zhí)行“返回多行數(shù)據(jù)”的select語(yǔ)句,并得到一個(gè)二維數(shù)組钦奋;
比如:select * from XXX where id > 5 and id < 10;
9获三,有一個(gè)方法,可以執(zhí)行“返回一個(gè)數(shù)據(jù)”的select語(yǔ)句锨苏,并得到一個(gè)“標(biāo)量值”疙教;
比如: select count(*) as c from XXX ;
*/
class MySQLDB{
//用于保存連接成功之后的資源
private $link = null;
private $host ; //定義一些屬性,以保存連接信息
private $port ;
private $user ;
private $pass ;
private $charset ;
private $dbname ;
//第1步:私有化構(gòu)造方法:
private function __construct($conf){
//將傳遞過(guò)來(lái)的倆接信息保存到相應(yīng)屬性中伞租,并考慮默認(rèn)值情況
$this->host = !empty($conf['host']) ? $conf['host'] : "localhost";
$this->port = !empty($conf['port']) ? $conf['port'] : 3306;
$this->user = !empty($conf['user']) ? $conf['user'] : "root";
$this->pass = !empty($conf['pass']) ? $conf['pass'] : "123";
$this->charset = !empty($conf['charset']) ? $conf['charset'] : "utf8";
$this->dbname = !empty($conf['dbname']) ? $conf['dbname'] : "php40";
//建立連接
$this->connect();
}
//第2步:定義一個(gè)私有的靜態(tài)屬性:
private static $instance = null;
//第3步:定義一個(gè)公開(kāi)的靜態(tài)方法以根據(jù)一定的邏輯返回該對(duì)象:
static public function GetDB( $conf ){
//if( empty( static::$instance) ){//改進(jìn)為如下判斷邏輯
if( (static::$instance instanceOf static) === false){
static::$instance = new static( $conf );
}
return static::$instance;
}
//第4步:私有化克隆的魔術(shù)方法贞谓,以禁止外界克隆:
private function __clone(){}
function setCharset($char){
//mysql_query("set names $char", $this->link);
//以下一行代替上一行
$this->query("set names $char");
}
function use_db( $db ){
//mysql_query("use $db", $this->link);
//以下一行代替上一行
$this->query("use $db");
}
function close_db(){
mysql_close($this->link);
}
//此方法用于執(zhí)行“增刪改”語(yǔ)句:
function exec( $sql ){
$result = $this->query( $sql );
return $this->affectedRow(); //返回影響的行數(shù)
}
//此方法用于執(zhí)行“返回一行數(shù)據(jù)” 的select語(yǔ)句并返回一個(gè)一維數(shù)組:
function GetOneRow( $sql ){
$result = $this->query( $sql );
//下面自然是成功的時(shí)候葵诈,處理數(shù)據(jù):
$rec = mysql_fetch_assoc( $result );//這就是一個(gè)一維數(shù)組裸弦!
//類似這樣:array('id'=>5, 'name'=>'張三', 'age'=>18);
return $rec;
}
//此方法用于執(zhí)行“返回多行數(shù)據(jù)” 的select語(yǔ)句并返回一個(gè)二維數(shù)組:
function GetAllRow( $sql ){
$result = $this->query( $sql );
$rows = array();
while($rec = mysql_fetch_assoc( $result ) ){
$rows[] = $rec; //這樣之后,$rows就是二維數(shù)組了
}
return $rows;
}
//此方法用于執(zhí)行“返回一個(gè)數(shù)據(jù)” 的select語(yǔ)句并返回一個(gè)標(biāo)量數(shù)據(jù)值:
function GetOneData( $sql ){
$result = $this->query( $sql );//仍然是一個(gè)結(jié)果集(資源)
$rec = mysql_fetch_row( $result ); //取出第一行作喘,并做成索引數(shù)組
$data = $rec[0];
return $data;
}
private function query( $sql ){
$result = mysql_query($sql, $this->link);
if($result === false){
echo "<p>數(shù)據(jù)庫(kù)執(zhí)行失斃砀怼:";
echo "<br />失敗語(yǔ)句:" . $sql;
echo "<br />錯(cuò)誤代號(hào):" . mysql_errno();
echo "<br />錯(cuò)誤提示:" . mysql_error();
echo "</p>";
die(); //執(zhí)行失敗,直接終止泞坦!
}
return $result;
}
//序列化的時(shí)候窖贤,我們只要對(duì)6個(gè)數(shù)據(jù)進(jìn)行序列化
function __sleep(){
return array("host","port","user","pass","charset","dbname");
}
//反序列化的時(shí)候,我們需要來(lái)使用數(shù)據(jù)將數(shù)據(jù)庫(kù)連接成功
function __wakeup(){
//建立連接
$this->connect();
}
//完成對(duì)象實(shí)例化的時(shí)候所必須的數(shù)據(jù)庫(kù)連接基本操作
private function connect(){
$this->link = mysql_connect(
"{$this->host}:{$this->port}",
"{$this->user}",
$this->pass
)
or die("連接數(shù)據(jù)庫(kù)失敺∷赃梧!");
$this->setCharset( $this->charset );
$this->use_db( $this->dbname );
}
//返回受影響的行數(shù)
function affectedRow(){
return mysql_affected_rows($this->link);
}
//獲得最后一次insert時(shí)的自增長(zhǎng)id值
function getInsertedId(){
return mysql_insert_id($this->link);
}
}