PHP数据库扩展 - PDO操作
PDO操作
PDO操作
描述:odp是php对数据库操作统一化的操作
语法:$pdo = new PDO("DB名:host=主机名;dbname=DB名","DB账号","DB密码");
//注:第一个db名为数据的类型,如:mysql、Oracle
//因为数据调用的方式为生成对象去操作,程序可以生产多个对象多次调用,这样容易操作数据库操作的不可避免的错误,所以可以使用单例模式(即单个对象去操作)进行数据库操作。
例:
<?php
class singletonPdo{
private static $pdo =null; //通过私有+静态声明单例对象
public static function getPdo(){
//通过一个公共的静态方法去返回单例的数据连接对象
if(self::$pdo == null){ //判断单例对象是否存在,不存在即初始化
try{
//生成单例模式的数据库连接对象
self::$pdo =new PDO('mysql:host=localhost','root','root');
}catch(PDOException $e){
echo "连接错误,信息为:".$e->getMessage();
}
}
return self::$pdo; //存在则直接返回
}
}
?>
最后,由于数据库的多次重复性的操作,我们可以创建一个单独php文件来存放单例的PDO类,需要使用即通过require_once ‘XX.php’;的方式进行调用。
//require_once语法代表意思为调用一次,可以重复多少调用。
//调用之后使用 类名字::自己定义的静态方法 (例:singletonPdo:: getPdo();)得到pdo单例数据库连接对象
PDO的异常处理Exception
1.连接数据库时发生的错误:直接使用try...catch捕获即可
2.当数据库操作时发生异常的处理方式
(1)第一种处理方式:直接通过系统提供的errorCode()和errorInfo()属性实现 //默认模式
pdo对象->errorCode();//返回一条错误代码
pdo对象->errorInfo();//返回一条错误信息,并不准确
(2)第二种处理方式:设置数据库操作发生异常的时候,弹出警告,但程序执行不会中断 //警告模式
pdo对象->setAttribute(PDD::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
(3)第三种处理方式: 设置当数据库发生异常的时候,进行中断
$pdo对象->setAttribute(PDD::ATTR_ERRMODE,PDD::ERRMODE_EXCEPTION);
说明:操作异常并不是需要三种都写完,哪怕一种都不写都可以,书写异常是为了在开发过程中对可能出现的问题能得到快速的解决方式
PDO操作数据库的两种方式:
1. 第一种方式:
$pdos->exec(set names utf8); //设置编码格式为utf8避免乱码情况 ,可以不写
$pdos->exec($sql); //$sql对象则为一条sql语句变量
//说明:(1)$pdos为pdo连接对象,exec()方法相当于query()方法一样
(2)exec()方法返回值为int类型,对查询后的操作没法进行,所以我们使用第二种
2. 第二种方式:预处理
$sql=”insert into userlist values(?,?)”; //定义一条sql语句,但参数使用?为占位符
$pdoso = $pdo->prepare($sql); //使用prepare将半成品的sql语句传递进去
注:prepare();方法只执行半成品的sql语句
//使用数组的方式将参数以数组的方式传递进去,并使用execute方式执行sql语句
echo $pdoso->execute(array(“lisi”,”123456”));
还有一种方式可以传递参数:使用bindValue()方法也可以将参数传递进去
$pdoso->bindValue(1,”lisi”);
$pdoso->bindValue(2,”123456”); //注意:应该有多少就传递多少
$pdoso->execute(); //最后使用execute();方法去执行就可以了
bindColumn()方法 //注:必须在execute方法之后,将执行结果一列数据绑定给一个指定的对象上
语法:$pdoso->bindColumn(int,指定变量); //第一个为列数。第二个为要放进的变量名字
补充:如进行循环遍历对数组进行操作,可以使用 fetch()方法 用于获取结果集的下一行,里面传递一个PDO::FETCH_COLUMN常量,从结果集中的下一行返回所需要的那一列。
语法:$pdoso->fetch(PDO::FETCH_COLUMN)
例:
//预处理操作数据库
require_once 'SingletonPdo.php';
$pdo = singletonPdo::getPdo();
$pdo->exec('set names utf8');
//添加数据操作
$sql = "insert into userlist values('夏明','123456')";
$pdoso = $pdo->prepare($sql);
$result = $pdoso->execute();
//数据库查询
$sql = "select * from userlist where 1";
$pdoso = $pdo->prepare($sql);
$pdoso->execute();
$pdoso->bindColumn(1,$name);
$pdoso->bindColumn(2,$pass);
$info=[];
//通过$pdoso->fetch(PDO::FETCH_COLUMN) 遍历每一条数据,直至最后一条
for($i=0;$row = $pdoso->fetch(PDO::FETCH_COLUMN);$i++){
$info[$i] =array('username'=>$name,'password'=>$pass);
}
print_r($info); //数据已经放到$info数组之中,将他打印出来
事务处理transaction
概念:多个事件组成的结构 事件:实际上就是指预处理的execut方法
整个事务必须放在try...catch中,因为不能保证每条都能成功运行,而且对事务来说任何一条都会导致catch的触发,所以我们在catch中添加添加回滚操作:$pdo->rollback()对所有操作进行还原
语法:开启事务:$pdo->benginTransaction(); 关闭事务:$pdo->commit();
注意:
- 然后为了防止乱码问题,应当设置一下编码格式:$pdo->(“set names utf8”);
- 为了当运行时发生错误因该中断操作进行还原,而不是关闭事务,所以在生成单例连接数据库对象后我们应该添加一句中断处理异常语句:
$pdo对象->setAttribute(PDD::ATTR_ERRMODE,PDD::ERRMODE_EXCEPTION);
例:
<?php
class newPdo{
private static $pdo;
public static function getPdo(){
if(self::$pdo==null){
try{
self::$pdo =new PDO("mysql:host=localhost;dbname=db","root","root");
//为了在事务处理中出现错误时中断然后进行还原操作,所以增加一句中断操作语句
self::$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
}catch(PDOException $err){
echo '连接错误!'.$err->getMessage();
}
}
return self::$pdo;
}
}
?>
<?php
class newPdo{
private static $pdo;
public static function getPdo(){
if(self::$pdo==null){
try{
self::$pdo =new PDO("mysql:host=localhost;dbname=db","root","root");
//为了在事务处理中出现错误时中断然后进行还原操作,所以增加一句中断操作语句
self::$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
}catch(PDOException $err){
echo '连接错误!'.$err->getMessage();
}
}
return self::$pdo;
}
}
?>
PHP数据库扩展 - PDO操作的更多相关文章
- PHP数据库基于PDO操作类(mysql)
这是网上找的关于Mysql的操作类,非常适合初学者使用 <?php class Mysql { protected static $_dbh = null; //静态属性,所有数据库实例共用,避 ...
- php笔记08:数据库编程---使用php的MySQL扩展库操作MySQL数据库
1.使用php的MySQL扩展库操作MySQL数据库: php有3种方式操作MySQL数据库 (1)mysql扩展库 (2)mysqli扩展库 (3)pdo mysql扩展库与mysql数据库 ...
- PHP 笔记——PDO操作数据库
一.简介 PHP 5.1可使用轻量级的统一接口 PDO(PHP Data Object,PHP数据对象)来访问各种常见的数据库.而使用PDO只需要指定不同的 DSN(数据源名称)即可访问不同的数据 ...
- 使用PDO操作数据库的好处
PDO一是PHP数据对象(PHP Data Object)的缩写. 并不能使用PDO扩展本身执行任何数据库操作,必须使用一个database-specific PDO driver(针对特定数据库的P ...
- php pdo操作数据库
POD扩展是在PHP5中加入,该扩展提供PHP内置类 PDO来对数据库进行访问,不同数据库使用相同的方法名,解决数据库连接不统一的问题. PDO的特点: 性能.PDO 从一开始就吸取了现有数据库扩展成 ...
- php pdo操作数据库的方法
PDO 安装 你可以通过 PHP 的 phpinfo() 函数来查看是否安装了PDO扩展. 1.在 Unix /linux系统上安装 PDO 在Unix上或Linux上你需要添加以下扩展: exten ...
- mysqli扩展库操作mysql数据库
配置环境 配置php.ini文件让php支持mysqli扩展库 extension=php_mysqli.dll 建库建表 详见博客 “mysql扩展库操作mysql数据库” 查询数据库 <?p ...
- mysql扩展库操作mysql数据库
环境搭建 启用mysql扩展库,在php.ini文件中去配置mysql扩展库 extension=php_mysql.dll 查询数据库 1.建库建表 //建库testcreate database ...
- 使用php的mysqli扩展库操作mysql数据库
简单介绍mysqli: 1.mysqli(mysql improve mysql扩展库的增强版) mysql扩展库和mysqli扩展库的区别 1.mysqli的稳定性 安全性 和 执行效率有所提高 ...
随机推荐
- java 使用 spirng 监控 cpu 使用 状态。。。。
首先..使用 sigar ,sigar 使用 要 注意区分 是 web 还是 本地..最好 在 WEB-INF 下 复制 dll 文件..因为WEB-INF 不会被压缩... try { //如果是 ...
- php与MySQL与echart综合使用
http://www.yinghualuowu.com/php/echart.html 创建table sex 有name num <?php ini_set('disp ...
- 1088 Rational Arithmetic(20 分)
For two rational numbers, your task is to implement the basic arithmetics, that is, to calculate the ...
- myeclipse非正常关闭处理办法
myeclipse正常或非正常关闭后,再次运行,不显示启动时的logo和读条,进入主页面后程序基本就卡死,无法正常运行,解决办法. 方法一:修改工作空间在刚启动Myeclipse的时候会有一个选择工作 ...
- 20-----定位 (Position)
定位 定位有三种: 1.相对定位 2.绝对定位 3.固定定位 这三种定位,每一种都暗藏玄机,所以我们要一一单讲. 相对定位 相对定位:相对于自己原来的位置定位 现象和使用: 1.如果对当前元素仅仅设置 ...
- JD孔_20160912
1.买的 “航嘉(Huntkey)大白803 8位3米 总控开关 防过载保护 插座/排插/拖” http://item.jd.com/1786149.html#product-detail 2.
- 记一次序列化的JSON解析问题
目录 一.问题初探 二.问题原因 三.解决问题 一.问题初探 我今天在使用Ribbon 远程调用的时候 消费者去消费服务端所提供的服务,在使用Post请求中的PostForEntity传递参数的时候, ...
- 50个必备的jQuery代码段
本文会给你们展示50个jquery代码片段,这些代码能够给你的javascript项目提供帮助.其中的一些代码段是从jQuery1.4.2才开始支持的做法,另一些则是真正有用的函数或方法,他们能够帮助 ...
- Matlab之数据处理
写在前面的,软件不太强大,每次保存都需要生成rec和dark的文件,在处理是只需要一个就行了,所有网上查看了下运用批处理的命令去掉多余的文件: 解决办法:windows命令模式下CMD进入文件的目录, ...
- 子元素的margin-top会影响父元素
---恢复内容开始--- 之前在写项目的时候,发现原本想让父子元素之间加点边距,却让父元素产生了margin-top,于是百度之后发现了原因. 在css2.1盒模型中 In this specific ...