相关文章: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. Hibernate→ 《Hibernate程序开发》教材大纲

    Hibernate ORM 概览 Hibernate 简介 Hibernate 架构 Hibernate 环境 Hibernate 配置 Hibernate 会话 Hibernate 持久化类 Hib ...

  2. DAY1-作业

    Python-day1-------> 本节内容: Python介绍 发展史 Python 2 or 3? 安装 Hello World程序 变量 用户输入 模块初识 .pyc是个什么鬼? 数据 ...

  3. 块级元素及内联元素对margin、padding的态度

    1.块级元素 margin:跟标准一样,设置该块级元素边框与同级兄弟元素或者父元素的距离,俗称外边距. padding:先延伸边框(也就是优先改变元素尺寸而不动元素中内容的位置),当边框碰到父元素的边 ...

  4. HZOJ Silhouette

    转化一下题意:给出矩阵每行每列的最大值,求满足条件的矩阵个数. 先将A,B按从大到小排序,显然没有什么影响.如果A的最大值不等于B的最大值那么无解否则一定有解. 考虑从大到小枚举A,B中出现的数s,那 ...

  5. 【NS2】NS2在ubuntu下的安装

    Step1: 更新系统.在终端输入如下命令 sudo apt-get  update #更新源列表sudo apt-get upgrade #更新已经安装的包sudo apt-get dist-upg ...

  6. Java面向对象----方法重载

    方法重载(over load):方法名相同,参数列表不同,返回类型无关 package com.tanlei.newer; public class OverLoadDemo { public sta ...

  7. PyTorch入门学习(二):Autogard之自动求梯度

    autograd包是PyTorch中神经网络的核心部分,简单学习一下. autograd提供了所有张量操作的自动求微分功能. 它的灵活性体现在可以通过代码的运行来决定反向传播的过程, 这样就使得每一次 ...

  8. 选用适合的ORACLE优化器

    ORACLE的优化器共有3种: a.  RULE (基于规则)   b. COST (基于成本)  c. CHOOSE (选择性) 设置缺省的优化器,可以通过对init.ora文件中OPTIMIZER ...

  9. vlc 网页插件的 使用与控制 API

    下面开始使用教程: html文档结构: <object class="vlc" type='application/x-vlc-plugin' events='True' w ...

  10. hdu 1384 Intervals (差分约束)

    Problem - 1384 好歹用了一天,也算是看懂了差分约束的原理,做出第一条查分约束了. 题意是告诉你一些区间中最少有多少元素,最少需要多少个元素才能满足所有要求. 构图的方法是,(a)-> ...