PDO数据访问抽象层:

我们使用的mysqli是针对mysql这个数据库扩展的一个类,如果要用到别的数据库的话就可以用PDO来做

1.操作数据库

先来代码

<!--PDO-->
<!--数据访问抽象层-->
<!--可以访问其他数据库-->
<!--具有事务功能-->
<!--带有预处理语句功能(防止sql注入攻击功能)-->
<?php
//1.造PDO对象
$dsn = "mysql:dbname=heiheihei;host=localhost";
//冒号前面的是驱动名称(mysql),后面是参数:dbname=连接哪一个数据库;连接到本机
$pdo = new PDO($dsn,"root","12345678");
//root(数据库用户名,密码) //2.写sql语句
$sql = "select * from mydb";
//查询语句 //3.执行sql语句
//$stm = $pdo->query($sql);
//执行查询语句 //4.从PDOStatement对象里面读取数据
//$arr = $stm->fetch(PDO::FETCH_ASSOC);
//返回关联数组,即返回一个索引为结果集列名的数组
//$arr = $stm->fetch(PDO::FETCH_BOTH);
//关联加索引,即返回一个索引为结果集列名和以0开始的列号的数组
//$arr = $stm->fetch(PDO::FETCH_NUM);
//返回索引的数组,即返回一个索引为以0开始的结果集列号的数组
//$arr = $stm->fetch(PDO::FETCH_OBJ);
//返回一个属性名对应结果集列名的匿名对象 //缺省为 PDO::ATTR_DEFAULT_FETCH_MODE 的值,即默认 //如果是PDOStatement::fetchAll,即代表一次性读出所有数据 var_dump($arr);
?>

输出:

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

输出attr,则返回一个索引为结果集列名的数组:

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

输出attr,则返回一个索引为结果集列名和以0开始的列号的数组:

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

输出attr,则返回一个属性名对应结果集列名的匿名对象:

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

用PDO来做个添加语句:

<?php
//1.造PDO对象
$dsn = "mysql:dbname=heiheihei;host=localhost";
//冒号前面的是驱动名称(mysql),后面是参数:dbname=连接哪一个数据库;连接到本机
$pdo = new PDO($dsn,"root","12345678");
//root(数据库用户名,密码) //2.写sql语句 $sql = "insert into mydb VALUES ('虾','123','小虾',0)";
//增删改语句 //3.执行sql语句 $arr = $pdo->exec($sql);
//执行添加语句,exec返回影响的行数 //4.从PDOStatement对象里面读取数据
var_dump($arr);
?>

exec是用来执行其他语句,他返回的是受影响的行数

图:

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

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

再看一下,数据库内,已经添加成功:

2.事务功能

事务功能即能够控制语句同时成功或同时失败,失败时可以回滚

事务有三个基本的方法:

PDO::beginTransaction() - 启动一个事务:将下面的代码看作一个事务

commit - 提交事务:是将开始和提交中间的代码看作一个事务一起执行提交

PDO::rollBack() - 回滚一个事务:如果有问题就回滚,没有问题就不用回滚,回滚就是还原

代码:

<?php
$dsn = "mysql:dbname = mydb;host=localhost";
//数据源
$pdo = new PDO($dsn,"root","123");
//造对象 //改事务模式 //1.将PDO的错误类型设为异常模式(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION )
$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); //try尝试运行里面代码
try {
//开启事务
$pdo->beginTransaction(); $sql = "insert into mydb VALUES ('西','123','小西',0)";
$sqll = "insert into mydb VALUES ('虾','123','小虾',0)"; $pdo->exec($sql);
$pdo->exec($sqll); //提交事务
$pdo->commit();
} //catch抓住异常.控制异常。$e代表异常的数值
catch(Exception $e)
{
// echo "有错误"; //回滚操作!!!
//如果发现有错误,回滚rollback!
$pdo->rollBack();
} //最终执行,必执行
//final
//{
//无论有没有一场出现,该代码都会执行
//}
?>

在我的数据库里面帐号是主键

西是可以添加上的,但是虾有重复是加不上的,因为有事务功能 ,要么一起成功,要么一起失败,所以这两条数据都不会成功

运行完成,查看数据库:

 

果然一条都没有成功!

