php连接数据库之PDO,PDO的简单使用和预定义占位符的使用以及PDOStatement对象的使用,占位符的不同形式,bindValue和bindParam绑定预定义占位符参数的区别

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 本文介绍了PHP中PDO(PHP Data Objects)扩展的基本概念和使用方法。内容包括PDO类和PDOStatement类的介绍,PDO的简单使用,预定义占位符的使用方法,以及PDOStatement对象的使用。文章还讨论了绑定预定义占位符参数的不同形式,即bindValue和bindParam的区别。通过具体示例,展示了如何使用PDO进行数据库连接、数据查询、数据插入等操作。

PDO

PHP 数据对象(PDO)扩展为 PHP 访问数据库定义了一个轻量级的一致接口。实现 PDO 接口的每个数据库驱动可以将特定具体数据库的特性公开作为标准扩展函数。注意不能单独使用 PDO 扩展执行任何数据库功能;必须使用具体数据库的 PDO 驱动程序来访问数据库服务器。

PDO 提供了数据访问抽象层,这意味着,不管使用哪种数据库,都可以用相同的函数来查询和获取数据。PDO 不提供数据库抽象;不会重写 SQL 或模拟缺失的特性。如果需要,应该使用成熟的抽象层。

数据库支持:firebird,informix,mysql,mssql,odbc,pgsql,sqlite。

PDO 类 和 PDOStatement 类

1. PDO 类

class PDO {
   
/* 方法 */
public __construct(
    string $dsn,
    ?string $username = null,
    ?string $password = null,
    ?array $options = null
)
public beginTransaction(): bool
public commit(): bool
public errorCode(): ?string
public errorInfo(): array
public exec(string $statement): int|false
public getAttribute(int $attribute): mixed
public static getAvailableDrivers(): array
public inTransaction(): bool
public lastInsertId(?string $name = null): string|false
public prepare(string $query, array $options = []): PDOStatement|false
public query(string $query, ?int $fetchMode = null): PDOStatement|false
public query(string $query, ?int $fetchMode = PDO::FETCH_COLUMN, int $colno): PDOStatement|false
public query(
    string $query,
    ?int $fetchMode = PDO::FETCH_CLASS,
    string $classname,
    array $constructorArgs
): PDOStatement|false
public query(string $query, ?int $fetchMode = PDO::FETCH_INTO, object $object): PDOStatement|false
public quote(string $string, int $type = PDO::PARAM_STR): string|false
public rollBack(): bool
public setAttribute(int $attribute, mixed $value): bool
}
  1. PDO::beginTransaction — 启动一个事务
  2. PDO::commit — 提交一个事务
  3. PDO::__construct — 创建一个表示数据库连接的 PDO 实例
  4. PDO::errorCode — 获取跟数据库句柄上一次操作相关的 SQLSTATE
  5. PDO::errorInfo — Fetch extended error information associated with the last operation on the database handle
  6. PDO::exec — 执行 SQL 语句,并返回受影响的行数
  7. PDO::getAttribute — 取回一个数据库连接的属性
  8. PDO::getAvailableDrivers — 返回一个可用驱动的数组
  9. PDO::inTransaction — 检查是否在事务内
  10. PDO::lastInsertId — 返回最后插入行的ID或序列值
  11. PDO::prepare — 预处理要执行的语句,并返回语句对象
  12. PDO::query — 预处理并执行没有占位符的 SQL 语句
  13. PDO::quote — 为 SQL 查询里的字符串添加引号
  14. PDO::rollBack — 回滚事务
  15. PDO::setAttribute — 设置属性

2. PDOStatement 类

