使用PDO操作数据库|学习笔记-大型CMS开发实战第九期
=============================================
PHP 数据对象 (PDO) 扩展为PHP访问数据库定义了一个轻量级的一致接口。
PDO 提供了一个数据访问抽象层,这意味着,不管使用哪种数据库,都可以用相同的函数(方法)来查询和获取数据。
PDO随PHP5.1发行,在PHP5.0的PECL扩展中也可以使用,无法运行于之前的PHP版本。
pdo连接数据库
# connect.php文件
// 数据库连接参数
$db = [
'type' => 'mysql',
'host' => 'localhost',
'dbname' => 'php',
'username' => 'root',
'password' => 'root',
];
// 配置数据源DSN信息
$dsn = "{$db['type']}:host={$db['host']};dbname={$db['dbname']}";
// 连接数据库
try {
$pdo = new PDO($dsn, $db['username'], $db['password']);
} catch (PDOException $e) {
die('Connection Failed: ' . $e->getMessage());
}
PDO预处理
PDOStatement: 预处理对象(SQL语句对象)
prepare(): 预处理方法, 用来生成预处理对象PDOStatement
// 1. 连接数据库
require __DIR__ . '/connect.php';
// 2. 创建SQL语句模板
$sql = 'INSERT INTO `system` SET `sys_id`= :sys_id, `title`=:title, `desc`=:desc, `key`=:key, `copy`=:copy';
// 3. 创建SQL语句对象
$stmt = $pdo->prepare($sql);
PDO参数绑定
- bindParam(): 将参数绑定到SQL语句模板上
- 常用的预定义常量:
- PDO::PARAM_INT: 整数类型
- PDO::PARAM_STR: 字符串类型
- PDO::FETCH_ASSOC: 获取结果集中的关联部分
// 1. 连接数据库
require __DIR__ . '/connect.php';
// 2. 创建SQL语句模板
$sql = 'INSERT INTO `system` SET `sys_id`= :sys_id, `title`=:title, `desc`=:desc, `key`=:key, `copy`=:copy';
// 3. 创建SQL语句对象
$stmt = $pdo->prepare($sql);
// 4. 将变量绑定到SQL语句模板的命名占位符上
$sys_id = 1;
$title = '少儿故事';
$desc = '收集全网最新最全的影视资源';
$key = '国产,欧美,日韩';
$copy = '小学生';
$stmt->bindParam('sys_id', $sys_id, PDO::PARAM_INT);
$stmt->bindParam('title', $title, PDO::PARAM_STR);
$stmt->bindParam('desc', $desc, PDO::PARAM_STR);
$stmt->bindParam('key', $key, PDO::PARAM_STR);
$stmt->bindParam('copy', $copy, PDO::PARAM_STR);
PDOStatement 类常用方法
- execute(): 执行SQL语句(读/写)
- rowCount(): 返回受影响的记录数量(不适合SELECT)
- errorInfo(): 返回错误信息数组
- fetch(): 获取结果集中的下一行
- fetchAll(): 返回结果集中的所有行
- fetchColumn(): 返回结果集下一行的单独的一列
- bindColumn(): 将结果集某字段绑定到指定变量上
1.新增数据
# 新增记录
// 1. 连接数据库
require __DIR__ . '/connect.php';
// 2. 创建SQL语句模板
$sql = 'INSERT INTO `system` SET `sys_id`= :sys_id, `title`=:title, `desc`=:desc, `key`=:key, `copy`=:copy';
// 3. 创建SQL语句对象
$stmt = $pdo->prepare($sql);
// 4. 将变量绑定到SQL语句模板的命名占位符上
$sys_id = 1;
$title = '少儿动漫';
$desc = '收集全网最新最全的影视资源';
$key = '国产,欧美,日韩';
$copy = '小学生';
$stmt->bindParam('sys_id', $sys_id, PDO::PARAM_INT);
$stmt->bindParam('title', $title, PDO::PARAM_STR);
$stmt->bindParam('desc', $desc, PDO::PARAM_STR);
$stmt->bindParam('key', $key, PDO::PARAM_STR);
$stmt->bindParam('copy', $copy, PDO::PARAM_STR);
// 5. 执行SQL操作
if ($stmt->execute()) {
if ($stmt->rowCount() > 0) {
echo '成功添加' . $stmt->rowCount(). '条记录, 该记录的主键id是: ' . $pdo->lastInsertId();
}
} else {
die('<pre>' . print_r($stmt->errorInfo(), true));
}
// 6. 销毁pdo, 关闭连接
$pdo = null; // unset($pdo) 等价
2.更新数据
# 更新记录
// 1. 连接数据库
require __DIR__ . '/connect.php';
// 2. 创建SQL语句模板
$sql = 'UPDATE `category` SET `name` = :name, `alias` = :alias WHERE `cate_id`=:cate_id';
// 3. 创建SQL语句对象
$stmt = $pdo->prepare($sql);
// 4. 将变量绑定到SQL语句模板的命名占位符上
$name = 'xjj';
$alias = '小姐姐';
$cate_id = 4;
$stmt->bindParam('name', $name, PDO::PARAM_STR);
$stmt->bindParam('alias', $alias, PDO::PARAM_STR);
$stmt->bindParam('cate_id', $cate_id, PDO::PARAM_INT);
// 5. 执行SQL操作
if ($stmt->execute()) {
if ($stmt->rowCount() > 0) {
echo '成功更新了' . $stmt->rowCount() . '条记录';
}
} else {
die('<pre>' . print_r($stmt->errorInfo(), true));
}
// 6. 销毁pdo, 关闭连接
$pdo = null; // unset($pdo) 等价
3.删除数据
# 删除记录
// 1. 连接数据库
require __DIR__ . '/connect.php';
// 2. 创建SQL语句模板
$sql = 'DELETE FROM `category` WHERE `cate_id`=:cate_id';
// 3. 创建SQL语句对象
$stmt = $pdo->prepare($sql);
// 4. 将变量绑定到SQL语句模板的命名占位符上
$cate_id = 4;
$stmt->bindParam('cate_id', $cate_id, PDO::PARAM_INT);
// 5. 执行SQL操作
if ($stmt->execute()) {
if ($stmt->rowCount() > 0) {
echo '成功删除了' . $stmt->rowCount() . '条记录';
}
} else {
die('<pre>' . print_r($stmt->errorInfo(), true));
}
// 6. 销毁pdo, 关闭连接
$pdo = null; // unset($pdo) 等价
4.查询数据
- 查询1: fetch() + while()
# 查询1: fetch() + while()
// 1. 连接数据库
require __DIR__ . '/connect.php';
// 2. 创建SQL语句模板
$sql = 'SELECT * FROM `movies` WHERE `cate_id` = :cate_id';
// 3. 创建SQL语句对象
$stmt = $pdo->prepare($sql);
// 4. 将变量绑定到SQL语句模板的命名占位符上
$cate_id = 1;
$stmt->bindParam('cate_id', $cate_id, PDO::PARAM_INT);
// 5. 执行SQL操作
$stmt->execute();
// 遍历
while ($movie = $stmt->fetch(PDO::FETCH_ASSOC)) {
echo '<pre>' . print_r($movie, true);
}
// 6. 销毁pdo, 关闭连接
$pdo = null; // unset($pdo) 等价
- 查询2: fetchAll()
# 查询2: fetchAll()
// 1. 连接数据库
require __DIR__ . '/connect.php';
// 2. 创建SQL语句模板
$sql = 'SELECT * FROM `movies` WHERE `cate_id` = :cate_id';
// 3. 创建SQL语句对象
$stmt = $pdo->prepare($sql);
// 4. 将变量绑定到SQL语句模板的命名占位符上
$cate_id = 3;
$stmt->bindParam('cate_id', $cate_id, PDO::PARAM_INT);
// 5. 执行SQL操作
$stmt->execute();
// 遍历, 返回二维数组
$movies = $stmt->fetchAll(PDO::FETCH_ASSOC);
foreach ($movies as $movie) {
echo '<pre>' . print_r($movie, true);
}
// 6. 销毁pdo, 关闭连接
$pdo = null; // unset($pdo) 等价
- 查询3: bindColumn()
# 查询3: bindColumn()
// 1. 连接数据库
require __DIR__ . '/connect.php';
// 2. 创建SQL语句模板
$sql = 'SELECT * FROM `movies` WHERE `cate_id` = :cate_id';
// 3. 创建SQL语句对象
$stmt = $pdo->prepare($sql);
// 4. 将变量绑定到SQL语句模板的命名占位符上
$cate_id = 3;
$stmt->bindParam('cate_id', $cate_id, PDO::PARAM_INT);
// 5. 执行SQL操作
$stmt->execute();
// 将结果集中的记录中的字段, 绑定到指定的变量上
$stmt->bindColumn('name', $name);
$stmt->bindColumn('detail', $detail);
while ($stmt->fetch(PDO::FETCH_ASSOC)) {
$detail = mb_substr($detail,0, 20,'utf-8');
echo '片名: ' . $name . '<br>' . '简介: ' . $detail . '...<hr>';
}
// 6. 销毁pdo, 关闭连接
$pdo = null; // unset($pdo) 等价