mysqli与PDO的增删改查操作(CURD)
数据库结构如下:
database.php (演示公用数据库连接参数)
<?php
//直接以一维数组输出
return [
// 数据库类型
'type' => $type ?? 'mysql', //等于:isset($type)?$type:'mysql';
// 服务器地址
'hostname' => $hostname ??'127.0.0.1',
// 数据库名
'database' => $database ?? 'php_pro',
// 用户名
'username' => $username ?? 'root',
// 密码
'password' => $password ?? 'root',
// 端口
'hostport' => $hostport ?? '3306',
// 数据库编码默认采用utf8
'charset' => $charset ?? 'utf8',
];
1、mysqli
连接数据库
// 导入配置参数(一维数组)
$config = require './database.php';
// extract(数组,参数,前缀)将关联数组转为独立变量(返回数组长度)
extract($config);
//第二个参数如下:
// EXTR_OVERWRITE - 默认。如果有冲突,则覆盖已有的变量。
// EXTR_SKIP - 如果有冲突,不覆盖已有的变量。
// EXTR_PREFIX_SAME - 如果有冲突,在变量名前加上前缀 prefix。
// EXTR_PREFIX_ALL - 给所有变量名加上前缀 prefix。
// EXTR_PREFIX_INVALID - 仅在不合法或数字变量名前加上前缀 prefix。
// EXTR_IF_EXISTS - 仅在当前符号表中已有同名变量时,覆盖它们的值。其它的都不处理。
// EXTR_PREFIX_IF_EXISTS - 仅在当前符号表中已有同名变量时,建立附加了前缀的变量名,其它的都不处理。
// EXTR_REFS - 将变量作为引用提取。导入的变量仍然引用了数组参数的值。
//加盐
$salt="php.pro";
//连接数据库(示例化mysqli对象)
$mysqli = new mysqli($hostname, $username, $password, $database);
// 检测错误(如果存在错误,终止脚本执行并使用mysqli函数:connect_error 输出mysqli连接错误的描述)
if ($mysqli->connect_errno) exit('Connect Error: ' . $mysqli->connect_error);
// 最好设置数据库字符编码,防止乱码
$mysqli->set_charset($charset);
1.1、mysqli添加操作
// +---------------------------------------------------------
// | 1、mysqli添加操作:
// +---------------------------------------------------------
// step1: sql语句
$sql = 'INSERT `users` SET `username`=?, `age`=?, `email`= ?, `password`=?;';
// $sql = "INSERT INTO `users`(`username`, `age`, `email`,`password`) VALUES (?,?,?,?);";
// step2: 将sql语句转为sql语句对象: stmt对象,预处理对象, 预编译语句对象
$stmt = $mysqli->prepare($sql);
// step3: 给占位符绑定一个变量名(变量标识符)
$stmt->bind_param('sdss', $username,$age,$email,$password);
// 将变量名与一个具体的值进行绑定: 变量赋值
$data = [
'username' => 'arwang',
'age' => 30,
'email' => 'arwang@126.com',
'password' => md5('123456'.$salt),
];
// 将关联数组解构成独立变量
extract($data);
// step4:执行
$stmt->execute() or die($stmt->error);
printf('成功的新增了 %s 条记录, 新增主键ID = %d<br>', $stmt->affected_rows, $stmt->insert_id);
// step5:关闭连接
$mysqli->close();
如果要批量添加,可以使用
foreach
遍历数组,解构变量:
// 通过遍历一个二维数组,可以实现一次性插入多条记录
$users = [
['username'=> 'xiaoyanzi','age'=>30,'email'=>'xyz@php.cn', 'password'=>md5('123456'.$salt)],
['username'=> 'ziwei','age'=>20,'email'=>'zw@php.cn', 'password'=>md5('123456'.$salt)],
['username'=> 'wuage','age'=>25,'email'=>'wag@php.cn', 'password'=md5('123456'.$salt)],
['username'=> 'erkang','age'=>33,'email'=>'ek@php.cn', 'password'=>md5('123456'.$salt)],
['username'=> 'jinsuo','age'=>18,'email'=>'js@php.cn', 'password'=>md5('123456'.$salt)],
];
foreach ($users as $user) {
extract($user);
if ($stmt->execute())
printf('成功的新增了 %s 条记录, 新增主键ID = %d<br>', $stmt->affected_rows, $stmt->insert_id);
else
exit(sprintf('新增失败 , $d: %s', $stmt->errno, $stmt->error ));
}
1.2、mysqli删除操作
// +---------------------------------------------------------
// | 2、mysqli删除操作:
// +---------------------------------------------------------
// step1: sql语句
$sql = 'DELETE FROM `users` WHERE `id` = ?;';
// step2: 将sql语句转为stmt对象
$stmt = $mysqli->prepare($sql);
// step3: 给占位符绑定一个变量名(变量标识符)
$stmt->bind_param('i',$id);
// 变量赋值
$id=19;
// step4:执行更新
$stmt->execute();
printf('删除了 %s 条记录', $stmt->affected_rows);
// step5:关闭连接
$mysqli->close();
1.3、mysqli更新操作
// +---------------------------------------------------------
// | 3、mysqli修改操作:
// +---------------------------------------------------------
// step1: sql语句
$sql = 'UPDATE `users` SET `username`=?, `age`=?, `email`= ?, `password`=? WHERE `id` = ?;';
// step2: 将sql语句转为stmt对象
$stmt = $mysqli->prepare($sql);
// step3: 给占位符绑定一个变量名(变量标识符)
$stmt->bind_param('sissi', $username, $age, $email, $password, $id);
// 变量赋值
$user = ['username'=>'lixiaoming','age'=>23,'email'=>'lixiaoming@php.cn', 'password'=>md5('123456'.$salt), 'id'=>15 ];
// 将关联数组解构成独立变量
extract($user);
// step4:执行更新
$stmt->execute();
printf('更新了 %s 条记录', $stmt->affected_rows);
// step5:关闭连接
$mysqli->close();
1.4、mysqli查询操作
// mysqli查询1: fetch_assoc() + while()
// step1: sql语句
$sql = 'SELECT * FROM `users` WHERE `id` > ?';
// step2: 将sql语句转为stmt对象
$stmt = $mysqli->prepare($sql);
$stmt->bind_param('i', $id);
$id = 5;
// step3:执行查询
$stmt->execute() or die($stmt->error);
// step4:获取结果集
$result = $stmt->get_result();
if ($result->num_rows === 0) exit('结果为空');
// fetch_assoc():以关联数组方式返回一个记录
// 循环遍历
while ($user=$result->fetch_assoc()) {
vprintf('%d: %s | %s <br>', $user);
}
// step5:释放结果
$result->free();
// step6:关闭连接
$mysqli->close();
// mysqli查询2: fetch_all() + foreach()
// step1: sql语句
$sql = 'SELECT * FROM `users` WHERE `id` > ?';
// step2: 将sql语句转为stmt对象
$stmt = $mysqli->prepare($sql);
$stmt->bind_param('i', $id);
$id = 5;
// step3:执行查询
$stmt->execute() or die($stmt->error);
// step4:获取结果集
$result = $stmt->get_result();
if ($result->num_rows === 0) exit('结果为空');
// fetch_all():以二维关联数组方式返回一个满足查询条件的所有记录集合
$users=$result->fetch_all(MYSQLI_ASSOC);
// 循环遍历
foreach ($users as $user) {
vprintf('%d: %s ******* | %s <br>', $user);
}
// step5:释放结果
$result->free();
// step6:关闭连接
$mysqli->close();
// mysqli查询3: bind_result() + fetch() + while()
// 将结果集中的每条记录的每个字段,与一个变量进行绑定
// step1: sql语句
$sql = 'SELECT `id`,`username`,`age`,`email` FROM `users` WHERE `id` > ?';
// step2: 将sql语句转为stmt对象
$stmt = $mysqli->prepare($sql);
$stmt->bind_param('i', $id);
$id = 5;
// step3:执行查询
$stmt->execute() or die($stmt->error);
// step4:字段与变量的绑定
$stmt->bind_result($id,$username,$age,$email);
// 因为当前操作不涉及结果集对象,如果要获取结果集中的数量,用以下二行代码
$stmt->store_result();
if ($stmt->num_rows === 0) exit('没有内容');
// 循环遍历
while ($stmt->fetch()) {
printf('%d: %s --%d--| %s <br>', $id,$username,$age, $email);
}
// step5:关闭连接
$mysqli->close();
2、PDO
连接数据库
// 导入配置参数(一维数组)
$config = require './database.php';
// extract(数组,参数,前缀)将关联数组转为独立变量(返回数组长度)
extract($config);
//加盐
$salt="php.pro";
// 创建连接对象: 连接数据库
// $dsn: 数据源名称
// $dsn = 'mysql:host=localhost;dbname=phpedu;charset=utf8;port=3306';
try {
$dsn= sprintf('%s:host=%s;dbname=%s;charset=%s;port=%s',$type,$hostname,$database,$charset,$hostport);
$pdo = new PDO($dsn, $username, $password);
// 设置结果集的默认获取模式: 只关心关联数组部分
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
} catch (PDOException $e) {
exit('Connection Error: ' . $e->getMessage());
}
2.1、PDO添加操作
2.1.1 bindParam
变量名绑定, 引用绑定
// +---------------------------------------------------------
// | 1、PDO添加操作:
// +---------------------------------------------------------
// step1: sql语句
$sql = 'INSERT `users` SET `username`=?, `age`=?, `email`= ?, `password`=?;';
// step2: 将sql语句转为PDOstmt对象
$stmt = $pdo->prepare($sql);
// step3: ? 与 变量名绑定, 引用绑定
$stmt->bindParam(1, $username, PDO::PARAM_STR, 30);
$stmt->bindParam(2, $age, PDO::PARAM_INT, 3);
$stmt->bindParam(3, $email, PDO::PARAM_STR, 100);
$stmt->bindParam(4, $password, PDO::PARAM_STR, 32);
// 将变量名与一个具体的值进行绑定: 变量赋值
$data = [
'username' => 'arwang',
'age' => 30,
'email' => 'arwang@126.com',
'password' => md5('123456'.$salt),
];
// 将关联数组解构成独立变量
extract($data);
// step4:执行
$stmt->execute() or die(print_r($stmt->errorInfo(),true));
// rowCount():返回表中受影响的记录数量,当前是新增的记录数量
if ($stmt->rowCount() > 0) echo '新增成功 ' . $stmt->rowCount() . ' 条记录,主键id: ' . $pdo->lastInsertId();
// step5:关闭连接
// $pdo = null;
unset($pdo);
2.1.2 bindValue
值绑定,变量必须先赋值
// +---------------------------------------------------------
// | 1、PDO添加操作:
// +---------------------------------------------------------
// `bindValue `值绑定,变量必须先赋值
// step1: sql语句
$sql = 'INSERT `users` SET `username`=?, `age`=?, `email`= ?, `password`=?;';
// step2: 将sql语句转为PDOstmt对象
$stmt = $pdo->prepare($sql);
// step3: ? 与 值绑定,变量必须先赋值
// 变量赋值
$data = [
'username' => 'arwang',
'age' => 30,
'email' => 'arwang@126.com',
'password' => md5('123456'.$salt),
];
// 将关联数组解构成独立变量
extract($data);
// 值绑定
$stmt->bindValue(1, $username, PDO::PARAM_STR);
$stmt->bindParam(2, $age, PDO::PARAM_INT);
$stmt->bindValue(3, $email, PDO::PARAM_STR);
$stmt->bindValue(4, $password, PDO::PARAM_STR);
// step4:执行
$stmt->execute() or die(print_r($stmt->errorInfo(),true));
// rowCount():返回表中受影响的记录数量,当前是新增的记录数量
if ($stmt->rowCount() > 0) echo '新增成功 ' . $stmt->rowCount() . ' 条记录,主键id: ' . $pdo->lastInsertId();
// step5:关闭连接
// $pdo = null;
unset($pdo);
2.1.3 bindValue
值绑定简化操作
// +---------------------------------------------------------
// | 1、PDO添加操作:
// +---------------------------------------------------------
// `bindValue `值绑定简化方式
// step1: sql语句
$sql = 'INSERT `users` SET `username`=?, `age`=?, `email`= ?, `password`=?;';
// step2: 将sql语句转为PDOstmt对象
$stmt = $pdo->prepare($sql);
// step3: ? 与 值绑定,变量必须先赋值
// 数组赋值
$data = ['arwang',30,'arwang@126.com',md5('123456'.$salt)];
// step4:执行
$stmt->execute($data) or die(print_r($stmt->errorInfo(),true));
// rowCount():返回表中受影响的记录数量,当前是新增的记录数量
if ($stmt->rowCount() > 0) echo '新增成功 ' . $stmt->rowCount() . ' 条记录,主键id: ' . $pdo->lastInsertId();
// step5:关闭连接
// $pdo = null;
unset($pdo);
2.2、PDO删除操作
// +---------------------------------------------------------
// | 2、PDO删除操作:
// +---------------------------------------------------------
// step1: sql语句
$sql = 'DELETE FROM `users` WHERE `id` = ?;';
// step2: 将sql语句转为PDOstmt对象
$stmt = $pdo->prepare($sql);
// step3:执行
// 值直接绑定到匿名占位符?上面
$stmt->execute([22]);
if ($stmt->rowCount() > 0) echo '删除成功 ' . $stmt->rowCount() . ' 条记录';
// step4:关闭连接
unset($pdo);
2.3、PDO修改操作
// +---------------------------------------------------------
// | 3、PDO修改操作:
// +---------------------------------------------------------
// step1: sql语句
$sql = 'UPDATE `users` SET `username`=?,`age`=?, `email`= ?, `password`=? WHERE `id` = ?;';
// step2: 将sql语句转为PDOstmt对象
$stmt = $pdo->prepare($sql);
// step3:执行
// 将值直接绑定到匿名占位符?上面
$stmt->execute(['arwang',33,'arwang@php.cn', md5('123456'.$salt), 11]);
if ($stmt->rowCount() > 0) echo '更新成功 ' . $stmt->rowCount() . ' 条记录';
// step4:关闭连接
unset($pdo);
2.4、PDO查询操作
// pdo查询操作: fetch() + while()
// step1: sql语句
$sql = 'SELECT `id`,`username`,`age`,`email` FROM `users` WHERE `id` >= ?;';
// step2: 将sql语句转为PDOstmt对象
$stmt = $pdo->prepare($sql);
// step3:执行
// 将值直接绑定到匿名占位符?上面
$stmt->execute([5]);
while ($user = $stmt->fetch()) {
vprintf('<li>%s: %s | %s</li>', $user);
}
// step4:关闭连接
unset($pdo);
// pdo查询操作2: fetchAll() + foreach()
// step1: sql语句
$sql = 'SELECT `id`,`username`,`age`,`email` FROM `users` WHERE `id` >= ?;';
// step2: 将sql语句转为PDOstmt对象
$stmt = $pdo->prepare($sql);
// 将值直接绑定到匿名占位符?上面
$stmt->execute([5]);
$users = $stmt->fetchAll();
foreach ($users as $user) {
vprintf('<li>%s: %s | %s</li>', $user);
}
// step4:关闭连接
unset($pdo);
// +---------------------------------------------------------
// | 4、PDO查询操作:
// +---------------------------------------------------------
// pdo查询操作3: bindColumn() + fetch() + while()
// step1: sql语句
$sql = 'SELECT `id`,`username`,`age`,`email` FROM `users` WHERE `id` >= ?;';
// step2: 将sql语句转为PDOstmt对象
$stmt = $pdo->prepare($sql);
// step3:执行
// 将值直接绑定到匿名占位符?上面
$stmt->execute([5]);
// 将三个字段与三个变量绑定
$stmt->bindColumn('id', $id);
$stmt->bindColumn('username', $username);
$stmt->bindColumn('age', $age);
$stmt->bindColumn('email', $email);
while ($stmt->fetch(PDO::FETCH_BOUND)) {zensan
printf('<li>%d: %s -%d | %s</li>',$id, $username,$age, $email);
}
// step4:关闭连接
unset($pdo);
总结
- 对mysqli和PDO的增删改查有了更深的理解
- mysqli和PDO的常用方法使用老师总结的写在了另一篇博客,因为老师总结的值得收藏查阅。
https://www.php.cn/blog/detail/23346.html