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 '事务处理失败,数据库回滚到事务开始之前的状态,没有受到任何影响';
}
?>