如果把虾改成对的:

 $sql = "insert into mydb VALUES ('西','123','小西',0)";
$sqll = "insert into mydb VALUES ('东','123','小东',0)";

一起添加成功!!

3.预处理语句防止SQL注入:

 他是分两次来发送到输出,就不会出现注入攻击了

(1)占位符“?”方法:

<?php

$dsn = "mysql:dbname=heiheihei;host=localhost";
$pdo = new PDO($dsn,"root","12345678"); //框架
$sql = "insert into mmaa VALUES (?,?)";
//写一个预处理语句,在写参数的地方用占位符“?”代替 //将预处理语句扔到服务器等待执行,返回PDOStatomont对象;prepare准备,等待执行
$stm = $pdo->prepare($sql); //第二次将变量(参数)扔到服务器的SQl语句相应位置,给预处理语句绑定参数。binparam绑定参数
//第一个参数第二个参数是
$stm->bindParam(1,$id);
$stm->bindParam(2,$name); //赋值
$id = 5;
$name = "孙";
//执行
$stm->execute();

这是一个添加语句,让我们来看看添加成功

如果数据过多,上面这种方法会极其麻烦,所以还有一种简单方法

<?php

$dsn = "mysql:dbname=heiheihei;host=localhost";
$pdo = new PDO($dsn,"root","12345678"); //框架
$sql = "insert into mmaa VALUES (?,?)";
//写一个预处理语句,在写参数的地方用占位符“?”代替 //将预处理语句扔到服务器等待执行,返回PDOStatomont对象;prepare准备,等待执行
$stm = $pdo->prepare($sql); //定义一个数组,必须是索引数组
$arr = aarray("8","邵"); //执行
$stm->execute($arr);

这上面的这种方法很智能,并且很简便,它可以自动把参数仍到该扔到的地方

(2)名称占位法...

这种方法一目了然,知道该填什么参数

代码:

首先我设一个添加的页面:

<body>
<h1>添加一条数据</h1>
<form action="bbb.php" method="post">
<div>id:<input type="text" name="id"/></div>
<div>姓名:<input type="text" name="name"/></div>
<input type="submit" value="点击添加"/>
</form> </body>

然后我去做处理页面:

<?php
$dsn = "mysql:dbname=heiheihei;host=localhost";
$pdo = new PDO($dsn,"root","12345678"); //预处理语句,括号里不是?了
$sql = "insert into mmaa VALUES (:id,:name)";
$stm = $pdo->prepare($sql); //执行,$_post里面有id跟name的值,所以直接把post扔进去就好了
$stm->execute($_POST);

添加图:

点击添加,查看数据库:

添加成功了,代码量非常少

PDO常用方法及其应用

PDO::query() 主要是用于有记录结果返回的操作,特别是SELECT操作
PDO::exec() 主要是针对没有结果集合返回的操作,如INSERT、UPDATE等操作
PDO::prepare() 主要是预处理操作,需要通过$rs->execute()来执行预处理里面的SQL语句,这个方法可以绑定参数,功能比较强大(防止sql注入就靠这个)
PDO::lastInsertId() 返回上次插入操作,主键列类型是自增的最后的自增ID
PDOStatement::fetch() 是用来获取一条记录
PDOStatement::fetchAll() 是获取所有记录集到一个集合
PDOStatement::fetchColumn() 是获取结果指定第一条记录的某个字段,缺省是第一个字段
PDOStatement::rowCount() :主要是用于PDO::query()和PDO::prepare()进行DELETE、INSERT、UPDATE操作影响的结果集,对PDO::exec()方法和SELECT操作无效。

 防注入攻击原理:

当调用 prepare() 时,查询语句已经发送给了数据库服务器,此时只有占位符 ? 发送过去,没有用户提交的数据;当调用到 execute()时,用户提交过来的值才会传送给数据库,他们是分开传送的,两者独立的,SQL攻击者没有一点机会。

