mclee 's Blog
Love Leanote!
Toggle navigation
mclee 's Blog
主页
PHP
归档
标签
PDO
无
2018-02-06 15:33:36
356
0
0
mclee
# 简介 PHP 应用可以在很多数据库中持久保存信息,例如 MySQL、PostgreSQL、SQLite、Oracle 等。这些数据库都提供了用于和 PHP 通信的扩展。如果在项目中使用多种数据库,需要安装并学习多种 PHP 数据库扩展和接口。这无疑增加了认知和技术负担。 正式基于这个原因,PHP 原生提供了 PDO (PHP Data Object)扩展,是一系列 PHP 类、抽象了不同数据库的具体实现,可通过统一的接口与不同的数据库进行通信。 # 数据库连接和 DSN(Data Source Name) PDO 类的构造方法有一个字符串参数,用于指定 DSN,提供数据库连接的详细信息。以 Mysql 为例子: ``` <?php try { $pdo = new PDO( 'mysql:host=127.0.1;dbname=test;port=3306;charset=utf8', 'USERNAME', 'PASSWORD' ); } catch (PDOException $e){ die('数据库连接失败'); } ``` >各种数据库使用的 DNS 格式参见 http://php.net/manual/zh/pdo.drivers.php # 预处理语句 有时必须根据输入数据构建 SQL 查询。这些输入数据可能来自 HTTP 请求的查询字符串(?user=1),也可能来自 HTTP 请求的 URI 片段(/user/1)。如果不小心,不怀好意的人操纵 sql 查询,对数据库造成严重破坏。典型反例就是直接拼接 \$_GET, \$_POST 中的原始输入数据,以此构建 SQL 查询。 如果需要在 SQL 查询中使用外部输入数据,要使用 PDO 预处理语句。 ``` <?php $Sql = 'SELECT email FROM users WHERE id = :id'; $statement = $pdo->prepare($sql); $userId = filter_input(INPUT_GET, 'id'); $statement->bindValue(':id', $userId, PDO::PARAM_INT); ``` 上例中,:id 是占位符,占位符还可以写成 ?, bindValue() 有个类似的 bindParam() 函数与之对应,不过该函数的第二个参数是作为引用被绑定,尤其要注意在循环中使用 bindParam() ,由于引用绑定会出现意想不到的结果,推荐使用 bindValue()。 bindValue() 的第三个参数指定占位符要绑定的数据是什么类型。如果不传入第三个参数,预处理语句会假定要绑定的数据是字符串。 在上面的示例中,bindValue() 方法的第三个参数是 PDO::PARAM_INT 常量,告诉 PDO 要绑定的数据是整数。指定数据类型的 PDO 常量还有: * PDO::PARAM_BOOL * PDO::PARAM_NULL * PDO::PARAM_INT * PDO::PARAM_STR (默认值) >全部 PDO 常量参见(含其他配置项使用的常量) http://php.net/manual/zh/pdo.constants.php # 查询结果 现在有了预处理语句,可以在数据库中执行 SQL 查询了。调用预处理语句的 excute() 方法后会使用绑定的所有数据执行 SQL 语句。如果执行的是 INSERT、UPDATE 或 DELETE 语句,调用 execute() 方法后工作就结束了。如果执行的是 SELECT 语句,我们可能期望数据库能返回匹配的记录。我们可以调用 PDOStatement 实例的 fetch()、fetchAll()、fetchColumn() 和 fetchObject 方法,获取查询结果。 PDOStatement 实例的 fetch() 方法用于获取结果集合中的下一行。当需要迭代处理大型结果集合,若可用内存放不下整个结果集合,特别适合使用这个方法。 在调用 fetch()、fetch() 方法是传入标识符控制数据返回形式。常见有如下:  更多的查看手册 PDO 常量。 ``` <?php try { $pdo = new PDO('mysql:host=localhost;dbname=tao2huo;port=3306;charset=utf8', 'tao2huo', 'yset846r', [ // 禁用 PDO 预处理 数据类型会正常返回 默认返回字符串 PDO::ATTR_EMULATE_PREPARES => false ]); } catch (PDOException $e){ die('数据库连接失败'); } $sql = 'SELECT * FROM category WHERE id = :id '; $stmt = $pdo->prepare($sql); $stmt->execute([':id' => 1]); foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $row) { var_dump($row); } ```
上一篇:
流
下一篇:
日期、时间和时区
0
赞
356 人读过
新浪微博
微信
腾讯微博
QQ空间
人人网
提交评论
立即登录
, 发表评论.
没有帐号?
立即注册
0
条评论
More...
文档导航
没有帐号? 立即注册