單例模式 封裝PHP的mysql類
阿新 • • 發佈:2019-02-13
<?php
/*
*describe:單例模式 資料庫類
單例模式的必要條件
(1)私有的構造方法-為了防止在類外使用new關鍵字例項化物件
(2)私有的成員屬性-為了防止在類外引入這個存放物件的屬性
(3)私有的克隆方法-為了防止在類外通過clone成生另一個物件
(4)公有的靜態方法-為了讓使用者進行例項化物件的操作
*/
header("content-type:text/html;charset=utf-8");
final class DB{
private $charset = "utf8" ; //字串編碼
private $link = NULL; //資料庫連線
private static $instance = NULL; //儲存物件
//初始化
private function __construct($hostfield,$userfield,$password,$datebase){
$this->link = mysqli_connect($hostfield,$userfield,$password,$datebase);
if (!$this->link){
die("連線失敗: " . mysqli_connect_error());
}
mysqli_query($this->link,"SET fieldS ".$this->charset);
return $this->link;
}
//防止克隆
private function __clone(){}
//靜態公共介面
public static function getInstance($hostfield,$userfield,$password,$datebase){
if(!self::$instance instanceof self){
self::$instance = new DB($hostfield,$userfield,$password,$datebase);
}
return self::$instance;
}
/*
*describe:查詢單個欄位
*@param $field type:string 傳入需要篩選的欄位
*@param $table_name type:string 需要查詢的表名
*@param $where type:array 需要篩選的where條件
*/
public function getField($field="",$table_name="",$where=""){
$where_string = "";
//where條件
$where_string = $this->getWhere($where);
if(is_string($field)){
//組裝sql
$sql = "SELECT {$field} FROM {$table_name} WHERE {$where_string}";
$result = mysqli_query($this->link,$sql);
while($res = mysqli_fetch_array($result,MYSQL_ASSOC)){
$info[] = $res;
}
//若只有一個數組,則返回一維陣列
if(count($info)==1){
return $info[0];
}else{
return $info;
}
}
}
/*
*describe:查詢單條語句
*@param $sql 查詢語句
*@param $type 返回陣列的型別
* MYSQL_ASSOC - 關聯陣列(預設)
* MYSQL_NUM - 數字陣列
* MYSQL_BOTH -同時產生關聯和數字陣列
*/
public function getRow($sql,$type=MYSQL_ASSOC){
$result = mysqli_query($this->link,$sql);
$res = mysqli_fetch_array($result,$type);
return $res;
}
/*
*describe:查詢多條語句
*@param $sql 查詢語句
*@param $type 返回陣列的型別
* MYSQL_ASSOC - 關聯陣列(預設)
* MYSQL_NUM - 數字陣列
* MYSQL_BOTH -同時產生關聯和數字陣列
*/
public function getRows($sql,$type=MYSQL_ASSOC){
$result = mysqli_query($this->link,$sql);
while($rows = mysqli_fetch_array($result,$type)){
$res[] = $rows;
}
return $res;
}
/*
*describe:增加語句
*@param type:array or string $info 傳入的值
若為陣列則進行拼接SQL語句,並新增 返回新增的ID
若傳入的為SQL語句則直接執行,返回新增的ID
*@param $table_name 為需要新增的表名(可選)
*/
public function add($info,$table_name = ""){
//判斷是否為陣列,進行SQL拼接
if(is_array($info)){
$field = "";
$val ="";
$fields = "";
$vals ="";
foreach($info as $k=>$v){
$field .= "`".$k."`,";
$val .= "'".$v."',";
}
//$fields = substr($field,0,strlen($field)-1);
//$vals = substr($val,0,strlen($val)-1);
$fields = trim($field,",");
$vals = trim($val,",");
$sql = "INSERT INTO {$table_name} ({$fields}) VALUES ({$vals})";
if(mysqli_query($this->link,$sql)){
return mysqli_insert_id($this->link);
}else{
echo "error:".$sql."<br/>".mysqli_error($this->link);
}
//判斷是否為SQL語句
}else if(is_string($info)){
if(mysqli_query($this->link,$info)){
return mysqli_insert_id($this->link);
}else{
echo "error:".$info."<br/>".mysqli_error($this->link);
}
}else{
echo "error";
}
}
/*
*describe:更新
*@param type:array $info 傳入的修改的陣列
*@param type:string $table_name 需修改的表名
*@param type:array $where 修改的where條件,傳入陣列
*/
public function update($info,$table_name = "",$where=""){
//判斷是否是陣列,進行SQL拼接
if(is_array($info)){
$field = "";
$fields = "";
//拼接修改語句
foreach($info as $k=>$v){
$field .= "`{$k}`='{$v}',";
}
$fields = trim($field,",");
//拼接where條件
$where_string = "";
$where_string = $this->getWhere($where);
//拼接SQL
$sql = "UPDATE {$table_name} SET {$fields} where {$where_string}";
echo $sql;
die();
if(mysqli_query($this->link,$sql)){
return mysqli_affected_rows($this->link);
}else{
echo "error:".$sql."<br/>".mysqli_error($this->link);
}
}else{
echo "error";
}
}
/*
*describe:刪除
*@param $where type:array 傳入需要刪除的where條件 為陣列
*@param $table_name type:string 需要刪除的表名
*/
public function del($where,$table_name=""){
if(is_array($where)){
$where_string ="";
//拼接where條件
$where_string = $this->getWhere($where);
$sql = "DELETE FROM {$table_name} WHERE {$where_string}";
if(mysqli_query($this->link,$sql)){
return mysqli_affected_rows($this->link);
}else{
echo "error:".$sql."<br/>".mysqli_error($this->link);
}
}else{
echo "error";
}
}
/*
*describe:執行原生sql
*@param $sql type:string 需要執行的sql
*/
public function query($sql){
if(mysqli_query($this->link,$sql)){
return mysqli_affected_rows($this->link);
}else{
echo "error:".$sql."<br/>".mysqli_error($this->link);
}
}
/*
*describe:拼接where條件
*@param $where type:array 傳入where為陣列的條件
*/
private function getWhere($where){
$where_string = "";
if(is_array($where)){
foreach($where as $k=>$v){
if(is_array($v)){
foreach($v as $kk=>$vv){
$where_string .= "`{$k}` {$kk} '{$vv}' AND ";
}
}else{
$where_string .= "`{$k}`='{$v}' AND ";
}
}
}
return rtrim($where_string,"AND ");
}
}
//測試 mysql類
$class = DB::getInstance("localhost","root","123456","test");
$data = array(
"city_name"=>"test12222222",
"pid"=>"111111",
);
$where = array(
"id"=>"438",
"city_name"=>array("like"=>"%test%"),
);
//var_dump($class->query("DELETE FROM city WHERE `city_name` LIKE '%test%'"));
//var_dump($class->add($data,"city"));
//var_dump($class->del($where,"city"));
//var_dump($class->update($data,"city",$where));
//var_dump($class->getField("city_name,pid","city",$where));