PDO 数据访问抽象层
1.操作其它数据库
(1)造对象
1
|
$dsn = "mysql:dbname=test3;host=localhost" ; //数据源:两个参数:数据库驱动,链接数据库 |
1
|
$pdo = new PDO( $dsn , "root" , "123" ); //数据源,数据库名,密码 |
(2)写sql语句
1
|
1. $sql = "select * from productor" ; //查询这个表中的所有数据<br>2. $sql = " insert into productor values('p006','随便')"; //增删改语句 |
(3)执行语句:这里就和MySQLi()的不同之处了
1
2
3
4
|
1. $a = $pdo ->query( $sql ); //执行查询语句:用query(); //输出的是关联数组:fetch是输出一条数据, fetch_all是输出所有的数据;PDO::FETCH_ASSOC也有几个常用的:BOTH是关联和索引数组都有,ASSOC第关联数组,NUM是索引数组 $arr = $a ->fetch(PDO::FETCH_ASSOC); var_dump( $arr ); |
1
2
|
2. $a = $pdo -> exec ( $sql ); //执行其他语句:用exec(); var_dump( $a ); |
这样就是已经添加进数据库了 :
2.事务功能
事务:能够控制语句同时成功同时失败,失败时可以回滚
(1)造对象(上面已有)
(2)设置异常模式
1
|
$pdo ->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); //直接拿过来用 |
(3)开始写事务:语句一起执行,其中只要有一条语句是错误的,就回滚到最开始,并且没有真正执行写入数据库中
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
try { //开启事务 $pdo ->beginTransaction(); $sql1 = "insert into productor values('p007','en')" ; //是可以添加的 $sql2 = "insert into productor values('p008','we')" ; $sql3 = "insert into productor values('p005','gh')" ; //是不能添加的,也就是错误语句 $pdo -> exec ( $sql1 ); $pdo -> exec ( $sql2 ); $pdo -> exec ( $sql3 );<br> //提交 $pdo ->commit(); //正真的写入到数据库中 } catch (Exception $e ) { //抓住try里面出现的错误,并且处理 echo $e ->getMessage(); //获取异常信息<br> //回滚:回到语句最开始 $pdo ->rollBack(); } |
3.防止sql注入攻击
(1)?占位符:数组必须是索引数组
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
/SQL语句里面需要加占位符 ? $sql = "select * from nation where code=?" ; //$sql = "insert into nation values(?,?)"; //准备执行,返回PDOStatement对象 $st = $pdo ->prepare( $sql ); //1.调用绑定参数的方法来绑定参数:绑定的参数必须定义 //$st->bindParam(1,$code); //前两参数必须写:占位符位置,绑定的参数 //$st->bindParam(2,$name); //2.索引数组 $attr = array ( "" , "" ); //$code,$name //执行方法 $st ->execute( $attr ); |
(2)字符串方式:数组必须是关联数组
1
2
3
4
5
6
7
8
9
10
11
12
13
|
//占位符是字符串 $sql = "insert into nation values(:code,:name)" ; //准备执行 $st = $pdo ->prepare( $sql );<br><br> //1.调用绑定参数参数 //$st->bindParam(":code",$code,PDO::PARAM_STR); //前三个参数必须要:字符串,定义的绑定,类型 //$st->bindParam(":name",$name,PDO::PARAM_STR); //$code = "n007"; //$name = "测试3"; //2.关联数组 $attr = array ( "code" => "n008" , "name" => "测试4" ); $st ->execute( $attr ); |