封裝一個DB類,用來專門操作數據庫,以後凡是對數據庫的操作,都由DB類的對象來實現。這樣有了自己的DB類,寫項目時簡單的sql語句就不用每次寫了,直接調用就行,很方便!
1.封裝一個DB類。一個類文件應該只有一個類,其他的內容全部都沒有。類文件的命名規則:類名.class.php
下面是創建DB類的代碼:
<?php
//封裝一個DB類,用來專門操作數據庫,以後凡是對數據庫的操作,都由DB類的對象來實現
class DB{
//屬性
private $host;
private $port;
private $user;
private $pass;
private $dbname;
private $charset;
private $prefix; //表前綴
private $link; //連接資源(連接數據庫,一般會返回一個資源,所以需要定義一個link屬性)
//構造方法(作用:為了初始化對象的屬性),會被自動調用
/*
* @param1 array $arr,默認為空,裡面是一個關聯數組,裡面有7個元素
* array('host' => 'localhost','port' => '3306');
*/
public function __construct($arr = array()){
//初始化
$this->host = isset($arr['host']) ? $arr['host'] : 'localhost';//先判斷是否有自己的host,如果有就用自己的host,否則就使用默認的localhost
$this->port = isset($arr['port']) ? $arr['port'] : '3306';
$this->user = isset($arr['user']) ? $arr['user'] : 'root';
$this->pass = isset($arr['pass']) ? $arr['pass'] : 'root';
$this->dbname = isset($arr['dbname']) ? $arr['dbname'] : 'mydatabase';
$this->charset = isset($arr['charset']) ? $arr['charset'] : 'utf8';
$this->prefix = isset($arr['prefix']) ? $arr['prefix'] : '';
//連接數據庫(類是要操作數據庫,因此要連接數據庫)
$this->connect();
//設置字符集
$this->setCharset();
//選擇數據庫
$this->setDbname();
}
/*
* 連接數據庫
*/
private function connect(){
//mysql擴展連接
$this->link = mysql_connect($this->host . ':' . $this->port,$this->user,$this->pass);
//判斷結果
if(!$this->link){
//結果出錯了
//暴力處理,如果是真實線上項目(生產環境)必須寫入到日志文件
echo '數據庫連接錯誤:<br/>';
echo '錯誤編號' . mysql_errno() . '<br/>';
echo '錯誤內容' . mysql_error() . '<br/>';
exit;
}
}
/*
* 設置字符集
*/
private function setCharset(){
//設置
$this->db_query("set names {$this->charset}");
}
/*
* 選擇數據庫
*/
private function setDbname(){
$this->db_query("use {$this->dbname}");
}
/*
* 增加數據
* @param1 string $sql,要執行的插入語句
* @return boolean,成功返回是自動增長的ID,失敗返回FALSE
*/
public function db_insert($sql){
//發送數據
$this->db_query($sql);
//成功返回自增ID
return mysql_affected_rows() ? mysql_insert_id() : FALSE;
}
/*
* 刪除數據
* @param1 string $sql,要執行的刪除語句
* @return Boolean,成功返回受影響的行數,失敗返回FALSE
*/
public function db_delete($sql){
//發送SQL
$this->db_query($sql);
//判斷結果
return mysql_affected_rows() ? mysql_affected_rows() : FALSE;
}
/*
* 更新數據
* @param1 string $sql,要執行的更新語句
* @return Boolean,成功返回受影響的行數,失敗返回FALSE
*/
public function db_update($sql){
//發送SQL
$this->db_query($sql);
//判斷結果
return mysql_affected_rows() ? mysql_affected_rows() : FALSE;
}
/*
* 查詢:查詢一條記錄
* @param1 string $sql,要查詢的SQL語句
* @return mixed,成功返回一個數組,失敗返回FALSE
*/
public function db_getRow($sql){
//發送SQL
$res = $this->db_query($sql);
//判斷返回
return mysql_num_rows($res) ? mysql_fetch_assoc($res) : FALSE;
}
/*
* 查詢:查詢多條記錄
* @param1 string $sql,要查詢的SQL語句
* @return mixed,成功返回一個二維數組,失敗返回FALSE
*/
public function db_getAll($sql){
//發送SQL
$res = $this->db_query($sql);
//判斷返回
if(mysql_num_rows($res)){
//循環遍歷
$list = array();
//遍歷
while($row = mysql_fetch_assoc($res)){
$list[] = $row;
}
//返回
return $list;
}
//返回FALSE
return FALSE;
}
/*
* mysql_query錯誤處理
* @param1 string $sql,需要執行的SQL語句
* @return mixed,只要語句不出錯,全部返回
*/
private function db_query($sql){
//發送SQL
$res = mysql_query($sql);
//判斷結果
if(!$res){
//結果出錯了
//暴力處理,如果是真實線上項目(生產環境)必須寫入到日志文件
echo '語句出現錯誤:<br/>';
echo '錯誤編號' . mysql_errno() . '<br/>';
echo '錯誤內容' . mysql_error() . '<br/>';
exit;
}
//沒有錯誤
return $res;
}
//__sleep方法
public function __sleep(){
//返回需要保存的屬性的數組
return array('host','port','user','pass','dbname','charset','prefix');
}
//__wakeup方法
public function __wakeup(){
//連接資源
$this->connect();
//設置字符集和選中數據庫
$this->setCharset();
$this->setDbname();
}
/*
* 獲取完整的表名
*/
protected function getTableName(){
//完整表名:前綴+表名
return $this->prefix . $this->table;
}
}
//這個DB類,一般不寫析構(不釋放資源)
2.使用DB類,但是如果要使用某一個類來創建對象,必須要保證該類已經被加載到代碼區裡。可以使用一個魔術函數來實現對類的自動加載
自動加載:當一個腳本文件在執行某些語句的時候(實例化)需要去代碼區裡尋找對應的類,如果找不到會通過自動加載函數來將對應的類文件進行加載。
魔術函數:__autoload()
比如我們在index.php頁面中需要使用DB類,那麼我們就直接調用即可,具體代碼如下:
<?php
//使用DB類的對象來訪問數據庫
//先加載類文件
//include_once 'DB.class.php';
//如果想使用其他類,又需要加載(所以使用魔術函數__autoload來實現類的自動加載)
//顯示的寫出魔術函數__autoload
//參數:需要加載的類的名字
function __autoload($a){
//將對應的類文件加載進來
if(is_file("$a.class.php")){
include_once "$a.class.php";
}
}
//實例化
$db = new DB(array('dbname' => 'mydatabase'));