PDO 用法学习

PDO: php data object
数据库访问抽象层

基于驱动:
1、安装扩展
php_pdo.dll
2、安装驱动 php_pdo_mysql.dll

linux 编译时参数:--with-pdo=mysql=/usr/local/mysql

三个类:
PDO类, 数据库连接有关(连接、执行sql)
PDOStatement 准备语句,处理结果集
PDOException
异常处理类
一些常量

相比mysqli方法少,常量多

dsn:data source name(数据源)
#部分参数可以省略,参数没有顺序
mysql: #最短 会自动调取 php.in 中
mysql.default_host 参数信息

dsn示例:


mysql:host=localhost;port=3307;dbname=testdb
mysql:unix_socket=/tmp/mysql.sock;dbname=testdb

获取pdo对象


$dsn = "mysql:host=127.0.0.1;port=3306;dbname=test";
$opts = array(PDO::ATTR_AUTOCOMMIT=>0, PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION, PDO::ATTR_AUTOCOMMIT=>0 #关闭自动提交);
$pdo = new PDO($dsn, ‘root‘, ‘‘, $opts);
ee($pdo->getAttribute(PDO::ATTR_AUTOCOMMIT)); // setAttribute 可以设置属性

执行sql exec() query() perpare();
1、返回 PDOStatement 对象 query select
#PDOStatement是专门用来处理结果集的
2、返回影响行数(int) exec insert delete update

PDO::ERRMODE_SILENT(0) :默认 不提示任何错误
PDO::ERRMODE_WARNING(1) :
警告
PDO::ERRMODE_EXCEPTION(2):异常(推荐使用) 用try catch捕获,也可以手动抛出异常 new
PDOException($message, $code, $previous)


#exec用法
try {
$sql = "insert into limove(`id`, `name`, `order`) values(null, ‘sjk‘, 1)";
$rows = $pdo->exec($sql);  //影响的条数
$pdo->lastInsertId(); //最后插入的id
} catch (Exception $e) {
ee($pdo->errorInfo());
}

预处理语句(prepare)示例


$dsn = "mysql:host=127.0.0.1;port=3306;dbname=test";
$opts = array(PDO::ATTR_AUTOCOMMIT=>0, PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION, PDO::ATTR_AUTOCOMMIT=>0);
try {
$pdo = new PDO($dsn, ‘root‘, ‘‘, $opts);
}catch(PDOException $e){
echo $e->getMessage();
}

/* pdo中有两种占位符号
*
* ? 参数 --- 索引数组, 按索引顺序使用
* 名子参数 ----关联数组, 按名称使用,和顺序无关
*/

//准备好了一条语句,并入到服务器端,也已经编译过来了,就差为它分配数据过来
//同样适用于更新操作
$stmt=$pdo->prepare("insert into limove(`name`, `order`) values(:name,:order)");

//绑定参数,引用方式传递
$stmt->bindParam(":name", $name);
$stmt->bindParam(":order", $order);

// $stmt=$pdo->prepare("insert into limove(`name`, `order`) values(?, ?)"); //所有SQL都可执行

// //绑定参数,引用方式传递
// $stmt->bindParam(1, $name, PDO::PARAM_STR);
// $stmt->bindParam(2, $order, PDO::PARAM_INT);

$name="wwww";
$order = 1;

if($stmt->execute()){
echo "执行成功";
echo "最后插入的ID:".$pdo->lastInsertId();
}else{
echo "执行失败!";
}

还支持执行时绑定


    #无序方式
$stmt=$pdo->prepare("insert into shops(name, price, num, desn) values(:name,:price, :num, :desn)");
$stmt->execute(array(":price"=>77, ":name"=>"kkk3", ":num"=>"453", ":desn"=>"aaaaaa3"));

#有序方式
$stmt=$pdo->prepare("insert into shops(name, price, num, desn) values(?, ?, ?, ?)"); //所有SQL都可执行
$stmt->execute(array("myname1", 11.2, 55, "very good"));

获取结果


//获取结果
$stmt = $pdo->prepare("select * from limove where `order` = :order");
$stmt->execute(array(‘:order‘=>8));

//设置获取的方式
$stmt->setFetchMode(PDO::FETCH_ASSOC);

$data = array();

//方式1
//$data = $stmt->fetchAll();

//方式2
while($row = $stmt->fetch(PDO::FETCH_ASSOC))
{
$data[] = $row;
}
ee($data);


//bindColumn 把取出的值绑定到一个变量上
$stmt->bindColumn(‘name‘, $name);


#所有的条数,select insert delete update
$stmp->rowCount();

事务举例:


<?php
try{
$pdo=new PDO("mysql:host=localhost;dbname=xsphpdb", "root", "123456", array(PDO::ATTR_AUTOCOMMIT=>0)); #一定要关闭自动提交
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); #开启异常模式
}catch(PDOException $e){
echo "数据库连接失败:".$e->getMessage();
exit;
}

//执行SQL语句 exec() query() prepare()
//一是有结果集的query(), 执行select语句
//exec()用来执行有影响行数的,update, delete insert, other
//exec()返回的是影响的行数
/*
*
* 事务处理
*
* 张三从李四那里买了一台 2000 元的电脑
*
* 从张三帐号中扣出 2000元
*
* 向李四账号中加入 2000元
*
* 从商品表中减少一台电脑
*
* MyIsAM InnoDB
*
*/

