PDO常用的CURD操作
1.数据库配置文件,示例
<?php
// database.php
// 数据库连接默认参数
return [
// 数据库的类型
'type' => 'mysql',
// 数据库默认主机
'host' => 'localhost',
// 默认数据库
'dbname' => 'dbname',
// 默认的用户名
'username' => 'username',
// 默认的用户密码
'password' => 'username',
// 默认端口号
'port' => '3306',
// 默认字符编码集
'charset' => 'utf8',
];
2.数据库连接文件,示例
2.1 获取配置项
2.2 自定义数据库配置
2.3 用自定义数组替换获取的配置项$config = array_merge($config, $custom);
2.4 解析配置项(将配置项中的数组值解析到变量)['username'=>$username,'password'=>$password] = $config;
2.5 创建数据源DSN(连接语句对象化)
2.6 创建PDO实例(连接数据库,在此时进行传参)
<?php
// 连接数据库
// 1. 获取配置项
$config = require __DIR__ . '/database.php';
// print_r($config);
// 自定义配置
$custom = [
// 数据库默认主机
'host' => 'localhost',
// 默认数据库
'dbname' => 'phpedu',
// 默认的用户名
'username' => 'root',
// 默认的用户密码
'password' => 'root',
];
// 数组替换更新
$config = array_merge($config, $custom);
// print_r($config);
// 2. 解析配置项
// ['id'=>$id, 'name'=>$name]=['id'=>1,'name'=>'a'];
['type'=>$type,'host'=>$host,'dbname'=>$dbname] = $config;
['username'=>$username,'password'=>$password] = $config;
['port'=>$port,'charset'=>$charset] = $config;
// echo $type, $username, $charset;
// extract($config);
// 3. 创建数据源DSN
// echo vsprintf('%s,%s,%s', ['php','cn','zhu']);
$tmpl = '%s:host=%s;dbname=%s;port=%s;charset=%s';
$params = [$type,$host,$dbname,$port,$charset];
$dsn = vsprintf($tmpl, $params);
// echo $dsn;
// 4. 创建PDO实例(连接数据库)
try {
$db = new PDO($dsn, $username, $password);
// if ($db) {
// echo '连接成功';
// }
// var_dump($db);
// 设置结果集的获取模式: 仅返回关联部分
$db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
} catch (PDOException $e) {
die('连接失败' . $e->getMessage());
}
3. 连接数据库实例(单一文件)
<?php
// 快速预览
// 1.连接数据库
$db = new PDO('mysql:dbname=phpedu','root','root');
// 2.执行SQL
$stmt = $db->prepare('select id,name,email from user limit 1');
$stmt ->execute();
print_r($stmt->fetch(PDO::FETCH_ASSOC));
// 3.关闭连接
unset($db);
简化版
<?php
// ? 连接数据库
// 1. 连接数据库: PDO类实例
$username = 'root';
$password = 'root';
$dsn = 'mysql:dbname=phpedu';
try {
$db = new PDO($dsn, $username, $password);
if ($db) {
echo '连接成功';
}
} catch (PDOException $e) {
die('连接失败' . $e->getMessage());
}
4.数据库操作之:新增(Insert)(命名占位符)
<?php
// ? 新增: INSERT-1
// 1. 连接数据库
require __DIR__ . '/config/connect.php';
// 2. 执行操作
// sql: 预处理,sql中的数据使用占位符(参数)
// 参数有二种: (1) 命名占位符 ":email" (2) 匿名占位符: "?"
$sql = 'INSERT user VALUES (null,:uname,:email,:password)';
// ? 创建sql语句对象 PDOStatement的实例
$stmt = $db->prepare($sql);
// var_dump($stmt);
// ? 将具体的值绑定到参数上
$stmt->bindValue('uname', '老张');
$stmt->bindValue('email', 'lz@qq.com');
$stmt->bindValue('password', md5('123'));
// 查看一下预处理sql语句
// $stmt->debugDumpParams();
// ? 执行sql
if ($stmt->execute()) {
// 成功
echo '新增成功, 新记录的主键ID = ' . $db->lastInsertId();
} else {
echo '新增失败';
print_r($stmt->errorInfo());
}
// 3. 关闭连接(可选)
// unset($db);
// $db = null;
4.数据库操作之:新增2(匿名占位符)
<?php
// ? 新增: INSERT-2
// 1. 连接数据库
require __DIR__ . '/config/connect.php';
// 2. 执行操作
// sql: 预处理,sql中的数据使用占位符(参数)
// 参数有二种: (1) 命名占位符 ":email" (2) 匿名占位符: "?"
$sql = 'INSERT user VALUES (null,?,?,?)';
// ? 创建sql语句对象 PDOStatement的实例
$stmt = $db->prepare($sql);
// ? 执行sql
if ($stmt->execute(['小猪', 'xz@php.cn', md5('abc')])) {
// 成功
echo '新增成功, 新记录的主键ID = ' . $db->lastInsertId();
} else {
echo '新增失败';
print_r($stmt->errorInfo());
}
// 3. 关闭连接(可选)
// unset($db);
// $db = null;
5. 数据库操作之:更新
<?php
// ? 更新: UPDATE
// 1. 连接数据库
require __DIR__ . '/config/connect.php';
// 2. 执行操作
$sql = 'UPDATE user SET uname= ? WHERE id = ?';
// $sql = 'UPDATE user SET uname= ?';
// 检测sql语句中是否存在 where 条件?没有则禁止执行
if (!stristr($sql, 'WHERE')) {
die('禁止无条件更新');
}
// ? 创建sql语句对象
$stmt = $db->prepare($sql);
// ? 将某个变量绑定到参数上
$stmt->bindParam(1, $uname);
$stmt->bindParam(2, $id);
$uname = '西门庆';
$id = 4;
// ? 执行sql
if ($stmt->execute()) {
// $stmt->debugDumpParams();
// 更新成功有二种情况,1.数据变化了,2.数据没有发生变化
// rowCount(): 返回受影响的记录数量(修改了)
if ($stmt->rowCount() > 0) {
echo '更新成功';
} else {
echo '没有记录被更新';
}
} else {
// echo '更新失败';
// print_r($stmt->errorInfo());
die('更新失败: '. $stmt->errorInfo()[2]);
}
6.数据库操作之:删除
<?php
// ? 删除: DELETE
// 1. 连接数据库
require __DIR__ . '/config/connect.php';
// 2. 执行操作
$sql = 'DELETE FROM user WHERE id = ?';
// $sql = 'DELETE FROM user';
// 检测sql语句中是否存在 where 条件?没有则禁止执行
if (!stristr($sql, 'WHERE')) {
die('禁止无条件删除');
}
// ? 创建sql语句对象
$stmt = $db->prepare($sql);
// ? 执行sql
if ($stmt->execute([4])) {
if ($stmt->rowCount() > 0) {
echo '删除成功';
} else {
echo '没有记录被删除';
}
} else {
die('删除失败: '. $stmt->errorInfo()[2]);
}
7.数据库操作之:查询1
<?php
// ? 查询: SELECT-1
// 1. 连接数据库
require __DIR__ . '/config/connect.php';
// 2. 执行操作
$sql = 'SELECT id,uname,email FROM user WHERE id IN (?,?,?)';
// ? 创建sql语句对象
$stmt = $db->prepare($sql);
// ? 执行sql
if ($stmt->execute([2, 3, 6])) {
// 查询成功,结果集解析到数组中
// 1. 逐条: fetch + while
// 2. 多条: fetchAll + foreach
// print_r($stmt->fetch());
// print_r($stmt->fetch());
// print_r($stmt->fetch());
// print_r($stmt->fetch(PDO::FETCH_ASSOC));
// print_r($stmt->fetch(PDO::FETCH_NUM));
// fetch + while
while ($user = $stmt->fetch()) {
print_r($user);
}
} else {
die('查询失败: ' . $stmt->errorInfo()[2]);
}
7.数据库操作之:查询2
<?php
// ? 查询: SELECT-1
// 1. 连接数据库
require __DIR__ . '/config/connect.php';
// 2. 执行操作
$sql = 'SELECT id,uname,email FROM user WHERE id IN (?,?,?)';
// ? 创建sql语句对象
$stmt = $db->prepare($sql);
// ? 执行sql
if ($stmt->execute([2, 3, 6])) {
// 查询成功,结果集解析到数组中
// 1. 逐条: fetch + while
// 2. 多条: fetchAll + foreach
// print_r($stmt->fetch());
// print_r($stmt->fetch());
// print_r($stmt->fetch());
// print_r($stmt->fetch(PDO::FETCH_ASSOC));
// print_r($stmt->fetch(PDO::FETCH_NUM));
// fetch + while
while ($user = $stmt->fetch()) {
print_r($user);
}
} else {
die('查询失败: ' . $stmt->errorInfo()[2]);
}
7.数据库操作之:查询3
<?php
// ? 查询: SELECT-3: 将列名绑定到变量上
// 1. 连接数据库
require __DIR__ . '/config/connect.php';
// 2. 执行操作
$sql = 'SELECT id,uname,email FROM user WHERE id IN (?,?,?)';
// ? 创建sql语句对象
$stmt = $db->prepare($sql);
// ? 执行sql
if ($stmt->execute([2,3,6])) {
// 将每一列的值,绑定到指定变量上
// 三个字段,三个变量
// 字段的索引,1,2,3,4....
// $stmt->bindColumn(1, $id);
// $stmt->bindColumn(2, $uname);
// $stmt->bindColumn(3, $email);
// 用字段名称
$stmt->bindColumn('id', $id);
$stmt->bindColumn('uname', $uname);
$stmt->bindColumn('email', $email);
while ($stmt->fetch()) {
printf("%d: %s ( %s )\n", $id, $uname, $email);
}
} else {
die('查询失败: '. $stmt->errorInfo()[2]);
}