백엔드 개발 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 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

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:28 PM

CakePHP는 PHP용 오픈 소스 프레임워크입니다. 이는 애플리케이션을 훨씬 쉽게 개발, 배포 및 유지 관리할 수 있도록 하기 위한 것입니다. CakePHP는 강력하고 이해하기 쉬운 MVC와 유사한 아키텍처를 기반으로 합니다. 모델, 뷰 및 컨트롤러 gu

CakePHP 파일 업로드 CakePHP 파일 업로드 Sep 10, 2024 pm 05:27 PM

파일 업로드 작업을 위해 양식 도우미를 사용할 것입니다. 다음은 파일 업로드의 예입니다.

CakePHP 유효성 검사기 만들기 CakePHP 유효성 검사기 만들기 Sep 10, 2024 pm 05:26 PM

컨트롤러에 다음 두 줄을 추가하면 유효성 검사기를 만들 수 있습니다.

PHP 개발을 위해 Visual Studio Code(VS Code)를 설정하는 방법 PHP 개발을 위해 Visual Studio Code(VS Code)를 설정하는 방법 Dec 20, 2024 am 11:31 AM

VS Code라고도 알려진 Visual Studio Code는 모든 주요 운영 체제에서 사용할 수 있는 무료 소스 코드 편집기 또는 통합 개발 환경(IDE)입니다. 다양한 프로그래밍 언어에 대한 대규모 확장 모음을 통해 VS Code는

CakePHP 빠른 가이드 CakePHP 빠른 가이드 Sep 10, 2024 pm 05:27 PM

CakePHP는 오픈 소스 MVC 프레임워크입니다. 이를 통해 애플리케이션 개발, 배포 및 유지 관리가 훨씬 쉬워집니다. CakePHP에는 가장 일반적인 작업의 과부하를 줄이기 위한 여러 라이브러리가 있습니다.

PHP에서 HTML/XML을 어떻게 구문 분석하고 처리합니까? PHP에서 HTML/XML을 어떻게 구문 분석하고 처리합니까? Feb 07, 2025 am 11:57 AM

이 튜토리얼은 PHP를 사용하여 XML 문서를 효율적으로 처리하는 방법을 보여줍니다. XML (Extensible Markup Language)은 인간의 가독성과 기계 구문 분석을 위해 설계된 다목적 텍스트 기반 마크 업 언어입니다. 일반적으로 데이터 저장 AN에 사용됩니다

See all articles