首页 后端开发 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脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

<🎜>:泡泡胶模拟器无穷大 - 如何获取和使用皇家钥匙
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系统,解释
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆树的耳语 - 如何解锁抓钩
3 周前 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)

热门话题

Java教程
1665
14
CakePHP 教程
1423
52
Laravel 教程
1321
25
PHP教程
1269
29
C# 教程
1249
24
PHP和Python:比较两种流行的编程语言 PHP和Python:比较两种流行的编程语言 Apr 14, 2025 am 12:13 AM

PHP和Python各有优势,选择依据项目需求。1.PHP适合web开发,尤其快速开发和维护网站。2.Python适用于数据科学、机器学习和人工智能,语法简洁,适合初学者。

PHP行动:现实世界中的示例和应用程序 PHP行动:现实世界中的示例和应用程序 Apr 14, 2025 am 12:19 AM

PHP在电子商务、内容管理系统和API开发中广泛应用。1)电子商务:用于购物车功能和支付处理。2)内容管理系统:用于动态内容生成和用户管理。3)API开发:用于RESTfulAPI开发和API安全性。通过性能优化和最佳实践,PHP应用的效率和可维护性得以提升。

PHP:网络开发的关键语言 PHP:网络开发的关键语言 Apr 13, 2025 am 12:08 AM

PHP是一种广泛应用于服务器端的脚本语言,特别适合web开发。1.PHP可以嵌入HTML,处理HTTP请求和响应,支持多种数据库。2.PHP用于生成动态网页内容,处理表单数据,访问数据库等,具有强大的社区支持和开源资源。3.PHP是解释型语言,执行过程包括词法分析、语法分析、编译和执行。4.PHP可以与MySQL结合用于用户注册系统等高级应用。5.调试PHP时,可使用error_reporting()和var_dump()等函数。6.优化PHP代码可通过缓存机制、优化数据库查询和使用内置函数。7

PHP的持久相关性:它还活着吗? PHP的持久相关性:它还活着吗? Apr 14, 2025 am 12:12 AM

PHP仍然具有活力,其在现代编程领域中依然占据重要地位。1)PHP的简单易学和强大社区支持使其在Web开发中广泛应用;2)其灵活性和稳定性使其在处理Web表单、数据库操作和文件处理等方面表现出色;3)PHP不断进化和优化,适用于初学者和经验丰富的开发者。

PHP与Python:了解差异 PHP与Python:了解差异 Apr 11, 2025 am 12:15 AM

PHP和Python各有优势,选择应基于项目需求。1.PHP适合web开发,语法简单,执行效率高。2.Python适用于数据科学和机器学习,语法简洁,库丰富。

PHP和Python:代码示例和比较 PHP和Python:代码示例和比较 Apr 15, 2025 am 12:07 AM

PHP和Python各有优劣,选择取决于项目需求和个人偏好。1.PHP适合快速开发和维护大型Web应用。2.Python在数据科学和机器学习领域占据主导地位。

PHP与其他语言:比较 PHP与其他语言:比较 Apr 13, 2025 am 12:19 AM

PHP适合web开发,特别是在快速开发和处理动态内容方面表现出色,但不擅长数据科学和企业级应用。与Python相比,PHP在web开发中更具优势,但在数据科学领域不如Python;与Java相比,PHP在企业级应用中表现较差,但在web开发中更灵活;与JavaScript相比,PHP在后端开发中更简洁,但在前端开发中不如JavaScript。

PHP和Python:解释了不同的范例 PHP和Python:解释了不同的范例 Apr 18, 2025 am 12:26 AM

PHP主要是过程式编程,但也支持面向对象编程(OOP);Python支持多种范式,包括OOP、函数式和过程式编程。PHP适合web开发,Python适用于多种应用,如数据分析和机器学习。

See all articles