class PDOStatement implements IteratorAggregate {
   
/* 属性 */
public string $queryString;
/* 方法 */
public bindColumn(
    string|int $column,
    mixed &$var,
    int $type = PDO::PARAM_STR,
    int $maxLength = 0,
    mixed $driverOptions = null
): bool
public bindParam(
    string|int $param,
    mixed &$var,
    int $type = PDO::PARAM_STR,
    int $maxLength = 0,
    mixed $driverOptions = null
): bool
public bindValue(string|int $param, mixed $value, int $type = PDO::PARAM_STR): bool
public closeCursor(): bool
public columnCount(): int
public debugDumpParams(): ?bool
public errorCode(): ?string
public errorInfo(): array
public execute(?array $params = null): bool
public fetch(int $mode = PDO::FETCH_DEFAULT, int $cursorOrientation = PDO::FETCH_ORI_NEXT, int $cursorOffset = 0): mixed
public fetchAll(int $mode = PDO::FETCH_DEFAULT): array
public fetchAll(int $mode = PDO::FETCH_COLUMN, int $column): array
public fetchAll(int $mode = PDO::FETCH_CLASS, string $class, ?array $constructorArgs): array
public fetchAll(int $mode = PDO::FETCH_FUNC, callable $callback): array
public fetchColumn(int $column = 0): mixed
public fetchObject(?string $class = "stdClass", array $constructorArgs = []): object|false
public getAttribute(int $name): mixed
public getColumnMeta(int $column): array|false
public getIterator(): Iterator
public nextRowset(): bool
public rowCount(): int
public setAttribute(int $attribute, mixed $value): bool
public setFetchMode(int $mode): bool
public setFetchMode(int $mode = PDO::FETCH_COLUMN, int $colno): bool
public setFetchMode(int $mode = PDO::FETCH_CLASS, string $class, ?array $constructorArgs = null): bool
public setFetchMode(int $mode = PDO::FETCH_INTO, object $object): bool
}
  1. PDOStatement::bindColumn— 绑定一列到一个 PHP 变量
  2. PDOStatement::bindParam— 绑定一个参数到指定的变量名
  3. PDOStatement::bindValue — 把一个值绑定到一个参数
  4. PDOStatement::closeCursor — 关闭游标,使语句能再次被执行
  5. PDOStatement::columnCount — 返回结果集中的列数
  6. PDOStatement::debugDumpParams — 打印一条 SQL 预处理命令
  7. PDOStatement::errorCode — 获取跟上一次语句句柄操作相关的 SQLSTATE
  8. PDOStatement::errorInfo — 获取跟上一次语句句柄操作相关的扩展错误信息
  9. PDOStatement::execute — 执行预处理语句
  10. PDOStatement::fetch — 从结果集中获取下一行
  11. PDOStatement::fetchAll — 从结果集中获取剩余的行
  12. PDOStatement::fetchColumn — 从结果集中的下一行返回单独的一列
  13. PDOStatement::fetchObject — 获取下一行并作为一个对象返回
  14. PDOStatement::getAttribute — 检索语句属性
  15. PDOStatement::getColumnMeta — 返回结果集中一列的元数据
  16. PDOStatement::getIterator — Gets result set iterator
  17. PDOStatement::nextRowset — 在一个多行集合语句句柄中推进到下一个行集合
  18. PDOStatement::rowCount — 返回受上一个 SQL 语句影响的行数
  19. PDOStatement::setAttribute — 设置一个语句属性
  20. PDOStatement::setFetchMode — 为语句设置默认的获取模式

PDO的使用

1.pdo的简单使用

使用pdo操纵数据库,大致分为以下几步:

  1. 连接数据库,获取PDO实例对象, 使用 new PDO($dsn,$username,$password,[])获取PDO实例对象,$dsn为数据库的类型mysql,oracle…以及要操纵的数据库名称,以及访问的主机名,$username,$password为对应的数据库的账户和密码;[]为一些不必要参数,如指定数据库编码方式,一些预定义常量…
  2. 编写sql语句,crud 增删改查
  3. 使用$pdo->query($sql)执行sql,并且以PDOStatement对象返回结果集,如果没找到结果集则返回false。
  4. 可以使用fetch()(从结果集中获取下一行),fetchAll() (从结果集中获取剩余的行), fetchColumn() ( 从结果集中的下一行返回单独的一列),fetchObject() (获取下一行并作为一个对象返回)…的方式来遍历结果集。

比如下面的例子,查询某个表的所有数据,并且遍历打印数据:

<?php
$type = 'mysql';  // 数据库为mysql数据库
$hostname = 'localhost';  // 主机名为本地服务器
$username ='root';  // mysql 的账户
$password = 'root'; // mysql 的密码
$dbname = 'phpdemo';  // 操纵的数据库名


try{
   
    $dsn = "$type:dbname=$dbname;host=$hostname";
    // 初始化 pdo对象
    $pdo = new PDO($dsn,$username,$password,[
        // 开启异常模式
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
    ]);
}catch (PDOException $e){
   
    die("数据库连接失败:".$e->getMessage());
}

// 使用pdo->query() 预处理并执行sql语句,以 PDOStatement 对象形式返回结果集,
// 如果数据不存在则返回false
$stmt = $pdo->query('select * from book');

// 以关联数组的方式将结果集返回
$data = $stmt->fetchAll(PDO::FETCH_ASSOC);

