使用PDO自写的一个MYSQL操作类

留个脚印


<?php
class pdodb{
	//public protected private
	//本类,不执行SQL命令是不会建立连接的.
	//并且执行后有关闭连接清空结果的操作.
	private $pdodb;//连接
	private $res;//远程结果对象
	public $arr;//本地结果数组
	
	private $cs=array(//连接数组
		'host'       =>'127.0.0.1',
		'port'       =>'3306',
		'username'   =>'root',
		'password'   =>'',
		'dbname'     =>'mysql',
		'charset'    =>'utf8',
	);

	//*********************************
	//***************单例化************
	//*********************************
	//三私一公
	private function __construct(){}//令new()新对象失效
	private function __clone(){}//令克隆对象失效.

	private static $db;//单例对像属性
	
	public static function getdb($arr=null)//单例对象入口
	{
		if(!isset(self::$db))
		{
			self::$db=new self();
			if($arr){
				if(isset($arr['host']))self::$db->cs['host']=$arr['host'];
				if(isset($arr['port']))self::$db->cs['port']=$arr['port'];
				if(isset($arr['username']))self::$db->cs['username']=$arr['username'];
				if(isset($arr['password']))self::$db->cs['password']=$arr['password'];
				if(isset($arr['dbname']))self::$db->cs['dbname']=$arr['dbname'];
				if(isset($arr['charset']))self::$db->cs['charset']=$arr['charset'];	
			}
		}
		return self::$db;
	}

	//连接
	private function connect(){
		//
		//连接信息
		$dsn="mysql:host=".$this->cs['host'].//主机
			 ";port=".$this->cs['port'].//端口
			 ";dbname=".$this->cs['dbname'];//数据库名
		//登录名和密码
		$username=$this->cs['username'];
		$password=$this->cs['password'];

		//连接操作
		try{
			$this->pdodb = new PDO($dsn,$username,$password);
		}catch (PDOException $e) {
			echo "<br>Connection failed error:new PDO()---PDO:58 ";
			echo "<br>". $e->getMessage() ;
			die("<br>STOP!!!");
		}
		return $this->pdodb;
	}

	//设置字符集
	private function charset($char='utf8'){
		$this->pdodb->query("set names ".$char);
	}
	//USE数据库
	private function usedb($dbname='mysql'){
		$this->pdodb->query("use ".$dbname);
	}
	//数据库准备
	private function ready(){
		$this->charset($this->cs['charset']);
		$this->usedb($this->cs['dbname']);
	}
	//执行SQL命令
	//$sql---命令:string   
	//$erro----报错开关:任意不是NULL的值0123....
	private function query($sql,$erro=null){
		$this->connect();
		$this->ready();
		$this->res = $this->pdodb->query($sql);
		if($erro!==null){
			if(!$this->res){
				$error=$this->pdodb->errorInfo();
				echo "<br>****************************";
				echo "<br>执行失败";
				echo "<br>命令:".$sql;
				echo "<br>客户代码:".$error[0];
				echo "<br>错误代码:".$error[1];
				echo "<br>错误信息:".$error[2];
				echo "<br>****************************";
				die("<br>STOP!!!");
			}
		}
		return $this->res;
	}
	//公开的有返回的命令执行
	//返回结果保存在$this-arr
	//结果类型 array  true/false  三种
	//参数:
	//$sql---MYSQL命令
	//$index---返回数据的下标类型,默认为字段下标
	//         类型: 'n'---数值下标
	//               'a'---字段下标
	//               'b'---数值/字段(两种)双下标
	public function queryarr($sql=null,$index='a'){
		
		
		if($sql==null){return $this->arr=false;}
		//$r=$this->query($sql,0);//加第二个参数打开报错
		$this->query($sql);
		//结果对象只有三种情况
		//1.正确执行,但没有返回结果集.---布尔值:true
		//2.执行失败---布尔值:false
		//3.正确执行,有返回结果,返回一个对象----对象:object
		//可以从对象中取出结果存入本地的数组
		//注意一种情况,就是返回空数组.array{}
		if($this->res===true){
			$this->arr=true;
		}else{
			if($this->res===false){
				$this->arr=false;
			}else{
				//取得全部数据 三类下标
				switch ($index) {
					case 'a':
						$this->arr=$this->res->fetchAll(PDO::FETCH_ASSOC);//字段下标
						break;
					case 'n':
						$this->arr=$this->res->fetchAll(PDO::FETCH_NUM);//数值下标
						break;
					case 'b':
						$this->arr=$this->res->fetchAll();//双下标
						break;	
				}
				$this->res->closeCursor();//释放结果对象
			}
		}
		//$this->pdodb->close();//关闭连接对象
		$this->pdodb=null;//复位 PDO关闭连接对象的办法
		$this->res=null;//复位 释放结果后,对象还是存在的.所以要复位
		return $this->arr;
	}