try{
$pdo->beginTransaction();

$price=500;

$sql="update zhanghao set price=price-{$price} where id=1";

$affected_rows=$pdo->exec($sql);

if(!$affected_rows)
throw new PDOException("张三转出失败");

$sql="update zhanghao set price=price+{$price} where id=3";

$affected_rows=$pdo->exec($sql);

if(!$affected_rows) #发现问题手动抛出异常
throw new PDOException("向李四转入失败");

echo "交易成功!";
$pdo->commit();
}catch(PDOException $e){
echo $e->getMessage();
$pdo->rollback(); //只要捕获异常则回滚
}

//不管执行成功还是失败最后都要在关闭自动提交
$pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, 1);

//设置错误报告模式 ERRMODE_SILENT ERRMODE_WARNING

PDO 用法学习,布布扣,bubuko.com

时间: 2024-07-30 10:18:04

PDO 用法学习的相关文章

Tomcat详细用法学习(三)

本篇接上一篇<Tomcat详细用法学习(二)>,主要讲解服务器所要求的web应用的组织结构. 上一篇说到了如何使用服务器将自己的web应用映射成虚拟目录,以便于在浏览器中可以对自己开发的web资源进行访问.但是在开发自己的web应用时,也要有符合服务器规定的组成结构,这样服务器在进行虚拟目录映射供外界访问时才知道哪些该作为可访问内容,哪些是配置文件不需要暴露给外界. 如果我们有一个web应用,名称为“mail”(同时也是web应用所在目录的名称),那么其目录内不同类型的文件应该服从如下放置的规

Tomcat详细用法学习(五)

本篇接上一篇<Tomcat详细用法学习(四)>,主要讲解Tomcat服务器的管理平台 我们可能会将很多web应用交给Tomcat,那么Tomcat服务器就要对我们这些载入的web应用进行管理,那么从哪里进入Tomcat服务器的管理平台呢?首先我们将Tomcat服务器启动,进入其主页,发现右侧三项“Server Status”.“Manager App”.“Host Manager”点击时都需要输入密码: 需要密码 那么用户名和密码是什么呢? 这就要看Tomcat的[conf]目录中的[tomc

Tomcat详细用法学习(二)

本篇接上一篇<Tomcat详细用法学习(二)>,主要讲解服务器的虚拟目录映射和web应用的组织结构. 先来看几个概念: web应用的概念:一个web应用包含了许多我们做好的web资源,里面或许包括了多个静态web资源和动态web资源,如html.css.js文件,jsp文件,Java程序,jar包和配置文件等等,如我在Tomcat的[webapps]目录下的自定义目录[fjdingsdapp]中包含了一个“1.html”文件,那么这个在[fjdingsdapp]整个可以运行文件中的所有资源可以

Linux中rename命令用法学习 修改文件名

如何用命令修改文件名呢?在linux下可以用rename命令,当然还可以使用mv命令,这里分享下linux rename命令的用法. 有一部分人说linux下没有rename命令,建议大家用mv命令.对rename命令和mv命令在重命名文件方面做一个比较,大家根据个人喜欢选择使用吧. mv命令,在man mv中对于mv命令的介绍:mv -move(rename) files 可以看到mv命令确实有重命名的功能,但是实际应用中,它只能对单个文件重命名,命令如下:mv [path/]oldfilen

[爬虫学习笔记]MemoryCache缓存的用法学习

      在完成了DNS解析模块之后,我意识到了DNS缓存机制也很有必要.在Redis,Memcache,和.Net自带的Cache之间,考虑到部署问题,最终选择了后者,之前在学习Web及开发的过程中用过System.Web.Caching.Cache这个类库,但是这次的爬虫程序我打算部署为桌面软件,所以选用了System.Runtime.Caching.MemoryCache(后期如有必要也会加入System.Web.Caching.Cache来适配Web端程序).       Memory

python string用法学习ing

#!/usr/bin/env python #-*- coding:UTF-8 -*- ##################################################### # Author: sunfx   [email protected] # Last modified:  2014/11/11 # Filename:  string.py # Q  Q  群:  236147801 ##########################################

Android之ListView——ArrayAdapter的用法学习

当我们使用ListView时,必不可少的便会使用到adapter,adapter的用处就像是一个水管接口,把你想展现的数据与你希望展现的布局样式通过某种协定结合起来. ArrayAdapter针对每个你想展示的列表项情况,你需要定义一个你的ArrayAdapter, 下面介绍一下如何定义一个你想要的水管接口: 对于每一项的展示内容,你需要设定一个对应的数据类,比如说你想展示一个城市列表,每项中有一个TextView和CheckBox,显示一个城市和它的选中情况,理论上你的数据类中就需要提供这些所

xAML中一些控件的用法学习

首先,介绍一些比较简单的设计,这些可以直接通过拖拽实现.如下例子: <Window x:Class="wpf1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Heig

List&lt;T&gt;.Find用法学习

泛型集合List<T>中的Find函数用于查找集合中符合指定条件的元素..相比foreach遍历元素,用Find函数查找,代码更简洁. 函数原型如下: public T Find(Predicate<T> match); 其中Predicate为C#定义好的委托,原型如下: public delegate bool Predicate<in T>(T obj); 所以,List.Find函数的参数,就是一个 返回值为bool,入参为T类型的函数.当然,可以是命名函数也可