MySQL PDO对象:如何用php操作不同的数据库

1. singleton

目的:为了在全局获取这个类的对象时总是能获取到唯一的对象

class DBConnectionSingleton{
		private static $con = null;		//通过私有+静态声明单例对象
		//function __construct(){}
		public static function getcon(){
			if(!self::$con){				//通过静态执行一次的特点保证对象唯一性
     //非假=真。当self::$con==null时
				self::$con = new self();
			}
			return self::$con;
		}
	}
$con1 = DBConnectionSingleton::getcon();
$con2 = DBConnectionSingleton::getcon();chang'lian

2. PDO与DB:pdo可以作为工具管理不同的数据库

PDO即PHP数据对象 (PHP Data Object)
语法:$pdo = new PDO("DB名:host=主机名;dbname=DB名","DB账号","DB密码");
固定格式:

 try{
			$pdo  = new PDO("mysql:host=localhost;dbname=frankdb","root","");
	   }catch(PDOException $e){
			echo "错误";
			echo $e->getMessage();
	   }

3. singleton获取PDO

目的:同一时刻,只有唯一一个人通过pdo操作数据库

class PDOSingleton{
	private static $pdo = null;
	function __construct(){
		if(!self::$pdo){
			try{
				$pdo  = new PDO("mysql:host=localhost;dbname=frankdb","root","");
			}catch(PDOException $e){
				echo $e->getMessage();
			}		
		}
		return self::$pdo;
	}
	//提供单例方法以获得全局唯一的单例对象
	public static function getpdo(){
		if(!self::$pdo){
			 try{
				$pdo  = new PDO("mysql:host=localhost;dbname=frankdb","root","");
			}catch(PDOException $e){
				echo $e->getMessage();
			}
		}
		return self::$pdo;
	}
}

注意:singleton获取PDO的php文件可以单独写出来,然后用require_once调用

4. PDO实现DB增删改查

 require_once 'singletonPDO.php';
    $pdo=singletonPDO::getPdo(); 	//通过单例方法获取全局pdo单例对象
    $pdo->exec('set names utf8');   //编码格式,exec()方法是pdo对象的执行方法,
									                 相当于php中的query()方法.
 
   //pdo增删改语句
    $sql ="insert into userinfolist values ('xiaoming','666')";
    $sql="delete from userinfolist where userName='xiaoming'";
    $sql="update userinfolist set userName='frank',password='456789' where userName='franky'  ";
    if ($pdo->exec($sql)){
    echo '操作成功';
    }else{
    echo '操作失败';
    }

5. PDO异常处理Exception:解决bug

echo "<pre>";
    //第一类异常,连接异常
    //这种异常直接通过try catch捕获
    try{
        $pdo=new PDO('mysql:host=localhost;dbname=day2db','root','');
        // 第二类异常,第二种处理方法
        // 设置当数据库操作发生异常的时候,弹出警报,但程序执行不会中断
        //$pdo -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);

        // 第二类异常,第三种处理方法
        // 设置当数据库操作发生异常的时候,进行中断
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    }catch (PDOException $err){
        echo 'db连接失败,原因是'.$err->getMessage();
    }

    $pdo->exec('set names utf8');
    $sql="update userinfolist set userName='frank',password='11111' where userName='frank'";

    if ($pdo->exec($sql)){
        echo '操作成功';
    }else{
        //第二类异常:数据库操作异常
        //第一种处理办法:直接通过系统提供的errorCode和errorInfo属性实现
        echo '操作失败';
        //echo $pdo->errorCode();
        //echo $pdo->errorInfo();
    }

6. PDO预处理prepare:读取数据和习惯上的传参方法

1.prepare&execute方法

    require_once 'singletonPDO.php';
    $pdo=singletonPDO::getPdo();
    $pdo->exec('set names utf8');
    //半成品的sql语句
    //只能由prepare的预处理语句执行
    $sql="insert into userinfolist value (?,?)";
    $halPro=$pdo->prepare($sql);
    //将半成品通过execut方法传入参数,变成成品
    $result=$halPro->execute(['xiaoming','666']);
    var_dump($result);

2.bindColumn:用于读取数据

 require_once 'singletonPDO.php';
    $pdo=singletonPDO::getPdo();
    $pdo->exec('set names utf8');

    $sql="select * from userinfolist where 1";
    $halPro=$pdo->prepare($sql);
    $halPro->execute();

    //将结果中的内容绑定在指定的变量上
    $halPro->bindColumn(1,$uname);
    $halPro->bindColumn(1,$upass);

    //读取检索结果
    $info=[];
    //$halPro->fetch(PDO::FETCH_COLUMN)
    //作用时遍历结果中的每一条数据,直到最后一条为止
    for ($i=0;$halPro->fetch(PDO::FETCH_COLUMN);$i++){
        $info[$i]=array('userName'=>$uname,'password'=>$upass);
    }
    print_r($info);

3.bindValue()方法:一种灵活的传参方法

 echo "<pre>";
    require_once 'singletonPDO.php';
    $pdo=singletonPDO::getPdo();
    $pdo->exec('set names utf8');

    $sql="insert into userinfolist value (?,?)";
    $halPro=$pdo->prepare($sql);

    //在prepare()方法和execute()方法之间,对sql语句中的?传至
    //提供一种更灵活的方式来编辑sql语句
    $halPro->bindValue(1,'xiaohong');
    $halPro->bindValue(2,'8888');

    //习惯上execute()不传参,仅执行
    echo $halPro->execute();

7. PDO事务处理transaction:保护数据库

事务:多个事件组成的结构。
事件:事件实际上就是预处理语句执行的execute语句。
注意:
(1)整个事务操作必须放到try…catch中,这是因为我们并不能保证执行的事件一定成功。
而对于整个事务而言,任何一个事件的失败都会导致catch的触发。
而catch触发就意味着必须将之前做出的所有的操作都必须还原
回滚操作:$pdo->rollBack()

(2)操作语句必须在事务开启之后执行,在事务提交之前停止.
开启事务:$pdo->beginTransaction();
关闭事务:$pdo->commit();

(3)中文处理方案(避免乱码):
读取:$pdo ->query("set names utf8");
插入:$pdo ->exec('set names utf8');
<?php
require_once ‘singletonPDO.php’;
$pdo=singletonPDO::getPdo();
$pdo->exec(‘set names utf8’);

try{
    //开启事务处理
    $pdo->beginTransaction();
    //创建一个修改sql语句
    $sql = "update userinfolist set userName=?,password=? where userName=?";
    $halfPro = $pdo->prepare($sql);

    //执行第一条execute语句(第一个事件)
    $halfPro->execute(['frank','333','franky']);
    //执行第二条execute语句(第二个事件)
    $halfPro->execute(['lileilei','11111']);

    //当事件出现问题时,中止操作。向singletonPDO.php添加异常事件的处理语句
    //提交事务
    $pdo->commit();
}catch(PDOException $e){
    $pdo->rollBack();    //回滚操作
    echo '事务处理失败,数据库回滚到事务开始之前的状态,没有受到任何影响';
}


?>

猜你喜欢

转载自blog.csdn.net/weixin_43187545/article/details/83757237