// 打印输出sql查询到的数据
echo "<pre>";
var_dump($data);
echo "</pre>";

在这里插入图片描述

2.预定义占位符

PDO对预处理语句的支持需要使用PDOStatement类对象,但该类对象并不是通过NEW关键字实例化出来的,而是通过PDO对象中的prepare()方法,在数据库服务器中准备好一个预处理的SQL语句后直接返回的。

如果通过之前执行PDO对象中的query()方法返回的PDOStatement类对象,只代表的是一个结果集对象。

而如果通过执行PDO对象中的prepare()方法产生的PDOStatement类对象,则为一个查询对象,能定义和执行参数化的SQL命令。


使用PDOStatement类对象对sql进行预处理的步骤大致分为如下几步:

  1. 连接数据库,获取PDO实例对象 $pdo = new PDO($dsn,$username,$password);
  2. 准备要预处理的sql语句 ,$sql = "select * from book where id = ?" 或者 $sql = "select * from book where id=:id" (预定义占位符的sql语句)
  3. 使用PDO实例对象的prepare()方法,得到PDOStatement类对象 ,$stmt = $pdo->prepare($sql,)
  4. 使用PDOStatement类对象的bindParam()方法,绑定对应的预定义占位符
  5. 使用PDOStatement类对象的execute()方法,正式执行sql.

<?php
$type = 'mysql';  // 数据库为mysql数据库
$hostname = 'localhost';  // 主机名为本地服务器
$username ='root';  // mysql 的账户
$password = 'root'; // mysql 的密码
$dbname = 'phpdemo';  // 操纵的数据库名


try{
   
    $dsn = "$type:dbname=$dbname;host=$hostname";
    // 初始化 pdo对象
    $pdo = new PDO($dsn,$username,$password,[
        // 开启异常模式
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
    ]);
}catch (PDOException $e){
   
    die("数据库连接失败:".$e->getMessage());
}


$sql = "insert into book (booKName,bookPrice,author) values(?,?,?)";

// 预处理sql获取pdostatement对象
$stmt = $pdo->prepare($sql);

// 绑定预定义占位符
$bookName = "大话数据结构";
$bookPrice = "40";
$author = "大牛";
$stmt->bindParam(1,$bookName);
$stmt->bindParam(2,$bookPrice);
$stmt->bindParam(3,$author);

// 执行sql
$stmt->execute();

在这里插入图片描述


上面预定义占位符绑定的方式,还有bindColumn() 绑定一列到一个 PHP 变量即字段列和变量对应 和 bindValue() 把一个值绑定到一个参数。

那么上面的代码可以修改如下(使用bindValue的方式):

// ....
$sql = "insert into book (booKName,bookPrice,author) values(:bookName,:bookPrice,:author)";

// 预处理sql获取pdostatement对象
$stmt = $pdo->prepare($sql);

// 绑定预定义占位符
$bookName = "大话数据结构";
$bookPrice = "40";
$author = "大牛";
$stmt->bindValue(":bookName",$bookName,PDO::PARAM_STR);
$stmt->bindValue(":bookPrice",$bookPrice,PDO::PARAM_STR);
$stmt->bindValue(":author",$author,PDO::PARAM_STR);

// 执行sql
$stmt->execute();

小结

使用PDO可以对不同的数据库进行操纵,pdo提供了轻量级的访问数据库的统一接口,对数据访问提供了抽象层,无论使用何种数据库,都可以使用相同的代码去操纵。


1.使用PDO操纵数据库的步骤:

  1. 连接对应的数据库,生成PDO实例对象 ,$pdo = new PDO($dsn,$uname,$upwd)
  2. 准备sql语句
  3. 使用PDO->query()方法,执行对应的sql,并且返回一个PDOStatement对象 ,$stmt = $pdo->query($sql)
  4. 可以使用PDOStatement对象来获取数据,它提供了一系列的fetch()方法…,$data = $stmt->fetch()

2.使用PDO操纵数据库,且SQL存在预定义占位符的大致步骤:

  1. 连接数据库 $pdo = new PDO($dsn,$uname,$upwd)
  2. 准备含占位符的sql语句
  3. 预处理sql, $stmt=$pdo->prepare($sql)
  4. 绑定参数 ,$stmt->bindParam()
  5. 执行Sql,$stmt->excute()

3.使用bindValue和bindParam绑定预定义占位符参数的区别:

方法 bindParam() 和 bindValue() 非常相似,唯一的区别就是前者使用一个PHP变量绑定参数,而后者使用一个值。
所以使用bindParam是第二个参数只能用变量名,而不能用变量值,而bindValue至可以使用具体值。


