比Mysqli操作数据库更简便的方式 。PDO

时间:2023-03-08 15:50:25

下面来说一下PDO

先画一张图来了解一下

比Mysqli操作数据库更简便的方式 。PDO

mysqli是针对mysql这个数据库扩展的一个类

PDO是为了能访问更多数据库

如果出现程序需要访问其他数据库的话就可以用PDO来做

PDO
数据访问抽象层

1、操作其他数据库
2、事务功能
3、防止SQL注入攻击

用PDO来举个例子

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
</head> <body> <?php
//1、操作其他数据库
//2、事务功能
//3、防止SQL注入攻击 //造PDO对象
$dsn = "mysql:dbname=shuang;host=localhost"; //数据源
$pdo = new PDO($dsn,"root","726");//需要三个参数
//写SQL语句
$sql = "select * from nation";
//执行
$attr = $pdo->query($sql); $arr = $attr->fetch(PDO::FETCH_ASSOC); //这里的参数不需要单引号双引号
var_dump($arr); ?>
</body>
</html>

调用一下fetch里面的参数为  PDO::FETCH_ASSOC

输出一下attr

比Mysqli操作数据库更简便的方式 。PDO

输出的是一个关联数组

把里面参数ASSOC换为NUM,输出:

比Mysqli操作数据库更简便的方式 。PDO

输出为索引的

如果参数ASSOC改为  BOTH,输出:

比Mysqli操作数据库更简便的方式 。PDO

则关联和索引都有

改为fetchALL(PDO::FETCH_BOTH)也可以,它是把所有数据都可以查到

比Mysqli操作数据库更简便的方式 。PDO

用PDO来做个添加语句试试看

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
</head> <body> <?php
//1、操作其他数据库
//2、事务功能
//3、防止SQL注入攻击 //造PDO对象
$dsn = "mysql:dbname=shuang;host=localhost"; //数据源
$pdo = new PDO($dsn,"root","726");//需要三个参数
//写SQL语句
//$sql = "select * from nation";
$sql = "insert into nation values('n076','数据')"; //添加语句
//执行
$a = $pdo->query($sql); var_dump($a); //$arr = $attr->fetchALL(PDO::FETCH_BOTH); //这里的参数不需要单引号双引号
//var_dump($arr); ?>
</body>
</html>

运行试试看:

比Mysqli操作数据库更简便的方式 。PDO

再看一下,数据库内,有没有添加上数据

比Mysqli操作数据库更简便的方式 。PDO

添加成功

PDO中除了用query方法,还可以用一种

比Mysqli操作数据库更简便的方式 。PDO

exec  方法

运行后看看效果

比Mysqli操作数据库更简便的方式 。PDO

显示了一个1,证明影响了1行数据

再看看数据库

比Mysqli操作数据库更简便的方式 。PDO

077已添加进去

如果失败了,运行后会显示0

query方法一般是用来执行查询

exec是用来执行其他语句

它的第一个功能就讲完了

接下来说一下第2种事务功能

比Mysqli操作数据库更简便的方式 。PDO

运行一下,078让它添加,077重复,肯定添加不进去

查看一下数据库:

比Mysqli操作数据库更简便的方式 。PDO

078在里面,077主键相同不能被添加

在下面加个事务功能

比Mysqli操作数据库更简便的方式 。PDO

开启事务和提交是对应的,有开启就一定有提交,回滚,是让它回滚到原来的位置

如果添加的话,按理说079可以添加上,077重复,不可以添加,但是加了事务功能后,要么一起成功,要么一起失败,看一下运行后的数据库

比Mysqli操作数据库更简便的方式 。PDO

079和077的内容都没有被添加上

比Mysqli操作数据库更简便的方式 。PDO

把重复的077改成080,运行后,看一下数据库内的数据

比Mysqli操作数据库更简便的方式 。PDO

添加成功!

再来看一下它最后一个功能

还是用nation表来做

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
</head> <body>
<?php //预处理语句防止SQL注入
$dsn = "mysql:dbname=shuang;host=localhost";
$pdo = new PDO($dsn,"root","726");
$code = "n001";
//SQL语句里面需要加占位符?
$sql = "select * from nation where code=?"; //准备执行。返回PDOStatement对象
$st = $pdo->prepare($sql);
//调用绑定参数的方法来绑定参数
$st->bindParam(1,$code);
$st->execute();
$attr = $st->fetchAll();
var_dump($attr); ?>
</body>
</html>

运行后,查到了结果

比Mysqli操作数据库更简便的方式 。PDO

使用的是分两次来发送到服务器,就不会出现注入攻击了

再做一个添加语句

比Mysqli操作数据库更简便的方式 。PDO

运行后,再看一下数据库,是否添加成功了

比Mysqli操作数据库更简便的方式 。PDO

测试1 在数据库内,证明运行成功了

但是考虑到,数据很多的情况下,用上述方法会很麻烦,所以还有一种简单方法

比Mysqli操作数据库更简便的方式 。PDO

用数组的方式来做,只是索引数组

运行后,来看一下有没有把数据添加到数据库

比Mysqli操作数据库更简便的方式 。PDO

测试2 在数据库内,运行成功

除了用问号占位符,还可以用字符串占位符

来看一下用字符串占位符怎么做

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
</head> <body>
<?php
$dsn = "mysql:dbname=shuang;host=localhost";
$pdo = new PDO($dsn,"root","726");
//占位符是字符串
$sql = "insert into nation values(:code,:name) ";
$st = $pdo->prepare($sql);
$st->bindParam(":code",$code,PDO::PARAM_STR);
$st->bindParam(":name",$name,PDO::PARAM_STR);
$code = "n009";
$name = "测试3";
$st->execute();
?> </body>
</html>

看看数据库内,有没有加上这条数据

测试3已成功添加

证明用字符串占位符也是可以的

如果调用bindParam方法,就要写参数,这种方法有点麻烦,它还有简便的方法,还可以使用数组的方式

不过这里使用的数组和上面使用的数组就不一样了,上面使用的是索引数组,这里使用的是关联数组

来看一下代码部分怎么写

比Mysqli操作数据库更简便的方式 。PDO

比刚才的方式简便了许多,array里面的要和sql语句里面的值相对应,来看一下数据库内有没有添加上

比Mysqli操作数据库更简便的方式 。PDO

测试4,添加成功

看了这么多测试,可能会有人问了,Mysqli和PDO到底使用哪种方式简单

下面来举个例子吧

比Mysqli操作数据库更简便的方式 。PDO

做个添加的例子

比Mysqli操作数据库更简便的方式 。PDO

重要的是它的处理页面

比Mysqli操作数据库更简便的方式 。PDO

只需要五行代码就可以,来实验一下

比Mysqli操作数据库更简便的方式 。PDO

看一下数据库内

比Mysqli操作数据库更简便的方式 。PDO

测试5添加成功!

我们想一下,之前使用的Mysqli的方式,还需要取数据,好几行数据的话,还需要取好几个数据

这种方式就是一次性的都过来,这种方式还可以防止注入攻击

说一下防止注入攻击的原理

先把SQL语句外面这些东西发到服务器等待执行,分第二次发送,它的值,来判断code是否等于它。

之前那种方式是把好几个变量拼在一起去执行,那样的话可以让人篡改我们的SQL语句

PDO的这种方式并不能篡改,无论扔什么值都会判断是否相等