	//**********************
	//纯输出数据到表格table
	public function tab($arr)
	{
		if($arr===true)$arr=array(array("true"));
		if($arr===false)$arr=array(array("false"));
		if($arr===null)$arr=array(array("null"));

		echo "<table border='1'>";
		foreach($arr as $k1=>$v1)
		{				
			//**********************
			//表头
			if($k1==0)
			{
				echo "<tr>";
				foreach($v1 as $k2=>$v2)
				{
					
					echo "<th>";
					echo $k2;
					echo "</th>";
				}
				echo "</tr>";
			}
			//**********************
			//内容
			echo "<tr>";
			foreach($v1 as $k2=>$v2)
			{
				
				echo "<td>";
				echo $v2;
				echo "</td>";
			}
			echo "</tr>";
		}
		echo "</table>";
	}

	//SQL字符转义(防止SQL注入)----此处好像有些多余,但并不是.
	public function quote($str){
		$this->connect();
		$s=$this->pdodb->quote($str);
		$this->pdodb=null;//断开数据库服务器的连接
		return $s;
	}

	public function getall($sql=null,$index='a'){
		$a=$this->queryarr($sql,$index);
		return $a;
	}

	public function getrow($sql=null,$index='a'){
		$a=$this->queryarr($sql,$index);
		return $a;
	}

	public function getone($sql=null,$index='n'){
		$a=$this->queryarr($sql,$index);

		if($a===true)return $a;
		if($a===false)return $a;
		if($a==null)return null;
		return $a[0][0];
	}


	//测试
	public function test(){
		/*
		$a=123;
		$b=$this->quote($a);
		echo "<br>asdg asdf $b";
		*/
		//$sql="select session_content from session where session_id='$sess_id'";
		//增
		//$sql="replace into session values('abcd','cccc',unix_timestamp())";
		//$sql="replace into session values('aaaa','cccc',unix_timestamp())";
		//$sql="insert into session values('abcd11','cccc1',unix_timestamp())";
		//$sql="select * from session where session_id='abcd'";
		//$sql="select * from session where session_id='abcd222'";
		//$sql="set a=1";
		$sql="select * from session ";
		//$sql="select * from session where session_id='777'";
		//$sql="select * from session";
		//$sql=null;
		//$this->query($sql,0);
		$this->queryarr($sql);

		//$a=$this->res->fetchAll(PDO::FETCH_ASSOC);//字段下标

		//$this->connect();
		//echo "<pre>";
		//var_dump($this->pdodb);
		//var_dump($this->res);
		//var_dump($this->arr);
		//var_dump($a);
		//echo "</pre>";

		$this->tab($this->arr);
		
	}
}

/*
$cs=array(//连接数组
	'host'       =>'127.0.0.1',
	'port'       =>'3306',
	'username'   =>'ddv1999',
	'password'   =>'1234abcd',
	'dbname'     =>'ddv1999',
	'charset'    =>'utf8',
);

$op1=pdodb::getdb($cs);
//echo "<pre>";
//var_dump($op1);
//echo "</pre>";

$op1->test();
*/

猜你喜欢

转载自blog.csdn.net/ddv1999/article/details/80167064