下面来说一下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的这种方式并不能篡改,无论扔什么值都会判断是否相等

比Mysqli操作数据库更简便的方式 。PDO的更多相关文章

  1. Android开发之使用sqlite3工具操作数据库的两种方式

    使用 sqlite3 工具操作数据库的两种方式 请尊重他人的劳动成果,转载请注明出处:Android开发之使用sqlite3工具操作数据库的两种方式 http://blog.csdn.net/feng ...

  2. php 通过mysqli 操作数据库mysql

    目录 php mysqli 操作数据库 连接数据库 通过mysqli 创建数据库 通过mysqi 创建数据表 通过mysqli向数据表中插入信息 通过mysqli 读取数据 where语句的应用 通过 ...

  3. Yii框架操作数据库的几种方式与mysql_escape_string

    一.Yii操作数据库的几种选择 1,PDO方式. $sql = "";//原生态sql语句 xx::model()->dbConnection->createComma ...

  4. JDBC操作数据库的三种方式比较

    JDBC(java Database Connectivity)java数据库连接,是一种用于执行上sql语句的javaAPI,可以为多种关系型数据库提供统一访问接口.我们项目中经常用到的MySQL. ...

  5. laravel记录笔记Laravel 连接数据库、操作数据库的三种方式

    laravel中提供DB facade(原始查找).查询构造器.Eloquent ORM三种操作数据库方式 1.连接数据库 .env 数据库配置 DB_HOST=localhost dbhost DB ...

  6. adb命令具体解释(二)——手机缺失sqlite3时操作数据库的多种解决方式

    在android应用开发无处不在SQLite数据库的身影.那么在开发中怎么使用adb命令操作数据库的功能呢? 以下我们将完整的介绍与数据库操作相关的命令集及当手机缺少sqlite3的时候的多种解决方式 ...

  7. Django框架操作数据库的两种方式

    Django操作数据库的前提操作是成功连接数据库,详情见上篇:https://www.cnblogs.com/kristin/p/10791358.html Django查询数据库的方式一 from ...

  8. C# 操作数据库的几种方式(数据库使用SQL SERVER2008)

    一:通过常规 T-SQL 语句 (只写删除操作,其他同理) string strConn = ConfigurationManager.ConnectionStrings["SiteConn ...

  9. 在PHP中使用MySQL Mysqli操作数据库 ,以及类操作方法

    先来操作函数部分,普遍的MySQL 函数方法,但随着PHP5的发展,有些函数使用的要求加重了,有些则将废弃不用,有些则参数必填... ================================= ...

随机推荐

  1. Angular2入门系列教程4-服务

    上一篇文章 Angular2入门系列教程-多个组件,主从关系 在编程中,我们通常会将数据提供单独分离出来,以免在编写程序的过程中反复复制粘贴数据请求的代码 Angular2中提供了依赖注入的概念,使得 ...

  2. 一次修改闭源 Entity Provider 程序集以兼容新 EntityFramework 的过程

    读完本文你会知道,如何在没有源码的情况下,直接修改一个 DLL 以去除 DLL 上的强命名限制,并在该程序集上直接添加你的“友元程序集(一种特殊的 Attribute,将它应用在程序集上,使得程序集内 ...

  3. nodejs利用http模块实现银行卡所属银行查询和骚扰电话验证

    http模块内部封装了http服务器和客户端,因此Node.js不需要借助Apache.IIS.Nginx.Tomcat等传统HTTP服务器,就可以构建http服务器,亦可以用来做一些爬虫.下面简单介 ...

  4. C++随笔:.NET CoreCLR之corleCLR核心探索之coreconsole(1)

    一看这个标题,是不去取名有点绕呢?或者是,还有些问题?报告LZ...你的标题取得有问题,是个病句!↖(^ω^)↗!!!先不要急,其实我今天带给大家的就是CoreCLR中的coreclr.其中它是在名字 ...

  5. IdentityServer4 使用OpenID Connect添加用户身份验证

    使用IdentityServer4 实现OpenID Connect服务端,添加用户身份验证.客户端调用,实现授权. IdentityServer4 目前已更新至1.0 版,在之前的文章中有所介绍.I ...

  6. APEX:对object中数据进行简单处理?

    在Salesforce中,常常要对各种数据进行处理,已满足业务逻辑.本篇文章会介绍如何实现从object获取数据,然后将取得的数据进行一系列简单处理. 第一步:SongName__c 是一个新建的ob ...

  7. CSS3 @keyframes 动画

    CSS3的@keyframes,它可以取代许多网页动画图像,Flash动画,和JAVAScripts. CSS3的动画属性 下面的表格列出了 @keyframes 规则和所有动画属性: 浏览器支持 表 ...

  8. JavaScript学习笔记(一)——延迟对象、跨域、模板引擎、弹出层、AJAX示例

    一.AJAX示例 AJAX全称为“Asynchronous JavaScript And XML”(异步JavaScript和XML) 是指一种创建交互式网页应用的开发技术.改善用户体验,实现无刷新效 ...

  9. arcgis api for js入门开发系列六地图分屏对比(含源代码)

    上一篇实现了demo的地图标绘模块,本篇新增地图地图分屏对比模块,截图如下(源代码见文章底部): 对效果图的简单介绍一下,在demo只采用了两分屏对比,感兴趣的话,可以在两分屏的基础上拓展,修改css ...

  10. Android SDK 与API版本对应关系

    Android SDK版本号 与 API Level 对应关系如下表: Code name Version API level   (no code name) 1.0 API level 1   ( ...