相关文章:PHP的mysql扩展整理,操作数据库的实现过程分析    PHPmysqli扩展整理,包括面向过程和面向对象的比较\事务控制\批量执行\预处理

介绍

PDO是一种PHP程序连接数据库的接口,通过PDO可以将PHP程序与数据库联系起来.

优点:

  1.可移植性,可以支持各种主流数据库服务,而且实现代码几乎都是相同的,使用PDO在代码层面上不需要太多操作就可以把一个程序的后台数据库从mysql移植到oracle上

  2,支持事务和预处理等高级操作,能够有效的防止sql注入

环境配置

必须在PHP5.0及以上配置文件中开启PDO相关的数据库扩展

比如想要使用PDO连接mysql数据库,就必须打开PDO_mysql扩展

就在php.ini中找到extension-php_pdo_mysql.dll,把这一行前面的分号去掉

然后使用phpinfo函数查看,如过显示如下图的内容,表示成功开启:

基本流程

首先要创建一个PDO对象,数据库连接的方法就封装在PDO类的构造函数中.实例化PDO类,传入相应的参数,就可以实现数据库的连接:

$pdoObj =new PDO("mysql:host=localhost;dbname=test",'root','root');

PDO类有三个必要的参数,分别是:数据库驱动 登录名 密码

不同类型数据库驱动会有差别,mysql的驱动格式为:  mysql:host=主机名;dbname=数据库名

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

建议开启数据库的异常模式

只有开启了异常模式,才能使用try catch语句才会正常捕获PDOException定义的异常:

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

dml操作实例,给雷小军涨薪100块:

<?php
try{
$pdoObj =new PDO("mysql:host=localhost;dbname=test;charset=utf-8",'root','root');
$pdoObj ->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
}catch(PDOException $p){
echo '数据库连接失败'.$p->getMessage();
}
try{
$affect_rows=$pdoObj->exec("update `class` set salary=salary+100 where sname='雷小军'");
echo "影响{$affect_rows}行";
}catch(PDOException $e){
echo "错误:".$e->getMessage();
}

查询操作实例,查询class表中的所有数据 :

<?php
try{
$pdoObj =new PDO("mysql:host=localhost;dbname=test;charset=utf8",'root','root');
$pdoObj ->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
}catch(PDOException $p){
echo '数据库连接失败'.$p->getMessage();
}
try{
$query=$pdoObj->query("select* from class");
while($val=$query->fetch(PDO::FETCH_ASSOC)){
echo "<pre>";
var_dump($val);
} }catch(PDOException $e){
echo "错误:".$e->getMessage();
}

执行查询语句之后,需要使用fetch()函数获取查询的结果集,fetch函数的参数代表获取结果集的类型:

PDO::FETCH_ASSOC:代表获取以关联数组的形式获取结果集

PDO::FETCH_NUM:代表索引数组结果集

如果不填代表索引数组和关联数组都获取到

事务

某程序要实现借款功能,Sheldon借给Penny100块钱,必须将Sheldon的存款减100,把Penny的存款加100,这两个操作要么都成功,要么都失败,这时就要用到事务:

首先需要关闭sql语句自动提交功能,并且开启事务:

$pdoObj->setAttribute(PDO::ATTR_AUTOCOMMIT,0);
$pdoObj->beginTransaction();

然后执行两个update语句,如果成功,提交修改,如果失败,就回滚:

$affect_rows['borrow']=$pdoObj->exec("update `class` set salary=salary-{$many} where sname='谢尔顿李库伯'");
$affect_rows['get']=$pdoObj->exec("update `class` set salary=salary+{$many} where sname='佩妮'");
if ($affect_rows['borrow']&&$affect_rows['get']){
$pdoObj->commit();
}
  else {
    $pdoObj->commit();
  }

脚本执行结束后需要开启自动提交功能:

