使用PDO操作数据库
PDO操作数据库的基本操作
配置项
- dsn: [书库类型]:host=[数据库主机地址];dbname=[默认数据库];charset=[默认字符集];port=[默认端口]
- username:数据库的用户名
- password:数据库的密码
基本操作流程
- 创建PDO对象连接数据库:
$pdo = new PDO(dsn, username, password)
;需引入全局命名空间下的PDO类,且尽量在try...catch...
中完成创建。 - 编写SQL语句,若需要带参数的,可以使用匿名占位符和命名占位符。使用占位符可以有效预防SQL注入。
- 匿名占位符,就是一个问号
?
- 命名占位符,是一个以冒号
:
开头的语义化名称,如::id
.
- 匿名占位符,就是一个问号
- 生成预处理对象:
$stmt=$pdo->prepare($sql);
.预处理对象可以理解为SQL对象。 - 以数组的形式为SQL语句传参,并执行SQL:
$stmt->execute($paramArray)
.如果SQL中的参数使用匿名占位符,则传参的数组使用索引数组;如果SQL中的参数使用命名占位符,则传参的数组使用关联数组,键名为占位符名称,冒号可省略。 - 处理SQL执行结果。见示例。
- 关闭数据库:有两种方式
DROP DATABASE IF EXISTS `phpedu`;
CREATE DATABASE `phpedu` /*!40100 DEFAULT CHARACTER SET utf8 */;
USE `phpedu`;
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`username` varchar(50) NOT NULL,
`realname` varchar(50) NOT NULL DEFAULT '',
`password` varchar(50) NOT NULL,
`in_use` int(11) NOT NULL DEFAULT '1',
`create_time` int(11) NOT NULL,
`update_time` int(11) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
创建示例数据
配置文件
<?php
namespace homework;
return [
'dbtype' => 'mysql',
'host' => 'localhost',
'dbname' => 'phpedu',
'port' => '3306',
'charset' => 'utf8',
'username' => 'root',
'password' => 'root',
];
连接数据库(创建PDO对象)
namespace homework;
use Exception;
use PDO;
require('../../out.php');
$config = require('config/dbconfig.php');
$dsn = "{$config['dbtype']}:host={$config['host']};dbname={$config['dbname']};charset={$config['charset']};port={$config['port']}";
$username = $config['username'];
$password = $config['password'];
try {
$pdo = new PDO($dsn, $username, $password);
// dumpbr($pdo);
} catch (Exception $e) {
die($e->getMessage());
}
数据库CURD操作
<?php
namespace homework;
use PDO;
// 一、连接数据库
require('connect.php');
/**
* 打印一条记录
*/
function showUserInfo($user)
{
$update_time = date('Y-m-d H:i:s', $user['update_time']);
$create_time = date('Y-m-d H:i:s', $user['create_time']);
$status = ($user['in_use'] == 1) ? '使用中' : '停用';
echobr("ID: {$user['id']}, 用户名: {$user['username']}, 姓名: {$user['realname']}, 使用状态: {$status}, 创建时间: {$create_time}, 更新时间: {$update_time}");
}
// 二、操作数据库
// 1. 查询单条记录
/* SQL语句: 使用匿名占位符标识变量 */
$sql = "SELECT * FROM `user` WHERE `id` > ?";
/* 生成预处理对象 */
$stmt = $pdo->prepare($sql);
/* 为SQL语句中的变量传参, 并执行预处理对象中的SQL */
$stmt->execute([3]);
/* 处理SQL执行结果 */
/* 获取查询结果的第一条数据 */
$user1 = $stmt->fetch(PDO::FETCH_ASSOC);
showUserInfo($user1);
/* 获取查询结果的第二条数据 */
$user2 = $stmt->fetch(PDO::FETCH_ASSOC);
showUserInfo($user2);
/* result:
ID: 4, 用户名: zhaoliu, 姓名: 赵六, 使用状态: 停用, 创建时间: 2020-05-07 00:46:44, 更新时间: 2020-05-07 00:46:44
ID: 5, 用户名: zhuqi, 姓名: 朱七, 使用状态: 使用中, 创建时间: 2020-05-07 00:47:07, 更新时间: 2020-05-07 00:47:07
*/
echo '<hr>';
// 2. 查询多条记录
/* SQL语句: 使用命名占位符标识变量 */
$sql = "SELECT * FROM `user` WHERE `in_use` = :in_use";
/* 生成预处理对象 */
$stmt = $pdo->prepare($sql);
/* 传参, 并执行SQL */
$stmt->execute(['in_use' => 1]);
/* 处理SQL执行结果 */
$users = $stmt->fetchAll(PDO::FETCH_ASSOC);
foreach ($users as $user) {
showUserInfo($user);
}
/* result:
ID: 1, 用户名: zhangsan, 姓名: 张三, 使用状态: 使用中, 创建时间: 2020-05-07 00:45:34, 更新时间: 2020-05-07 00:45:34
ID: 2, 用户名: lisi, 姓名: 李四, 使用状态: 使用中, 创建时间: 2020-05-07 00:45:55, 更新时间: 2020-05-07 00:45:55
ID: 5, 用户名: zhuqi, 姓名: 朱七, 使用状态: 使用中, 创建时间: 2020-05-07 00:47:07, 更新时间: 2020-05-07 00:47:07
*/
echo '<hr>';
// 3. 增加一条记录
/* 待增加的记录 */
$newUser = ['username' => 'chenjiu', 'realname' => '陈九', 'in_use' => 1, 'create_time' => time(), 'update_time' =>time()];
/* SQL语句: */
$sql = "INSERT `user` SET `username` = :username, `realname` = :realname, `in_use` = :in_use, `create_time` = :create_time, `update_time` = :update_time";
/* 生成预处理对象 */
$stmt = $pdo->prepare($sql);
/* 传参,执行插入 */
$stmt->execute($newUser);
/* 处理SQL执行结果 */
if($stmt->rowCount() > 0) {
echobr('新增成功, 新增用户信息如下:');
$newUser['id'] = $pdo->lastInsertId();
showUserInfo($newUser);
} else {
echobr('创建失败');
echobr($stmt->errorInfo());
}
/* result:
新增成功, 新增用户信息如下:
ID: 11, 用户名: chenjiu, 姓名: 陈九, 使用状态: 使用中, 创建时间: 2020-05-07 05:06:25, 更新时间: 2020-05-07 05:06:25
*/
// 4. 更新一条记录
$userId = $_GET['id'] ?? $pdo->lastInsertId();
/* SQL语句: */
$sql = "UPDATE `user` SET `in_use` = ? WHERE `id` = ?";
/* 生成预处理对象 */
$stmt = $pdo->prepare($sql);
/* 传参,执行修改 */
$stmt->execute([0, $userId]);
/* 处理SQL执行结果 */
if($stmt->rowCount() > 0) {
echobr('更新成功,更新后的用户信息如下:');
$sql = 'SELECT * FROM `user` WHERE `id` = ?';
$stmt = $pdo->prepare($sql);
$stmt->execute([$userId]);
$user = $stmt->fetch(PDO::FETCH_ASSOC);
showUserInfo($user);
} else {
echobr('更新失败');
echobr($stmt->errorInfo());
}
/* result:
更新成功,更新后的用户信息如下:
ID: 11, 用户名: chenjiu, 姓名: 陈九, 使用状态: 停用, 创建时间: 2020-05-07 05:06:25, 更新时间: 2020-05-07 05:06:25
*/
// 5. 删除记录
$userId = $_GET['id'] ?? $userId;
/* SQL语句: */
$sql = "DELETE FROM `user` WHERE `id` = ?";
/* 生成预处理对象 */
$stmt = $pdo->prepare($sql);
/* 传参,执行SQL */
$stmt->execute([$userId]);
/* 处理SQL执行结果 */
if($stmt->rowCount() > 0) {
echobr("ID为{$userId}的用户已被删除。");
} else {
echobr('删除失败');
echobr($stmt->errorInfo());
}
/* result:
ID为11的用户已被删除。
*/
// 三、关闭数据库
unset($pdo);
学习心得
以前学习过sqlserver数据库的使用,对SQL语句比较了解,所以这次课是PHP课程学习中相对比较简单的一次。PDO操作数据库很简便,同时它很好的体现了面向对象编程,所有的数据库操作都做了封装和隐藏,客户端使用工作类PDO类调用相应的方法即可。老师课堂上只讲了最简单的单表增删改查,多表联合查询,批量写入和事务操作,需要自己课后去看文档学习。