PDO 翻译过来叫做数据访问抽象层

它是一个数据访问的层面,实际上是一个类,也就是说所有操作数据库的代码,都是通过这个层面完成的

该图好理解大概就是这样一种模式

现在考虑的是能不能使用同一个类,上层代码不用动,使用一个类去操作数据库,我可以根据这个类里边给的一些参数,它来自动切换驱动

所以PDO主要就是用来访问其它数据库

它的主要功能:

1.操作其它数据库

2.事务功能

3.防止SQL注入攻击

首先先造PDO对象

$dsn = "mysql:dbname=mydb;host=localhost";   这是一个数据源

mysql 代表了驱动的名称

冒号后边写连接的参数

写的是数据库名称叫dbname=名称叫mydb

host 代表了数据库地址

$dsn = "mysql:dbname=mydb;host=localhost";
$pdo = new PDO($dsn,"root","123");

这样PDO对象就造好了

接着写SQL语句和执行

$sql = "select * from nation";

$attr = $pdo->query($sql);

$arr = $attr->fetch(PDO::FETCH_ASSOC);//参数不需要加单引号双引号
var_dump($arr);

这返回的对象是PDOStatement对象

ASSOC 代表 关联数组

NUM 代表 索引的

BOTH 代表两者都有

OBJ 返回对象

如果sql语句不是查询语句,而是增删改

//添加语句
$sql = "insert into nation values('n076','数据')"; //$a = $pdo->query($sql); //执行查询 //$a = $pdo->exec($sql); //执行其它语句

exec  是指一个单独的函数调用中执行一条SQL语句,返回受此语句影响的行数

         不会从一条SELECT语句中返回结果

这些就是PDO访问数据库的基本写法

如果把dsn换掉就可以访问别的数据库了

接下来了解一下事务功能

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

$dsn = "mysql:dbname=mydb;host=localhost";
$pdo = new PDO($dsn,"root","123"); $sql1 = "insert into nation values('n079','是删')";
$sql2 = "insert into nation values('n077','可爱')"; $pdo->exec($sql1);
$pdo->exec($sql2);

n079是在数据里没有的,可以进

n077是在数据里存在的,是失败的,主键重复

执行的时候,如果单纯的执行,我没有加事务的话,应该是一条成功一条失败

 

现在我们要加事务让着两条要么一起成功,要么一起失败,并且把错误的找出来,进行回滚

$dsn = "mysql:dbname=mydb;host=localhost";
$pdo = new PDO($dsn,"root","123"); //设置异常模式 如果出现错误,会抛出一个异常,一抛异常,catch抓住
$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); //加事务
try{
//开启事务
$pdo -> beginTransaction(); //调它开启事务 $sql1 = "insert into nation values('n078','是删')";
$sql2 = "insert into nation values('n077','数据')"; $pdo->exec($sql1);
$pdo->exec($sql2); //提交 走到提交的时候能够把事务结束掉
$pdo->commit();
} catch(Exception $e) $e就是异常对象
{
$e->getMessage(); //获取异常信息
//回滚
$pdo->rollBack();
} ?>

1.设置异常模式

$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);

如果出现错误,会抛出一个异常,抛出异常后,catch抓住

2.加事务      try : 试着执行

