資料庫抽象層實現 mysql_connect (已廢棄)
<?php
/**
*class Mysql_db
*
* mysql 資料庫類,實現Database_interface 介面
*
* @param Database
* @author 王扶林
* @copyright 王扶林 2014-9-29
*
* @version 1.0
*
*/
require_once "Database_interface.php";
/**
*
*/
class Mysql_db implements Database_Interface
{
/**
* 資料庫連線標識
* @var resource
* @access protected
*/
protected $_dbConnect = null;
/**
* 資料庫查詢結果集
* @var resource
* @access protected
*/
protected $_result = null;
/**
* 插入語句最後執行的最後自增索引值
* @var integer
* @access public
*/
public $insertId = 1;
/**
* isAssocArray()
* @param array $arr 待判斷的陣列
* @return boolean 若陣列為關聯陣列,返回TRUE,否則返回FALSE
*/
static public function isAssocArray($arr)
{
return array_keys($arr) !== range(0,count($arr)-1);
}
/**
* __construct
* @param string $dbname 傳入的資料庫的名稱(可選引數,預設為usr資料庫)
* @param string $dbhost 傳入的資料庫的伺服器地址(可選引數,預設為127.0.0.1)
* @param string $dbuser 傳入的資料庫賬戶名(可選引數,預設為root)
* @param string $dbpwd 傳入的資料庫賬戶名所對應的賬戶密碼(可選引數,預設為***)
*/
public function __construct($dbname = `usr`,$dbhost = `127.0.0.1`,
$dbuser = `root`,$dbpwd = `***`)
{
$this->_dbConnect = @mysql_connect($dbhost, $dduser, $dbpwd);
//連線資料庫
if (false == $this->_dbConnect) {
throw new Exception("資料庫連線錯誤".mysql_error());
}
//選擇資料庫
if (!@mysql_select_db($dbname,$this->_dbConnect)) {
throw new Exception("資料庫選擇錯誤" . mysql_error());
}
//設定字元編碼
$this->setCharset();
}
/**
* __destruct
*
*解構函式,釋放結果集資源
*@return nulll
*
*/
public function __destruct(){
//釋放結果集
$this->freeResult();
//關閉資料庫連線
if ($this->_dbConnect) {
mysql_close($this->_dbConnect);
}
}
/**
* select
*
* 獲得資料表中所有滿足特定條件的記錄
*
* @param string $tableName 必要引數,待查詢的資料表
* @param array $condition 查詢條件(可選引數,為一關聯陣列,預設為null )
* @param int $recordBegin 從某項記錄開始查詢(可選引數,預設情況為0,從第一條記錄開始查詢)
* @param int $recordLength 待查詢記錄的個數(可選引數,預設情況為所有記錄)
* @param string $sortCol 待排序的欄位名(可選引數,預設情況為不排序)
* @param boolean $desc 是否為降序排序(可選引數,預設為升序排序)
* @return array 有結果集組成的二維陣列(每個元素為關聯陣列,代表一條記錄)
*/
public function select($tableName, Array $condition = null,
$recordBegin = 0,$recordLength = 0,$sortCol = null,
$desc = false)
{
//構造SQL 語句
$sql = "SELECT * FROM {$tableName}";
//傳入的條件引數為真並且是關聯陣列
if ($condition) {
if (!self::isAssocArray($condition)) {
//若不是關聯陣列
throw new Exception(`必須傳入一個關聯陣列的條件`);
}else{
//遍歷條件陣列,構造條件語句
$sql .= $this->generateWhere($condition);
}
}
//處理是否排序
if ($sortCol) {
$sql .= " ORDER BY {$sortCol}";
}
//處理是否降序
if ($desc) {
$sql .= " DESC";
}
//處理記錄的個數 (若處理的記錄個數不為 0)
if (0 != $recordLength) {
$sql .= " limit {$recordBegin} ,{$recordLength}";
}else if(0 != $recordBegin){
$sql .= " limit {$recordBegin}";
}
//執行SQL 語句
$this->_result = @mysql_query($sql);
if (!$this->_result) {
throw new Exception("執行SQL語句出錯". mysql_error());
}
//獲得查詢結果
$rows = array();
while ($row = mysql_fetch_assoc($this->_result)) {
$rows[] = $row;
}
//釋放結果集
$this->freeResult();
//返回結果集組成的關聯陣列
return $rows;
}
public function delete($tableName ,Array $condition)
{
//構造SQL語句
$query = "DELETE FROM {$tableName} ";
//由條件陣列,構造刪除條件
if (!self::isAssocArray($condition)) {
//若不是關聯陣列
throw new Exception("必須傳入一個關聯陣列的條件");
}else{
$query .= $this->generateWhere($condition);
}
//執行SQL語句
$result = @mysql_query($query);
if (!$this->_result) {
throw new Exception("執行SQL語句出錯".mysql_error());
}
//返回受影響個數
return mysql_affected_rows();
}
/**
* insert()
* @param string $tableName 待插入的資料表名
* @param Array $records 帶插入的記錄所組成的二維陣列
* @return int 所受影響的行數
*/
public function insert($tableName, Array $records)
{
//構造SQL語句
$query = "INSERT INTO {$tableName} VALUES";
//待處理插入的記錄陣列
$query .= ` (`;
foreach($records as $red){
//處理每一條插入記錄
//生成記錄資訊
foreach($red as $value){
if (is_string($value) && $value !== `null`
&& $value !== `now()` ) {
$query .= "`{$value}`,";
}else{
$query .= "{$value}, ";
}
}
//除去value的最後 字元連線 ,
$query = rtrim($query, `,`);
//資料項SQL 語句的閉合
$query .= `), (`;
}
$query .= `)`;
$query = rtrim(rtrim(rtrim($query, `()`)), `,`);
//echo $query;
//echo "<br/>";
//執行SQL 語句
$this->_result = @mysql_query($query);
if(!$this->_result){
throw new Exception("插入SQL 語句出錯". mysql_error());
}
//獲得插入記錄的最大自增索引
$this->insertId = @mysql_insert_id();
//返回受影響的個數
return mysql_affected_rows();
}
public function update($tableName,Array $condition, Array $newRecord)
{
//構造SQL語句
$query = "UPDATE {$tableName} SET ";
//
if (!self :: isAssocArray($newRecord)) {
throw new Exception(`記錄的新值必須傳入一個關聯陣列的條件`);
} else {
//生成記錄資訊
foreach ($newRecord as $key => $value) {
$nKey = " {$key} = ";
if (is_string($value) &&
($value !== `null`) && ($value !== `now()`)) { //若$value為字串
$nKey .= "`{$value}`,";
} else {
$nKey .= "{$value},";
}
}
$nKey = rtrim($nKey, `,`);
$query .= $nKey;
}
//由傳入的條件陣列,構造更新條件
if (!self :: isAssocArray($condition)){ //若不為關聯陣列
throw new Exception(`必須傳入一個關聯陣列的條件`);
} else {
$query .= $this->generWhere($condition);
}
//執行SQL語句
$result = @mysql_query($query);
if (!$this->_result) {
throw new Exception(`執行SQL語句出錯.` . mysql_error());
}
//返回受影響個數
return mysql_affected_rows();
}
/**
* selectAll()
*
* 獲得資料表中的所有記錄的所有欄位
*
* @param string $tableName 待查詢的資料表名
* @return array 所有記錄組成的一個二維陣列(每個元素為一個關聯陣列,代表一條記錄)
*/
public function selectAll($tableName)
{
return $this->select($tableName);
}
/**
* selectById
*
* 通過主鍵獲得某一條記錄,主鍵由可選引數傳入
*
* @param string $tableName 資料表名
* @param integer $id 獲得記錄的主鍵ID值 (可選引數預設值ID為1)
* @param string $key 主鍵的欄位名(可選引數,預設為ID)
* @return array 所獲得記錄產生的關聯陣列
*/
public function selectById($tableName, $id = 1,$key = `id`)
{
//構造query語句
$query = "SELECT * FROM {$tableName} WHERE {$key} = {$id}";
//執行SQL 語句
$this->_result = @mysql_query($query);
if (!$this->_result) {
throw new Exception("執行主鍵查詢出錯".mysql_error());
}
//獲得查詢結果
if (1 != @mysql_num_rows($this->_result)) {
throw new Exception("主鍵記錄查詢出現多條" . mysql_error());
}
$rows = mysql_fetch_assoc($this->_result);
//釋放結果集
$this->freeResult();
//返回結果集組成的關聯陣列
return $rows;
}
/**
* selectBySql()
*
* 通過傳入的SQL語句,獲得查詢結果
*
* @param string $query 待查詢的SQL語句
* @return array $rows 所有記錄組成的一個二維陣列(每個元素為關聯陣列,代表一條記錄)
*/
public function selectBySql($query)
{
//執行SQL語句
$this->_result = @mysql_query($query);
if (!$this->_result) {
throw new Exception(`執行SQL語句出錯.` . mysql_error());
}
//獲得查詢結果
$rows = array();
while ($row = mysql_fetch_assoc($this->_result)) {
$rows[] = $row;
}
//釋放結果集
$this->freeResult();
//返回結果集組成的關聯陣列
return $rows;
}
/**
* setCharset
*
* 設定Mysql資料庫顯示字元編碼,由傳入引數決定字元編碼
*
* @param string $charset 待設定的字元編碼(可選引數,預設為UTF8)
* @return null 無
*/
private function setCharset($charset = `UTF-8`)
{
if ($this->_dbConnect) {
mysql_query("set names {$charset}",$this->_dbConnect);
}
}
/**
* generateWhere()
*由傳入的條件陣列,構造where子句
*
* @param Array $condition 由條件語句組成的關聯陣列的
* @return string 構造生成的Where語句字串
*/
private function generateWhere(Array $condition)
{
$con = "WHERE";
foreach($condition as $key => $value){
if (is_string($value)) {
$con .= "{$key} = `{$value}` and";
}else{
$con .= "{$key} = {$value}";
}
}
$con = rtrim($con ,`and`);
return $con;
}
/**
* freeResult
*
* 釋放MySQL結果集資源
*
* @param null 無
* @return null 無
*/
public function freeResult()
{
if ($this->_result) {
if (!@mysql_free_result($this->_result)) {
throw new Exception("釋放結果集出錯" . mysql_error());
}
$this->_result = null;
}
}
}