PDO 翻译过来叫作数据访问抽象层php
它是一个数据访问的层面,其实是一个类,也就是说全部操做数据库的代码,都是经过这个层面完成的前端
该图好理解大概就是这样一种模式mysql
如今考虑的是能不能使用同一个类,上层代码不用动,使用一个类去操做数据库,我能够根据这个类里边给的一些参数,它来自动切换驱动sql
因此PDO主要就是用来访问其它数据库数据库
它的主要功能:数组
1.操做其它数据库函数
2.事务功能fetch
3.防止SQL注入攻击spa
首先先造PDO对象翻译
$dsn = "mysql:dbname=mydb;host=localhost"; 这是一个数据源
mysql 表明了驱动的名称
冒号后边写链接的参数
写的是数据库名称叫dbname=名称叫mydb
host 表明了数据库地址
$dsn = "mysql:dbname=mydb;host=localhost"; $pdo = new PDO($dsn,"root","123");
这样PDO对象就造好了
接着写SQL语句和执行
$sql = "select * from nation"; $attr = $pdo->query($sql); $arr = $attr->fetch(PDO::FETCH_ASSOC);//参数不须要加单引号双引号 var_dump($arr);
这返回的对象是PDOStatement对象
ASSOC 表明 关联数组
NUM 表明 索引的
BOTH 表明二者都有
OBJ 返回对象
若是sql语句不是查询语句,而是增删改
//添加语句 $sql = "insert into nation values('n076','数据')"; //$a = $pdo->query($sql); //执行查询 //$a = $pdo->exec($sql); //执行其它语句
exec 是指一个单独的函数调用中执行一条SQL语句,返回受此语句影响的行数
不会从一条SELECT语句中返回结果
这些就是PDO访问数据库的基本写法
若是把dsn换掉就能够访问别的数据库了
接下来了解一下事务功能
事务:可以控制语句同时成功同时失败,失败时能够回滚
$dsn = "mysql:dbname=mydb;host=localhost"; $pdo = new PDO($dsn,"root","123"); $sql1 = "insert into nation values('n079','是删')"; $sql2 = "insert into nation values('n077','可爱')"; $pdo->exec($sql1); $pdo->exec($sql2);
n079是在数据里没有的,能够进
n077是在数据里存在的,是失败的,主键重复
执行的时候,若是单纯的执行,我没有加事务的话,应该是一条成功一条失败
如今咱们要加事务让着两条要么一块儿成功,要么一块儿失败,而且把错误的找出来,进行回滚
$dsn = "mysql:dbname=mydb;host=localhost"; $pdo = new PDO($dsn,"root","123"); //设置异常模式 若是出现错误,会抛出一个异常,一抛异常,catch抓住 $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); //加事务 try{ //开启事务 $pdo -> beginTransaction(); //调它开启事务 $sql1 = "insert into nation values('n078','是删')"; $sql2 = "insert into nation values('n077','数据')"; $pdo->exec($sql1); $pdo->exec($sql2); //提交 走到提交的时候可以把事务结束掉 $pdo->commit(); } catch(Exception $e) $e就是异常对象 { $e->getMessage(); //获取异常信息 //回滚 $pdo->rollBack(); } ?>
1.设置异常模式
$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
若是出现错误,会抛出一个异常,抛出异常后,catch抓住
2.加事务 try : 试着执行
try{
先开启事务
$pdo -> beginTransaction(); 调它开启
提交
$pdo->commit(); 走到提交的时候可以把事务结束掉
}
catch : 抓住try里面出现的问题,抓住后执行下面的内容
catch(Exception $e) pdo异常参数 Exception:异常 $e就是异常对象
{
$e->getMessage(); 获取异常信息
回滚
$pdo->rollBack();
}
还有一个是final
是配合着try用的,要么加catch,要么加final,也有可能一块儿
final 是 不管以上try代码是否执行成功,是否有错误,都会最终过来执行它
最后在来看一下 SQL注入攻击
它的表现方式
用户在输入内容的时候,它能够本身拼接一个字符串,来改变咱们查询的结果
怎么防范?有几种方式
1. 过滤用户的输入 经过前端用JS也行,用PHP也行
2. 写代码的规范
3. 使用PDO里自带的功能叫预处理语句,来防止SQL注入攻击
<?php $dsn = "mysql:dbname=mydb;host=localhost"; $pdo = new PDO($dsn,"root","123"); $code ="n001"; //SQL语句里面须要加占位符 ? $sql = "select * from nation where code='{?}'"; //怎样把注入攻击规避掉 //pdo 提供了一种方式叫 prepare-> 准备的意思 //准备执行,返回PDOStatement对象 $st = $pdo->prepare($sql); //调用绑定参数的方法来绑定参数 $st->bindParam(1,$code); //1.括号里第一个要写占位符在sql语句里面的位置是几 //2.要写参数 这两个是必需要写的 //执行方法 $st->execute(); $attr = $st->fetchAll(); var_dump($attr); ?>