PDO数据访问抽象层
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数据访问抽象层的更多相关文章
- PDO(数据访问抽象层)、pdo事务功能和预处理功能---2017-05-05
之前所学的数据访问都是用mysqli做成类来访问的,但是mysqli这个类只是针对mysql这个数据库的:那么如果访问其他类型的数据库呢? 那么这就用到了PDO(数据访问抽象层). 一.关于PDO基本 ...
- PHP中关于PDO数据访问抽象层的功能操作
PDO:数据访问抽象层 具有三大特点: 1.可以访问其它数据库 所有数据库都可以 2.具有事务功能 3.带有预处理语句功能(防止SQL注入攻击) 实例操作代码如下: <?php //1.造PD ...
- PDO数据访问抽象层(上)
PDO比MySQLi功能强大 PDO可以访问MySQL及其它数据库 一.造对象 <?php $dsn = "mysql:dbname = crud;host = localhost&q ...
- PDO 数据访问抽象层
1.操作其它数据库 (1)造对象 $dsn = "mysql:dbname=test3;host=localhost"; //数据源:两个参数:数据库驱动,链接数据库 $pdo = ...
- php 之 PDO数据访问抽象层(0513)
PDO(PHP Data Objects)是一种在PHP里连接数据库的使用接口. PDO与mysqli曾经被建议用来取代原本PHP在用的mysql相关函数, 基于数据库使用的安全性,因为后者欠缺对于S ...
- 5月13 PDO数据访问抽象层
方法1:较简单的 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://ww ...
- PDO数据访问抽象层(下)
PDO两大功能 一.事务功能 PDO的事务功能主要控制好几条sql语句同时成功或者同时失败(当其中一条SQL语句有错误时,同时好几条一起失败),失败时可以回滚操作 1.造对象 <?php $ds ...
- php PDO:数据访问抽象层
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- PDO:数据访问抽象层
<?php //PDO:数据访问抽象层 //带有事务功能: //dsn:数据源 $dsn="mysql:host=localhost;dbname=aaas"; //造pdo ...
随机推荐
- IOS Cell重用机制
重用机制: -(UITableViewCell *)tableView: (UITableView *)tableView cellForRowAtIndexPath: (NSIndexPath *) ...
- .net 设置版本号信息
1.AssemblyInfo.cs [assembly: AssemblyVersion("1.3.170116")] [assembly: AssemblyFileVersion ...
- Mac 修改用户名
系统偏好设置 > 用户与群组 > 解锁 > 用户 > 右键 > 高级选项 > 全名
- jQuery DataTables and ASP.NET MVC Integration
part 1 : http://www.codeproject.com/Articles/155422/jQuery-DataTables-and-ASP-NET-MVC-Integration-Pa ...
- datatable 使用详细说明
要注意的是,要被dataTable处理的table对象,必须有thead与tbody,而且,结构要规整(数据不一定要完整),这样才能正确处理.以下是在进行dataTable绑定处理时候可以附加的参数: ...
- spring mvc 文件下载
在controller中进行代码编写: @RequestMapping("/download") public ResponseEntity<byte[]> downl ...
- javascript实现页面滚屏效果
当我们浏览网页的时候,时常会碰到可以滚动屏幕的炫酷网页,今天笔者对这一技术进行简单实现,效果不及读者理想中那般炫酷,主要针对滚屏的技术原理和思想进行分享和分析.本示例在页面右侧有五个数字标签,代表五个 ...
- 字体图标 轻量级 Font Awesome
今天呢,来推荐一款请轻量级 字体图标框架.Font Awesome 用法与bootstrap相似 打开网址.download下载,然后打开取到这两个,下载点这里,这个博客弄的挺好的. 找到exampl ...
- Windows 10 IoT Core环境配置中的那些坑
我使用的设备是Raspberry Pi 3B,想来国内的嵌入式玩具应该还是树莓派最常见吧.这段时间一直在捣鼓Win10 IoT,结果发现,从安装一直到编码调试一路下来全都是坑.写这篇东西一个是为了备忘 ...
- asp.net权限认证:Windows认证
asp.net权限认证系列 asp.net权限认证:Forms认证 asp.net权限认证:HTTP基本认证(http basic) asp.net权限认证:Windows认证 asp.net权限认证 ...