$pdoObj->setAttributeZ(PDO::ATTR_AUTOCOMMED,1);
<?php
try{
$pdoObj =new PDO("mysql:host=localhost;dbname=test",'root','root');
$pdoObj ->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
//关闭自动提交
$pdoObj->setAttribute(PDO::ATTR_AUTOCOMMIT,0);
}catch(PDOException $p){
echo '数据库连接失败'.$p->getMessage();
}
try{
//开启事务
$pdoObj->beginTransaction(); $many =100;
$affect_rows=array('borrow'=>0,'get'=>0);
$affect_rows['borrow']=$pdoObj->exec("update `class` set salary=salary-{$many} where sname='谢尔顿李库伯'");
$affect_rows['get']=$pdoObj->exec("update `class` set salary=salary+{$many} where sname='佩妮'");
if ($affect_rows['borrow']&&$affect_rows['get']){
$pdoObj->commit();
}
}catch(PDOException $e){
echo "错误:".$e->getMessage().'<br />';
$pdoObj->rollBack();
echo '转账失败';
} //事务操作完成之后开启自动提交
$pdoObj->setAttribute(PDO::ATTR_AUTOCOMMIT,1);

预处理

预处理操作采用预编译的方式,大大提高了程序的执行效率,还能防止sql注入:

步骤:

1.将要执行的sql语句写在prepare函数里,缺少的参数使用?填充

$stmt = $pdoObj->prepare("insert into `class` values(?,?,?,?,?)");

2.bindParam函数绑定变量

    $stmt->bindParam(1,$id);
$stmt->bindParam(2,$sname);
$stmt->bindParam(3,$gender);
$stmt->bindParam(4,$company);
$stmt->bindParam(5,$salary);

3.传入变量并执行

    $id=31;
$sname='吕布';
$gender='男';
$company='群雄';
$salary=10000;
$fanbu=1000;
$stmt->execute();

当需要执行多组sql语句时,只需要将步骤3复制多组,并且修改参数值即可

完整实例如下:

<?php
try{
$pdoObj =new PDO("mysql:host=localhost;dbname=test",'root','root');
$pdoObj ->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
}catch(PDOException $p){
echo '数据库连接失败'.$p->getMessage();
}
try{
//关联数组的形式
$stmt = $pdoObj->prepare("insert into `class` values(:id,:sname,:gender,:company,:salary)");
$stmt->bindParam("id",$id);
$stmt->bindParam("sname",$sname);
$stmt->bindParam("gender",$gender);
$stmt->bindParam("company",$company);
$stmt->bindParam("salary",$salary);
$stmt->bindParam("fanbu",$fanbu); $id=31;
$sname='吕布';
$gender='男';
$company='群雄';
$salary=10000;
$stmt->execute(); $id=32;
$sname='马超';
$gender='男';
$company='蜀汉';
$salary=10000;
$stmt->execute(); $id=33;
$sname='典韦';
$gender='男';
$company='群雄';
$salary=10000;
$stmt->execute();
}catch(PDOException $e){
echo "错误:".$e->getMessage().'<br />';
$pdoObj->rollBack();
echo '转账失败';
}