4.预定义占位符的不同形式:

隐式占位符 ? ,例如 $sql = "insert into book (booKName,bookPrice,author) values(?,?,?)";
显示占位符 :占位符名称, 例如 $sql = "insert into book (booKName,bookPrice,author) values(:bookName,:bookPrice,:author)";


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
14天前
|
存储 SQL 关系型数据库
PHP与数据库交互:从基础到进阶
【10月更文挑战第9天】在编程的世界里,数据是流动的血液,而数据库则是存储这些珍贵资源的心脏。PHP作为一门流行的服务器端脚本语言,其与数据库的交互能力至关重要。本文将带你从PHP与数据库的基本连接开始,逐步深入到复杂查询的编写和优化,以及如何使用PHP处理数据库结果。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供宝贵的知识和技巧,让你在PHP和数据库交互的道路上更加从容不迫。
|
22天前
|
缓存 安全 PHP
PHP中的魔术方法与对象序列化
本文将深入探讨PHP中的魔术方法,特别是与对象序列化和反序列化相关的__sleep()和__wakeup()方法。通过实例解析,帮助读者理解如何在实际应用中有效利用这些魔术方法,提高开发效率和代码质量。
|
2月前
|
JavaScript 前端开发 安全
php学习笔记-普通表单参数提交获取及页面的重定向和一个登录小demo-day05
本文介绍了PHP中普通表单参数的提交获取、页面重定向的方法,并通过一个登录示例演示了表单参数的封装和页面跳转处理。
|
2月前
|
SQL 关系型数据库 MySQL
php学习笔记-连接操作mysq数据库(基础)-day08
本文介绍了PHP中连接操作MySQL数据库的常用函数,包括连接服务器、设置字符集、关闭连接、选择数据库、结果集释放、获取影响行数以及遍历结果集等操作。通过书籍查询的实例演示了如何使用这些函数进行数据库操作,并提供了一个PHP操纵MySQL数据库的模板。
php学习笔记-连接操作mysq数据库(基础)-day08
|
2月前
|
PHP
PHP中如何比较两个对象
PHP中如何比较两个对象
|
15天前
|
存储 SQL 关系型数据库
Mysql学习笔记(二):数据库命令行代码总结
这篇文章是关于MySQL数据库命令行操作的总结,包括登录、退出、查看时间与版本、数据库和数据表的基本操作(如创建、删除、查看)、数据的增删改查等。它还涉及了如何通过SQL语句进行条件查询、模糊查询、范围查询和限制查询,以及如何进行表结构的修改。这些内容对于初学者来说非常实用,是学习MySQL数据库管理的基础。
64 6
|
13天前
|
存储 关系型数据库 MySQL
Mysql(4)—数据库索引
数据库索引是用于提高数据检索效率的数据结构,类似于书籍中的索引。它允许用户快速找到数据,而无需扫描整个表。MySQL中的索引可以显著提升查询速度,使数据库操作更加高效。索引的发展经历了从无索引、简单索引到B-树、哈希索引、位图索引、全文索引等多个阶段。
48 3
Mysql(4)—数据库索引
|
15天前
|
SQL Ubuntu 关系型数据库
Mysql学习笔记(一):数据库详细介绍以及Navicat简单使用
本文为MySQL学习笔记,介绍了数据库的基本概念,包括行、列、主键等,并解释了C/S和B/S架构以及SQL语言的分类。接着,指导如何在Windows和Ubuntu系统上安装MySQL,并提供了启动、停止和重启服务的命令。文章还涵盖了Navicat的使用,包括安装、登录和新建表格等步骤。最后,介绍了MySQL中的数据类型和字段约束,如主键、外键、非空和唯一等。
49 3
Mysql学习笔记(一):数据库详细介绍以及Navicat简单使用
|
1天前
|
存储 关系型数据库 MySQL
MySQL vs. PostgreSQL:选择适合你的开源数据库
在众多开源数据库中,MySQL和PostgreSQL无疑是最受欢迎的两个。它们都有着强大的功能、广泛的社区支持和丰富的生态系统。然而,它们在设计理念、性能特点、功能特性等方面存在着显著的差异。本文将从这三个方面对MySQL和PostgreSQL进行比较,以帮助您选择更适合您需求的开源数据库。
12 4
|
6天前
|
存储 关系型数据库 MySQL
如何在MySQL中创建数据库?
【10月更文挑战第16天】如何在MySQL中创建数据库?