博客列表 >PHP基础-使用PDO操作数据库

PHP基础-使用PDO操作数据库

岂几岂几
岂几岂几原创
2020年05月07日 15:50:58969浏览

使用PDO操作数据库

PDO操作数据库的基本操作

配置项

  • dsn: [书库类型]:host=[数据库主机地址];dbname=[默认数据库];charset=[默认字符集];port=[默认端口]
  • username:数据库的用户名
  • password:数据库的密码
    基本操作流程
  1. 创建PDO对象连接数据库:$pdo = new PDO(dsn, username, password);需引入全局命名空间下的PDO类,且尽量在try...catch...中完成创建。
  2. 编写SQL语句,若需要带参数的,可以使用匿名占位符和命名占位符。使用占位符可以有效预防SQL注入。
    • 匿名占位符,就是一个问号?
    • 命名占位符,是一个以冒号:开头的语义化名称,如::id.
  3. 生成预处理对象:$stmt=$pdo->prepare($sql);.预处理对象可以理解为SQL对象。
  4. 以数组的形式为SQL语句传参,并执行SQL:$stmt->execute($paramArray).如果SQL中的参数使用匿名占位符,则传参的数组使用索引数组;如果SQL中的参数使用命名占位符,则传参的数组使用关联数组,键名为占位符名称,冒号可省略。
  5. 处理SQL执行结果。见示例。
  6. 关闭数据库:有两种方式
    • 指向PDO对象的变量值设置为null,由垃圾回收机制回收。
    • 使用unset()函数销毁:unset(PDO对象)

      示例

      创建库表
  1. DROP DATABASE IF EXISTS `phpedu`;
  2. CREATE DATABASE `phpedu` /*!40100 DEFAULT CHARACTER SET utf8 */;
  3. USE `phpedu`;
  4. DROP TABLE IF EXISTS `user`;
  5. CREATE TABLE `user` (
  6. `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  7. `username` varchar(50) NOT NULL,
  8. `realname` varchar(50) NOT NULL DEFAULT '',
  9. `password` varchar(50) NOT NULL,
  10. `in_use` int(11) NOT NULL DEFAULT '1',
  11. `create_time` int(11) NOT NULL,
  12. `update_time` int(11) NOT NULL,
  13. PRIMARY KEY (`id`),
  14. UNIQUE KEY `username` (`username`)
  15. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

创建示例数据

配置文件

  1. <?php
  2. namespace homework;
  3. return [
  4. 'dbtype' => 'mysql',
  5. 'host' => 'localhost',
  6. 'dbname' => 'phpedu',
  7. 'port' => '3306',
  8. 'charset' => 'utf8',
  9. 'username' => 'root',
  10. 'password' => 'root',
  11. ];

连接数据库(创建PDO对象)

  1. namespace homework;
  2. use Exception;
  3. use PDO;
  4. require('../../out.php');
  5. $config = require('config/dbconfig.php');
  6. $dsn = "{$config['dbtype']}:host={$config['host']};dbname={$config['dbname']};charset={$config['charset']};port={$config['port']}";
  7. $username = $config['username'];
  8. $password = $config['password'];
  9. try {
  10. $pdo = new PDO($dsn, $username, $password);
  11. // dumpbr($pdo);
  12. } catch (Exception $e) {
  13. die($e->getMessage());
  14. }

数据库CURD操作

  1. <?php
  2. namespace homework;
  3. use PDO;
  4. // 一、连接数据库
  5. require('connect.php');
  6. /**
  7. * 打印一条记录
  8. */
  9. function showUserInfo($user)
  10. {
  11. $update_time = date('Y-m-d H:i:s', $user['update_time']);
  12. $create_time = date('Y-m-d H:i:s', $user['create_time']);
  13. $status = ($user['in_use'] == 1) ? '使用中' : '停用';
  14. echobr("ID: {$user['id']}, 用户名: {$user['username']}, 姓名: {$user['realname']}, 使用状态: {$status}, 创建时间: {$create_time}, 更新时间: {$update_time}");
  15. }
  16. // 二、操作数据库
  17. // 1. 查询单条记录
  18. /* SQL语句: 使用匿名占位符标识变量 */
  19. $sql = "SELECT * FROM `user` WHERE `id` > ?";
  20. /* 生成预处理对象 */
  21. $stmt = $pdo->prepare($sql);
  22. /* 为SQL语句中的变量传参, 并执行预处理对象中的SQL */
  23. $stmt->execute([3]);
  24. /* 处理SQL执行结果 */
  25. /* 获取查询结果的第一条数据 */
  26. $user1 = $stmt->fetch(PDO::FETCH_ASSOC);
  27. showUserInfo($user1);
  28. /* 获取查询结果的第二条数据 */
  29. $user2 = $stmt->fetch(PDO::FETCH_ASSOC);
  30. showUserInfo($user2);
  31. /* result:
  32. ID: 4, 用户名: zhaoliu, 姓名: 赵六, 使用状态: 停用, 创建时间: 2020-05-07 00:46:44, 更新时间: 2020-05-07 00:46:44
  33. ID: 5, 用户名: zhuqi, 姓名: 朱七, 使用状态: 使用中, 创建时间: 2020-05-07 00:47:07, 更新时间: 2020-05-07 00:47:07
  34. */
  35. echo '<hr>';
  36. // 2. 查询多条记录
  37. /* SQL语句: 使用命名占位符标识变量 */
  38. $sql = "SELECT * FROM `user` WHERE `in_use` = :in_use";
  39. /* 生成预处理对象 */
  40. $stmt = $pdo->prepare($sql);
  41. /* 传参, 并执行SQL */
  42. $stmt->execute(['in_use' => 1]);
  43. /* 处理SQL执行结果 */
  44. $users = $stmt->fetchAll(PDO::FETCH_ASSOC);
  45. foreach ($users as $user) {
  46. showUserInfo($user);
  47. }
  48. /* result:
  49. ID: 1, 用户名: zhangsan, 姓名: 张三, 使用状态: 使用中, 创建时间: 2020-05-07 00:45:34, 更新时间: 2020-05-07 00:45:34
  50. ID: 2, 用户名: lisi, 姓名: 李四, 使用状态: 使用中, 创建时间: 2020-05-07 00:45:55, 更新时间: 2020-05-07 00:45:55
  51. ID: 5, 用户名: zhuqi, 姓名: 朱七, 使用状态: 使用中, 创建时间: 2020-05-07 00:47:07, 更新时间: 2020-05-07 00:47:07
  52. */
  53. echo '<hr>';
  54. // 3. 增加一条记录
  55. /* 待增加的记录 */
  56. $newUser = ['username' => 'chenjiu', 'realname' => '陈九', 'in_use' => 1, 'create_time' => time(), 'update_time' =>time()];
  57. /* SQL语句: */
  58. $sql = "INSERT `user` SET `username` = :username, `realname` = :realname, `in_use` = :in_use, `create_time` = :create_time, `update_time` = :update_time";
  59. /* 生成预处理对象 */
  60. $stmt = $pdo->prepare($sql);
  61. /* 传参,执行插入 */
  62. $stmt->execute($newUser);
  63. /* 处理SQL执行结果 */
  64. if($stmt->rowCount() > 0) {
  65. echobr('新增成功, 新增用户信息如下:');
  66. $newUser['id'] = $pdo->lastInsertId();
  67. showUserInfo($newUser);
  68. } else {
  69. echobr('创建失败');
  70. echobr($stmt->errorInfo());
  71. }
  72. /* result:
  73. 新增成功, 新增用户信息如下:
  74. ID: 11, 用户名: chenjiu, 姓名: 陈九, 使用状态: 使用中, 创建时间: 2020-05-07 05:06:25, 更新时间: 2020-05-07 05:06:25
  75. */
  76. // 4. 更新一条记录
  77. $userId = $_GET['id'] ?? $pdo->lastInsertId();
  78. /* SQL语句: */
  79. $sql = "UPDATE `user` SET `in_use` = ? WHERE `id` = ?";
  80. /* 生成预处理对象 */
  81. $stmt = $pdo->prepare($sql);
  82. /* 传参,执行修改 */
  83. $stmt->execute([0, $userId]);
  84. /* 处理SQL执行结果 */
  85. if($stmt->rowCount() > 0) {
  86. echobr('更新成功,更新后的用户信息如下:');
  87. $sql = 'SELECT * FROM `user` WHERE `id` = ?';
  88. $stmt = $pdo->prepare($sql);
  89. $stmt->execute([$userId]);
  90. $user = $stmt->fetch(PDO::FETCH_ASSOC);
  91. showUserInfo($user);
  92. } else {
  93. echobr('更新失败');
  94. echobr($stmt->errorInfo());
  95. }
  96. /* result:
  97. 更新成功,更新后的用户信息如下:
  98. ID: 11, 用户名: chenjiu, 姓名: 陈九, 使用状态: 停用, 创建时间: 2020-05-07 05:06:25, 更新时间: 2020-05-07 05:06:25
  99. */
  100. // 5. 删除记录
  101. $userId = $_GET['id'] ?? $userId;
  102. /* SQL语句: */
  103. $sql = "DELETE FROM `user` WHERE `id` = ?";
  104. /* 生成预处理对象 */
  105. $stmt = $pdo->prepare($sql);
  106. /* 传参,执行SQL */
  107. $stmt->execute([$userId]);
  108. /* 处理SQL执行结果 */
  109. if($stmt->rowCount() > 0) {
  110. echobr("ID为{$userId}的用户已被删除。");
  111. } else {
  112. echobr('删除失败');
  113. echobr($stmt->errorInfo());
  114. }
  115. /* result:
  116. ID为11的用户已被删除。
  117. */
  118. // 三、关闭数据库
  119. unset($pdo);

学习心得

以前学习过sqlserver数据库的使用,对SQL语句比较了解,所以这次课是PHP课程学习中相对比较简单的一次。PDO操作数据库很简便,同时它很好的体现了面向对象编程,所有的数据库操作都做了封装和隐藏,客户端使用工作类PDO类调用相应的方法即可。老师课堂上只讲了最简单的单表增删改查,多表联合查询,批量写入和事务操作,需要自己课后去看文档学习。

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议