PHP PDO扩展整理,包括环境配置\基本增删改查\事务\预处理的更多相关文章

  1. nodejs笔记五--MongoDB基本环境配置及增删改查;

    一.基本环境配置: 1,首先到官网(http://www.mongodb.org/downloads )下载合适的安装包,然后一步一步next安装,当然可以自己更改安装目录:安装完成之后,配置环境变量 ...

  2. PHP mysqli扩展整理,包括面向过程和面向对象的比较\事务控制\批量执行\预处理

    相关文章:PHP的mysql扩展整理,操作数据库的实现过程分析  PHP PDO扩展整理,包括环境配置\基本增删改查\事务\预处理 介绍 mysqli是PHP程序与mysql数据库进行数据交互的桥梁, ...

  3. 肝 hibernate 配置and增删改查 and 测试

    已经通宵三天撸代码了,现在的我已经养成晚上修仙写代码的节奏了.....最近 刚刚复习到了 hibernate 谈谈 这篇文章就谈谈我对这货的理解吧. 在看这篇文章之前希望你 知道sessionfact ...

  4. GreenDao数据库框架的配置与增删改查

    并非原创,原创地址http://blog.csdn.net/njweiyukun/article/details/51893092 配置-------------------------------- ...

  5. python的Web框架,Django的ORM,模型基础,MySQL连接配置及增删改查

    Django中的ORM简介 ORM概念:对象关系映射(Object Relational Mapping,简称ORM): 用面向对象的方式描述数据库,去操作数据库,甚至可以达到不用编写SQL语句就能够 ...

  6. 模拟django配置环境进行数据增删改查,测试的时候有用

    import os if __name__ == '__main__': os.environ.setdefault('DJANGO_SETTINGS_MODULE','day76.settings' ...

  7. spring的mybatis-puls 配置,增删改查操作,分页

    pom <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.or ...

  8. 使用虚拟机在ubuntu下搭建mongoDB开发环境和简单增删改查操作

    最近在折腾mongodb和nodejs,在imooc上找了一个mongodb的入门教程,跟着里面一步一步的走,下面记录下我操作的步骤和遇到的问题. 课程地址:http://www.imooc.com/ ...

  9. Redis初始化配置及增删改查

    package com.calc.tools import redis.clients.jedis.JedisPool import redis.clients.jedis.Jedis import ...

随机推荐

  1. python的解释器类型

    Python解释器 当我们编写Python代码时,我们得到的是一个包含Python代码的以.py为扩展名的文本文件.要运行代码,就需要Python解释器去执行.py文件. 由于整个Python语言从规 ...

  2. 【JZOJ4901】【NOIP2016提高A组集训第18场11.17】矩阵

    题目描述 他是一名普通的农电工,他以一颗无私奉献的爱岗敬业之心,刻苦钻研业务,以娴熟的技术.热情周到的服务赢得了广大客户的尊敬和赞美.他就是老百姓称为"李电"的李春来. 众所周知, ...

  3. 非接触型手掌静脉识别 PalmSecure™

    静脉识别,使用近红外线读取静脉模式,与存储的静脉模式进行比较,进行本人识别的识别技术.富士通的PalmSecure™,利用该技术,由离开识别装置的位置,使用近红外线拍摄,与预先存储的静脉模式进行比较从 ...

  4. 洛谷 P1342 请柬 最短路+Dijkstra算法

    目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例 输出样例 说明 思路 AC代码 总结 题面 题目链接 P1342 请柬 题目描述 在电视时代,没有多少人观看戏 ...

  5. bzoj2073 PRZ

    Description 一只队伍在爬山时碰到了雪崩,他们在逃跑时遇到了一座桥,他们要尽快的过桥. 桥已经很旧了, 所以它不能承受太重的东西. 任何时候队伍在桥上的人都不能超过一定的限制. 所以这只队伍 ...

  6. iOS图片折叠效果:Layer的contentsRect属性和渐变层

    http://www.cocoachina.com/ios/20150722/12622.html 作者:@吖了个峥 授权本站转载. 前言 此次文章,讲述的是Layer的一个属性contentsRec ...

  7. Nginx 缓存代理

    访问ArcGIS官网的地图瓦片太慢.想到可用NIGIX代理. Nginx是Linux下http代理软件,Windows下也有. 以下为配置方法,注意红色部分. 1.需要在本地proxy_cache_p ...

  8. IMEI校验思路及代码

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  9. 一 linux安装python3

    参考 https://www.cnblogs.com/pyyu/p/7402145.html?tdsourcetag=s_pcqq_aiomsg 1 下载 网址:https://www.python. ...

  10. 关于Spring+mybatis+PageHelper分页插件PageHelper的使用策略

    把插件jar包导入项目(具体上篇有介绍http://blog.csdn.net/qq_33624284/article/details/72821811) spring-mybatis.xml文件中配 ...