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

下面来说一下PDO

先画一张图来了解一下

a03a826e9c8714ba63c6723a4622006a.png

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

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

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

PDO

数据访问抽象层

1、操作其他数据库

2、事务功能

3、防止SQL注入攻击

用PDO来举个例子

无标题文档

//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);?>

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

输出一下attr

af9568af463f4a21d1c4a1f260fc61db.png

输出的是一个关联数组

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

3e6a00c0be1396e0638fe878300065cd.png

输出为索引的

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

509649b8568c96ecfbe35ab934196b2a.png

则关联和索引都有

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

ba4262f0db2fc6300aefcaed1d128249.png

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

无标题文档

//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);

?>

运行试试看:

bf142ee9897a4b17019353b31efc5c07.png

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

00427c7c197a939bd8cdc9092a3a5475.png

添加成功

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

40fb567e6e543e3db7c5352f8653198f.png

exec  方法

运行后看看效果

ed7243a401f0e2194afc635390dc88ca.png

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

再看看数据库

8e7843af76673ce73f11a4aab86f3580.png

077已添加进去

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

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

exec是用来执行其他语句

它的第一个功能就讲完了

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

594f4f1c8b1e69612c6a5bf6764bbb82.png

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

查看一下数据库:

4f6d478ad7130e2ed7e4c7aa095bf079.png

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

在下面加个事务功能

c5730dedcc05b15c510b024b8b3a2fe0.png

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

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

6001ae81a69a61a0675e5e365dcc6230.png

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

5b48669fc4671152b96608b82a36f560.png

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

66ba8f01952f5120abfe28b474425eff.png

添加成功!

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

还是用nation表来做

无标题文档

$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);?>

运行后,查到了结果

b80cf2d051862b51e5f2c0cda471add0.png

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

再做一个添加语句

5fb29f531dedb6851169c2f15e100a5a.png

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

c67177cbb64b7312d9f54735a3db1c7a.png

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

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

b27b25d1eb20f9443afab7403e0945b2.png

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

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

08f426930eba796eba3ab273067e8424.png

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

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

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

无标题文档

$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();?>

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

测试3已成功添加

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

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

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

来看一下代码部分怎么写

70926d148e5cbffa3b94fe9ad99fc789.png

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

4cd62be378b963792b8ae4e181a1bbfb.png

测试4,添加成功

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

下面来举个例子吧

ce07ac0f80515f2f1f01051a0689aa62.png

做个添加的例子

40c7f1ce63aca939b5ea831d6506ced4.png

重要的是它的处理页面

71a7f050b517a02ec03b0b1edb366f79.png

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

d4580742328bc1132ad802360c2b318d.png

看一下数据库内

26c68c3aa0490f4cbab0fd26ae5267e3.png

测试5添加成功!

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

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

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

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值