try{

        先开启事务

        $pdo -> beginTransaction();   调它开启

        提交  

        $pdo->commit();    走到提交的时候能够把事务结束掉

      

     catch : 抓住try里面出现的问题,抓住后执行下面的内容

catch(Exception $e)   pdo异常参数   Exception:异常  $e就是异常对象

        {

               $e->getMessage();   获取异常信息

               回滚

               $pdo->rollBack();

         }

还有一个是final

是配合着try用的,要么加catch,要么加final,也有可能一起
final 是 无论以上try代码是否执行成功,是否有错误,都会最终过来执行它

最后在来看一下  SQL注入攻击

它的表现方式

用户在输入内容的时候,它可以自己拼接一个字符串,来改变我们查询的结果

怎么防范?有几种方式

1. 过滤用户的输入 通过前端用JS也行,用PHP也行

2. 写代码的规范

3. 使用PDO里自带的功能叫预处理语句,来防止SQL注入攻击

<?php
$dsn = "mysql:dbname=mydb;host=localhost";
$pdo = new PDO($dsn,"root","123"); $code ="n001";
//SQL语句里面需要加占位符 ?
$sql = "select * from nation where code='{?}'";
//怎样把注入攻击规避掉
//pdo 提供了一种方式叫 prepare-> 准备的意思
//准备执行,返回PDOStatement对象
$st = $pdo->prepare($sql); //调用绑定参数的方法来绑定参数
$st->bindParam(1,$code); //1.括号里第一个要写占位符在sql语句里面的位置是几
//2.要写参数 这两个是必须要写的 //执行方法
$st->execute();
$attr = $st->fetchAll();
var_dump($attr); ?>

PDO概念 分析 练习的更多相关文章

  1. Ajax 概念 分析 举例

    Ajax是结合了访问数据库,数据访问,Jquery 可以做页面局部刷新或者说是页面不刷新,我可以让页面不刷新,仅仅是数据的刷新,没有频繁的刷页面,是现在比较常用的一种方式做页面那么它是怎么实现页面无刷 ...

  2. 全面认识.NET框架(一)

    重新学习下.NET框架,在这里将会对.net框架逐步的学.加深一下对.net的认识.如果那个地方有错误,希望大家能够指出来.谢谢. 知识有限,先逐步了解下.net包含的什么.我就是写写我目前想了解的内 ...

  3. 深入理解C语言内存管理

    之前在学Java的时候对于Java虚拟机中的内存分布有一定的了解,但是最近在看一些C,发现居然自己对于C语言的内存分配了解的太少. 问题不能拖,我这就来学习一下吧,争取一次搞定. 在任何程序设计环境及 ...

  4. 多进程操作-进程队列multiprocess.Queue的使用

    一.ipc机制 进程通讯 管道:pipe 基于共享的内存空间 队列:pipe+锁 queue 下面拿代码来实现Queue如何使用: 案例一: from multiprocessing import Q ...

  5. PDO防sql注入原理分析

    使用pdo的预处理方式可以避免sql注入. 在php手册中'PDO--预处理语句与存储过程'下的说明: 很多更成熟的数据库都支持预处理语句的概念.什么是预处理语句?可以把它看作是想要运行的 SQL 的 ...

  6. MySQL 主从复制与读写分离概念及架构分析

    1.MySQL主从复制入门 首先,我们看一个图: 影响MySQL-A数据库的操作,在数据库执行后,都会写入本地的日志系统A中. 假设,实时的将变化了的日志系统中的数据库事件操作,在MYSQL-A的33 ...

  7. jQuery 2.0.3 源码分析 Deferred概念

    JavaScript编程几乎总是伴随着异步操作,传统的异步操作会在操作完成之后,使用回调函数传回结果,而回调函数中则包含了后续的工作.这也是造成异步编程困难的主要原因:我们一直习惯于“线性”地编写代码 ...

  8. 【荐】PDO防 SQL注入攻击 原理分析 以及 使用PDO的注意事项

    我们都知道,只要合理正确使用PDO,可以基本上防止SQL注入的产生,本文主要回答以下几个问题: 为什么要使用PDO而不是mysql_connect? 为何PDO能防注入? 使用PDO防注入的时候应该特 ...

  9. JavaBean 基础概念、使用实例及代码分析

    JavaBean 基础概念.使用实例及代码分析 JavaBean的概念 JavaBean是一种可重复使用的.且跨平台的软件组件. JavaBean可分为两种:一种是有用户界面的(有UI的):另一种是没 ...

随机推荐

  1. 一起来玩echarts系列(一)------箱线图的分析与绘制

    一.箱线图 Box-plot 箱线图一般被用作显示数据分散情况.具体是计算一组数据的中位数.25%分位数.75%分位数.上边界.下边界,来将数据从大到小排列,直观展示数据整体的分布情况. 大部分正常数 ...

  2. dagger2系列之依赖方式dependencies、包含方式(从属方式)SubComponent

    本篇是实战文章,从代码的角度分析这两种方式.本文参考自下列文章: http://www.jianshu.com/p/1d42d2e6f4a5 http://www.jianshu.com/p/94d4 ...

  3. IOS开发基础知识--碎片51

    1:https关闭证书跟域名的验证 AFSecurityPolicy *securityPolicy = [AFSecurityPolicy defaultPolicy]; securityPolic ...

  4. Linux实战教学笔记07:Linux系统目录结构介绍

    第七节 Linux系统目录结构介绍 标签(空格分隔):Linux实战教学笔记 第1章 前言 windows目录结构 C:\windows D:\Program Files E:\你懂的\精品 F:\你 ...

  5. ubuntu-14.04-server配置Jexus --安装步骤记录

    作者:郝喜路   个人主页:http://www.cnicode.com      博客地址:http://haoxilu.cnblogs.com 说明:我是Linux菜鸟,自己尝试配置Jexus服务 ...

  6. 纯JS打造比QQ空间更强大的图片浏览器-支持拖拽、缩放、过滤、缩略图等

    在线演示地址(打开网页后,点击商家图册): http://www.sport7.cn/cc/jiangnan/football5.html 先看一看效果图: 该图片浏览器实现的功能如下: 1. 鼠标滚 ...

  7. ucos实时操作系统学习笔记——任务间通信(信号量)

    ucos实时操作系统的任务间通信有好多种,本人主要学习了sem, mutex, queue, messagebox这四种.系统内核代码中,这几种任务间通信机制的实现机制相似,接下来记录一下本人对核心代 ...

  8. smartcrop.js智能图片裁剪库

    今天将为大家介绍一款近期github上很不错的开源库 – smartcrop.js.它是一款图片处理的智能裁剪库.在很多项目开发中,经常会遇见上传图片的场景,它可能是用户照片信息,也可能是商品图片等. ...

  9. 弄了一个支持SSL的TCP客户端

    近日需要做一些TCP的收发的调试,到网上去找TCP调试工具,找了好几款,发现不是功能不全就是不支持HEX,更重要的SSL也不支持,于是动手写了一款,叫TCPRunner,有以下特性: 使用异步IO方式 ...

  10. EasyPR--开发详解(8)文字定位

    今天我们来介绍车牌定位中的一种新方法--文字定位方法(MSER),包括其主要设计思想与实现.接着我们会介绍一下EasyPR v1.5-beta版本中带来的几项改动. 一. 文字定位法 在EasyPR前 ...