首页 后端开发 php教程 PHP中PDO实例详解

PHP中PDO实例详解

Mar 01, 2018 am 10:54 AM
php 实例 详解

1. 何为PDO?

PDO(PHP数据对象) 是一个轻量级的、具有兼容接口的PHP数据连接拓展,是一个PHP官方的PECL库,随PHP 5.1发布,需要PHP 5的面向对象支持,因而在更早的版本上无法使用。它所提供的数据接入抽象层,具有与具体数据库类型无关的优势,为它所支持的数据库提供统一的操作接口。目前支持的数据库有Cubrid、FreeTDS / Microsoft SQL Server / Sybase、Firebird/Interbase 6、IBM DB2、IBM Informix Dynamic Server、MySQL 3.x/4.x/5.x、Oracle Call Interface、ODBC v3 (IBM DB2, unixODBC and win32 ODBC)、PostgreSQL、SQLite 3 and SQLite 2、Microsoft SQL Server / SQL Azure等。由于PDO是在底层实现的统一的数据库操作接口,因而利用它能够实现更高级的数据库操作,比如存储过程的调度等。

2. PDO实例

下面将实现一个用PDO连接SQLite数据库的实现分页显示的例子,查询的结果输出为JSON数据。

<?php
$cat = isset ($_GET[&#39;cat&#39;]) ? $_GET[&#39;cat&#39;] : "1";
$pg = isset ($_GET[&#39;pg&#39;]) ? $_GET[&#39;pg&#39;] : "1";
 
$limit = 10;
$dbname = &#39;shelf.sqlite&#39;;
try {
$db = new PDO("sqlite:" . $dbname);
$sth = $db->prepare(&#39;select * from book where cat_id=:id limit :offset, :limit&#39;, array (
PDO :: ATTR_CURSOR => PDO :: CURSOR_FWDONLY
));
 
$result = $sth->execute(array (
&#39;:id&#39; => $cat,
&#39;:offset&#39; => ($pg -1) * $limit,
&#39;:limit&#39; => $limit
));
$list = array ();
$query = $db->query(&#39;select count(*) from book where cat_id=&#39; . $cat)->fetch(); //Only 1 row
$list["count"] = $query[0];
if ($result) {
while ($row = $sth->fetch(PDO :: FETCH_ASSOC)) {
$list["books"][] = $row;
}
} else {
print_r($db->errorInfo());
}
 
$db = NULL;
 
echo str_replace(&#39;\\/&#39;, &#39;/&#39;, json_encode($list));
 
} catch (PDOException $ex) {
print_r($ex);
}
?>
登录后复制

3. PDO中的常量

PDO库中定义了一些静态常量,这些常量用PDO :: 的方式进行调用。比如在prepare()语句中经常这样使用:

$query=$db->prepare(&#39;select * from book where cat_id=:id limit :offset, :limit&#39;, array (
PDO :: ATTR_CURSOR => PDO :: CURSOR_FWDONLY
));
登录后复制

这里的PDO :: ATTR_CURSOR和PDO :: CURSOR_FWDONLY都是PDO常量,这里将数据库的cursor类型设为forward only。

4. PDO中的连接和连接管理

PDO中的连接是通过创建PDO类的实例而建立的。创造时需要提供数据源名称(DSN)及可选的用户名和密码等参数。在这个过程中值得注意的是,如果发生异常,PHP的Zend引擎默认操作是将具体的错误信息显示出来,这就带来一个问题:连接信息(数据位置、用户名、密码等)可能遭到泄露。因此,为严防此类不幸的事情发生,一定要显式捕获异常,无论是用try...catch语句还是用set_exception_handler()函数,隐藏一些敏感数据。所不同的是,调用set_exception_handler()后代码的执行将终止,而采用try...catch的形式,异常之后的代码将继续执行,正如try...catch语句的原意一般(更多请移步:PHP学习笔记之异常捕获与处理)。

<?php
$db = new PDO(&#39;mysql:host=localhost;dbname=test&#39;, $user, $pass);
//使用新建立的数据库连接。
//... ...
//连接在PDO实例的生命周期里是活动的。使用完毕后应当关闭此连接,若不这样做PHP在代码结束时才关闭此连接,将占用一部分内存。
$db = null;
?>
登录后复制

当然,事情并不都是这样,有时我们可能会需要一个永久的连接。具体做法是在PDO的构造函数里再加一个参数:

<?php
$db = new PDO(&#39;mysql:host=localhost;dbname=test&#39;, $user, $pass, array(
    PDO::ATTR_PERSISTENT => true
));
?>
登录后复制

永久的连接能够跨越代码,在一个代码执行完毕时并未被关闭,而是被缓存起来,以供另一段拥有同样权限的代码重复使用。这样便不必每次都新建一个连接,省了不少事不说,还能够加快网站速度。

5. PDO中的查询操作:exec/query/prepared statement

在PDO中有三种方法执行查询操作,分别是用exec、query和使用prepared statement。三种方法各有利弊,先说exec。

(1)PDO::exec()一般用于执行一次的SQL语句,返回受查询影响的行数。它不适用于SELECT语句,如果需要用一次是SELECT语句,可以用PDO::query();也不适用于多次使用的语句,如果有多次使用的需求,考虑用PDO::prepare()。

(2)PDO::query()用于执行一次SELECT语句,执行后应当随即使用PDOStatement::fetch()语句将结果取出,否则立即进行下一次的PDO::query()将会报错。在2.PDO实例部分,为了得到查询数据的总量,就用了PDO::query()语句。

(3)PDOStatement表示一个prepared statement语句,而在执行之后,又将返回一组关联数组的结果。如果一类查询(查询结构相似而具体的参数不一)需要一次解析而执行使用很多次,可以先用prepared statement,这样可以为具体的查询的执行做好准备,避免了分析、编译、优化的循环,将减少资源占用率,从而提高运行效率。通过对数据库进行prepare操作,便会返回PDOStatement数据类型,从而在其基础上展开execute、fetch等进一步的操作。

 
$sth = $db->prepare(&#39;select * from book where cat_id=:id limit :offset, :limit&#39;, array (
PDO :: ATTR_CURSOR => PDO :: CURSOR_FWDONLY
));
//用$limit1得到一个结果
$result1 = $sth->execute(array (
        &#39;:id&#39; => $cat,
        &#39;:offset&#39; => ($pg -1) * $limit1,
        &#39;:limit&#39; => $limit1
    ));
//用$limit2得到另一个结果
$result2 = $sth->execute(array (
        &#39;:id&#39; => $cat,
        &#39;:offset&#39; => ($pg -1) * $limit2,
        &#39;:limit&#39; => $limit2
    ));
登录后复制

使用prepared statement还有一个好处就是,语句里不再使用引号,PDO driver已自动完成这一操作,可以防止SQL注入攻击的危险。查询语句里可以使用包含名字的(:name)和问号(?)的参数占位符,分别将用associated array 和indexed array传入数值。

//用位置参入参数
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)");
$stmt->bindParam(1, $name);
$stmt->bindParam(2, $value);
//用名称传入参数
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)");
$stmt->bindParam(&#39;:name&#39;, $name);
$stmt->bindParam(&#39;:value&#39;, $value);
$name = &#39;one&#39;;
$value = 1;
$stmt->execute();
/////////////////////////////////////////////
//也可以这样实现
//用位置参入参数,indexed array
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)");
$name = &#39;one&#39;;
$value = 1;
$stmt->execute(array($name,$value));
//用名称传入参数, associated array
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)");
$name = &#39;one&#39;;
$value = 1;
$stmt->execute(array(&#39;:name&#39;=>$name,&#39;:value&#39;=>$value));
登录后复制

特别注意:查询语句中的占位符应当是占据整个值的位置,如果有模糊查询的符号,应当这样做:

// placeholder must be used in the place of the whole value
$stmt = $dbh->prepare("SELECT * FROM REGISTRY where name LIKE ?");
$stmt->execute(array("%$_GET[name]%"));
//下面这样就有问题了
$stmt = $dbh->prepare("SELECT * FROM REGISTRY where name LIKE &#39;%?%&#39;");
$stmt->execute(array($_GET[&#39;name&#39;]));
登录后复制

相关推荐:

PHP中PDO实现的SQLite操作类

PDO如何操作MySQL

PHP之详解PDO

以上是PHP中PDO实例详解的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前 By 尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
4 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

CakePHP 项目配置 CakePHP 项目配置 Sep 10, 2024 pm 05:25 PM

在本章中,我们将了解CakePHP中的环境变量、常规配置、数据库配置和电子邮件配置。

适用于 Ubuntu 和 Debian 的 PHP 8.4 安装和升级指南 适用于 Ubuntu 和 Debian 的 PHP 8.4 安装和升级指南 Dec 24, 2024 pm 04:42 PM

PHP 8.4 带来了多项新功能、安全性改进和性能改进,同时弃用和删除了大量功能。 本指南介绍了如何在 Ubuntu、Debian 或其衍生版本上安装 PHP 8.4 或升级到 PHP 8.4

CakePHP 日期和时间 CakePHP 日期和时间 Sep 10, 2024 pm 05:27 PM

为了在 cakephp4 中处理日期和时间,我们将使用可用的 FrozenTime 类。

CakePHP 文件上传 CakePHP 文件上传 Sep 10, 2024 pm 05:27 PM

为了进行文件上传,我们将使用表单助手。这是文件上传的示例。

CakePHP 路由 CakePHP 路由 Sep 10, 2024 pm 05:25 PM

在本章中,我们将学习以下与路由相关的主题?

讨论 CakePHP 讨论 CakePHP Sep 10, 2024 pm 05:28 PM

CakePHP 是 PHP 的开源框架。它的目的是使应用程序的开发、部署和维护变得更加容易。 CakePHP 基于类似 MVC 的架构,功能强大且易于掌握。模型、视图和控制器 gu

如何设置 Visual Studio Code (VS Code) 进行 PHP 开发 如何设置 Visual Studio Code (VS Code) 进行 PHP 开发 Dec 20, 2024 am 11:31 AM

Visual Studio Code,也称为 VS Code,是一个免费的源代码编辑器 - 或集成开发环境 (IDE) - 可用于所有主要操作系统。 VS Code 拥有针对多种编程语言的大量扩展,可以轻松编写

CakePHP 创建验证器 CakePHP 创建验证器 Sep 10, 2024 pm 05:26 PM

可以通过在控制器中添加以下两行来创建验证器。

See all articles