PDO数据访问抽象层的更多相关文章

  1. PDO(数据访问抽象层)、pdo事务功能和预处理功能---2017-05-05

    之前所学的数据访问都是用mysqli做成类来访问的,但是mysqli这个类只是针对mysql这个数据库的:那么如果访问其他类型的数据库呢? 那么这就用到了PDO(数据访问抽象层). 一.关于PDO基本 ...

  2. PHP中关于PDO数据访问抽象层的功能操作

    PDO:数据访问抽象层 具有三大特点: 1.可以访问其它数据库  所有数据库都可以 2.具有事务功能 3.带有预处理语句功能(防止SQL注入攻击) 实例操作代码如下: <?php //1.造PD ...

  3. PDO数据访问抽象层(上)

    PDO比MySQLi功能强大 PDO可以访问MySQL及其它数据库 一.造对象 <?php $dsn = "mysql:dbname = crud;host = localhost&q ...

  4. PDO 数据访问抽象层

    1.操作其它数据库 (1)造对象 $dsn = "mysql:dbname=test3;host=localhost"; //数据源:两个参数:数据库驱动,链接数据库 $pdo = ...

  5. php 之 PDO数据访问抽象层(0513)

    PDO(PHP Data Objects)是一种在PHP里连接数据库的使用接口. PDO与mysqli曾经被建议用来取代原本PHP在用的mysql相关函数, 基于数据库使用的安全性,因为后者欠缺对于S ...

  6. 5月13 PDO数据访问抽象层

    方法1:较简单的 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://ww ...

  7. PDO数据访问抽象层(下)

    PDO两大功能 一.事务功能 PDO的事务功能主要控制好几条sql语句同时成功或者同时失败(当其中一条SQL语句有错误时,同时好几条一起失败),失败时可以回滚操作 1.造对象 <?php $ds ...

  8. php PDO:数据访问抽象层

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. PDO:数据访问抽象层

    <?php //PDO:数据访问抽象层 //带有事务功能: //dsn:数据源 $dsn="mysql:host=localhost;dbname=aaas"; //造pdo ...

随机推荐

  1. Reactive 网络状态 Activity indicator view

    转动属性:Animating RAC(self.searchActivity, hidden) = [self.m_viewModel.m_searchCommand.executing not];

  2. vim列编辑

    命令模式下:ctrl + v(我在gvim,win7中是ctrl +shift + q)进入列编辑模,选中要编辑的行(j 上,k下) 输入 “I” (大写的 I,光标定位到选中的第一行),输入要编辑的 ...

  3. php 中 php-fpm 的重启、终止操作命令

    php-fpm没有启动nginx会报502的错误 php 5.3.3 下的php-fpm 不再支持 php-fpm 以前具有的 /usr/local/php/sbin/php-fpm (start|s ...

  4. 多因子降维法(MDR,multifactor dimensionality reduction)

    多因子降维法(MDR,Multifactor Dimensionality Reduction ) MDR是近年统计学中发展起来的一种新的分析方法.其中,“因子” 即交互作用研究中的变量,“维” 是指 ...

  5. PHP函数 mysql_real_escape_string 与 addslashes 的区别

    addslashes 和 mysql_real_escape_string 都是为了使数据安全的插入到数据库中而进行的过滤,那么这两个函数到底是有什么区别呢? 首先,我们还是从PHP手册入手: 手册上 ...

  6. PHP中目录解析函数

    dirname(string path):给出一个包含有指向一个文件的全路径的字符串,本函数返回去掉文件名后的目录名. 斜线(/)和反斜线(\)都可以用作目录分隔符.在其它环境下是斜线(/). dir ...

  7. JSP userBean setProperty直接从request中获取参数

    JSP userBean setProperty直接从request中获取参数: form表单Jsp: <%@ page language="java" import=&qu ...

  8. SuperSocket入门(一)-Telnet服务器和客户端请求处理

    本文的控制台项目是根据SuperSocket官方Telnet示例代码进行调试的,官方示例代码:Telnet示例. 开始我的第一个Telnet控制台项目之旅: 创建控制台项目:打开vs程序,文件=> ...

  9. IE6浏览器常见的bug及其修复方法

    IE6不支持min-height,解决办法使用css hack: .target { min-height: 100px; height: auto !important; height: 100px ...

  10. Hadoop权威指南:MapReduce应用开发

    Hadoop权威指南:MapReduce应用开发 [TOC] 一般流程 编写map函数和reduce函数 编写驱动程序运行作业 用于配置的API Hadoop中的组件是通过Hadoop自己的配置API ...