PHP使用PDO操作mysql-张柏沛IT博客

正文内容

PHP使用PDO操作mysql

栏目:PHP 发布时间:2020-01-19 16:18 浏览量:181

1.pdo连接数据库(初始化):

$pdo=new PDO("mysql:host=localhost;dbname=库名","用户名","密码");

2.执行增删改:

$res=$pdo->exec("增删改的操作语句");
返回的是影响条数,如果没影响返回0

$id=$pdo->lastInsertId();
获取最后一条插入的id

3.执行查询

$obj=$pdo->query("select * from A");
遍历该$obj对象可获取数据

4.预处理

$pdoStm=$pdo->prepare($sql);
$res=$obj->execute();    //返回bool

$pdoStm->fetch(PDO::FETCH_ASSOC);    //获取查询结果中的一行,要配合while
$pdoStm->fetchAll(PDO::FETCH_ASSOC);    //获取所有数据,是个二维数组

$pdoStm->setFetchMode(PDO::FETCH_ASSOC);    //设置获取数据的形式是关联数组

5.占位符的使用
a.
$sql="select * from user where name=:name and password=:password";    //占位符不用加引号

$pdoStm=$pdo->prepare($sql);
$pdo->execute([':name'=>xxx,':password'=>xxx]);

另一种形式的占位符

使用占位符可以解决sql注入的问题
$sql="select * from user where name=? and password=?";

$pdoStm=$pdo->prepare($sql);
$pdo->execute([xxx,xxx]);

b.使用bindParam()方法绑定参数到占位符
$sql="insert into user values (null,:name,:password);
$pdoStm=$pdo->prepare($sql);
$pdoStm->bindParam(":name",$name,PDO::PARAM_STR);
$pdoStm->bindParam(":password",$password,PDO::PARAM_STR);
$name="aaa";
$password="bb";
$pdoStm->execute();

//如果还想插入一条数据
$user="xxx";
$password="mm";
$pdoStm->execute();

使用?占位则$pdoStm->bindParam(1,$user);$pdoStm->bindParam(2,$password);

bindValue()用法和bindParam()一样,区别是后者是引用传值,传给占位符的值必须是变量不能是值
而bindValue()可以是值,它不是引用传值的机制
$pdoStm->bindParam(":name","zbp"); 是错的

6.错误信息
$pdo->errorInfo()
或者
$pdoStm->errorInfo()

返回的是一个索引数组,第一个元素是错误码,00000表示没有错误;第二个元素是错误信息


最后贴出来一个自定义的PDO类:

<?php
	
	class PdoMysql
	{
		private static $config=[];	//设置配置信息
		
		private static $link=null;	//保存链接标识符
		
		private static $PDOStatement=null;	//保存PDOStatement对象
		
		private static $queryStr='';		//保存最近一条sql语句
		
		private static $error='';			//保存错误信息
		
		private static $lastInsertId=0;		//保存最后一条插入的ID
		
		private static $effectedRow=0;		//保存增删改时,受影响条数
		
		public function __construct($configPath,$dbConfig=""){
			if(!class_exists("PDO")){
				self::throw_exception("不支持PDO,请先开启");
			}
			
			if(!empty($configPath)){
				require($configPath);
				$dbConfig=[
					"username"=>DB_USER,
					"password"=>DB_PWD,
					"dsn"=>DB_TYPE.":host=".DB_HOST.";dbname=".DB_NAME
				];
			}
			
			self::$config=$dbConfig;
			
			if(!self::$link){	//单例模式
				$configs=self::$config;
				
				try{
					self::$link=new PDO($configs['dsn'],$configs['username'],$configs['password']);
				}catch(PDOException $e){
					self::throw_exception($e->getMessage());
				}
				
				if(!self::$link){	
					self::throw_exception("PDO连接错误");
					return false;
				}
				
				// self::$link->exec("set character_set_server=".DB_CHARSET);	//这一句的含义是建表的时候,表是utf8还是gbk,一般在php中操作数据库时,表已经建好,所以没必要使用这句话
				self::$link->exec("set names ".DB_CHARSET);	//这句是写入数据的时候,写入的是utf8的数据还是gbk的
			}
		}
		
		/*
		*	获取所有记录
		*/
		public static function getAll($sql=null){
			if($sql){
				self::query($sql);
				$res=self::$PDOStatement->fetchAll(PDO::FETCH_ASSOC);
				return $res;
			}
			
			self::throw_exception("sql语句为空");
			return false;
		}
		
		/*
		*	获取一条记录
		*/
		public static function getRow($sql=''){
			if($sql){
				self::query($sql);
				$res=self::$PDOStatement->fetch(PDO::FETCH_ASSOC);
				return $res;
			}
			
			self::throw_exception("sql语句为空");
			return false;
		}
		
		/*
		*	根据主键查询
		*/
		public static function findById($table,$id,$fields='*'){
			$sql="select %s from %s where id=%d";
			$sql=sprintf($sql,self::parseFields($fields),$table,$id);
			return self::getRow($sql);
		}
		
		/*
		*	根据条件查询
		*/
		public static function find($table,$fields='*',$condition=['where'=>'','group'=>[],'having'=>'','order'=>'',"limit"=>[]]){
			$sql='select '.self::parseFields($fields).' from '.$table;
			
			if(!empty($condition['where'])){
				$sql.=self::where($condition['where']);
			}
			
			if(!empty($condition['group'])){
				$sql.=self::group($condition['group']);
			}
			
			if(!empty($condition['having'])){
				$sql.=self::having($condition['having']);
			}
			
			if(!empty($condition['order'])){
				$sql.=self::order($condition['order']);
			}
			
			if(!empty($condition['limit'])){
				$sql.=self::limit($condition['limit']);
			}
				
			$res=self::getAll($sql);
			
			return $res;
		}
		
		/*
		*	$data为键值对数组
		*/
		public static function add($table,$data=[]){
			if(!$data){
				self::throw_exception("传入数据不可为空");
				return false;
			}
			
			foreach($data as $k=>$v){
				$key[]='`'.$k.'`';
				$value[]="'".$v."'";
			}
			
			$sql="insert into {$table} (".implode(",",$key).") values (".implode(",",$value).")";
			$res=self::execute($sql);
			
			return $res;
		}
		
		/*
		*	更新数据,要有条件:update 表明 set xxx='xxx',... where ...
		*/
		public static function update($table,$data=[],$where=''){
			if(!$data){
				self::throw_exception("传入数据不可为空");
				return false;
			}
			
			$dataStr="";
			foreach($data as $k=>$v){
				$dataStr.="`".$k."`='".$v."',";
			}
			$dataStr=rtrim($dataStr,",");
			
			$sql="update {$table} set ".$dataStr.self::where($where);
			$res=self::execute($sql);
			
			return $res;
		}
		
		/*
		*	删除数据,要有条件
		*/
		public static function delete($table,$where=''){
			if(!$where){
				self::throw_exception("删除数据必须有条件");
				return false;
			}
			
			$sql="delete from {$table} ".self::where($where);
			$res=self::execute($sql);
			
			return $res;
		}
		
		/*
		*	获取插入的最后一条的id
		*/
		public static function getLastInsertId(){
			return self::$lastInsertId;
		}
		
		/*
		*	获取总记录数
		*/
		public static function getRowNum($table){
			$sql="select count(*) from {$table}";
			$num=self::$PDOStatement->fetchColumn(0);
			return $num;
			
		}
		
		/*
		*	用于完成查询操作
		*/
		public static function query($sql=''){
			$link=self::$link;
			
			//判断之前是否有结果集,如果有则释放一下结果集
			if(!empty(self::$PDOStatement)){
				self::free();
			}
			
			self::$queryStr=$sql;
			self::$PDOStatement=$link->prepare(self::$queryStr);
			$res=self::$PDOStatement->execute();
			self::haveErrorThrowException();
			return $res;
			
		}
		
		private static function parseFields($fields){
			if(is_array($fields)){
				foreach($fields as $k=>$v){
					$fields[$k]="`".$v."`";
				}
				$fieldsStr=implode(',',$fields);
			}else{
				if(!$fields){
					$fields="*";
				}
				$fieldsStr=$fields;
			}
			
			return $fieldsStr;
		}
		
		/*
		*	$where只允许是字符串
		*/
		private static function where($where=''){
			$whereStr="";
			if(is_string($where) && trim($where)){
				$whereStr=" where ".$where;
			}
			
			return $whereStr;
		}
		
		/*
		*	$group可以是字符串或者数组
		*/
		private static function group($group=[]){
			$groupStr="";
			if(is_array($group) && count($group)){
				$groupStr=" group by ";
				foreach($group as $k=>$v){
					$group[$k]="`".$v."`";
				}
				$groupStr.=implode(",",$group);
			}elseif(is_string($group) && trim($group)){
				$groupStr=" group by ".$group;
			}
			
			return $groupStr;
		}
		
		/*
		*	having只允许是字符串
		*/
		private static function having($having=''){
			$havingStr="";
			if(is_string($having) && trim($having)){
				$havingStr=" having ".$having;
			}
			
			return $havingStr;
		}
		
		/*
		*	$order只允许是字符串
		*/
		private static function order($order=''){
			$orderStr="";
			if(is_string($order) && trim($order)){
				$orderStr=" order by ".$order;
			}
			
			return $orderStr;
		}
		
		/*
		*	$limit可以是字符串或者数组
		*/
		private static function limit($limit=[]){
			$limitStr="";
			if(is_array($limit)){
				$num=count($limit);
				switch($num){
					case 1:$limitStr=" limit ".$limit[0];break;
					case 2:$limitStr=" limit ".$limit[0].",".$limit[1];break;
					default:$limitStr="";
				}
			}elseif((is_string($limit) && trim($limit)) || is_numeric($limit)){
				$limitStr=" limit ".$limit;
			}
			
			return $limitStr;
		}
		/*
		*	用于完成增删改操作
		*/
		public static function execute($sql=''){
			$link=self::$link;
			self::$queryStr=$sql;
			if(self::$PDOStatement){	//其实增删改和PDOStatement对象没什么关系,但保险起见还是删一下的好
				self:free();
			}
			$res=$link->exec($sql);
			self::haveErrorThrowException();
			if($res!==false){
				self::$lastInsertId=$link->lastInsertId();	//如果执行的不是插入操作,则返回0
				self::$effectedRow=$res;	//受影响的条数
				return $res;
			}else{
				return false;
			}
		}
		
		private static function haveErrorThrowException(){
			$obj=empty(self::$PDOStatement)?self::$link:self::$PDOStatement;
			$arrError=$obj->errorInfo();
			if($arrError[0]!='00000'){
				self::$error='SQLSTATE '.$arrError[0].'; SQL Error '.$arrError[2].'<br/>Error SQL : '.self::$queryStr;
				self::throw_exception(self::$error);
				return false;
			}
			
		}
		
		/*
		*	释放结果集 
		*/
		private static function free(){
			self::$PDOStatement=null;
		}
		
		private static function throw_exception($errMsg){
			echo "<div style='width:80%;background-color:#ABCDEF;color:black;font-size:18px;padding:20px;margin:20px'>"
				.$errMsg.
				"</div>";
		}
	}
	
?>


代码段 小部件

如果您需要转载,可以点击下方按钮可以进行复制粘贴;本站博客文章为原创,请转载时注明以下信息

张柏沛IT技术博客 > PHP使用PDO操作mysql

热门推荐
推荐新闻