zoukankan      html  css  js  c++  java
  • 比Mysqli操作数据库更简便的方式 。PDO

    下面来说一下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

    输出的是一个关联数组

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

     输出为索引的

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

    则关联和索引都有

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

    用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>

    运行试试看:

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

    添加成功

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

    exec  方法

    运行后看看效果

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

    再看看数据库

    077已添加进去

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

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

    exec是用来执行其他语句

    它的第一个功能就讲完了

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

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

    查看一下数据库:

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

    在下面加个事务功能

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

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

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

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

    添加成功!

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

    还是用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>

    运行后,查到了结果

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

    再做一个添加语句

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

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

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

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

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

    测试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方法,就要写参数,这种方法有点麻烦,它还有简便的方法,还可以使用数组的方式

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

    来看一下代码部分怎么写

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

    测试4,添加成功

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

    下面来举个例子吧

    做个添加的例子

    重要的是它的处理页面

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

    看一下数据库内

    测试5添加成功!

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

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

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

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

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

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

  • 相关阅读:
    剑指OFFER之复杂链表的复制(九度OJ1524)
    剑指OFFER之二叉树中和为某一值的路径(九度OJ1368)
    剑指OFFER之从二叉搜索树的后序遍历序列(九度OJ1367)
    剑指OFFER之从上往下打印二叉树(九度OJ1523)
    剑指OFFER之栈的压入、弹出序列(九度OJ1366)
    剑指OFFER之包含min函数的栈(九度OJ1522)
    剑指OFFER之顺时针打印矩阵(九度OJ1391)
    剑指OFFER之树的子结构(九度OJ1520)
    剑指OFFER之二叉树的镜像(九度OJ1521)
    VM安装CentOs7虚拟机后无法上网之解决方法
  • 原文地址:https://www.cnblogs.com/qishuang/p/6249375.html
Copyright © 2011-2022 走看看