博客列表 >PHP大牛成长之路:mysqli与PDO的增删改查操作(CURD)

PHP大牛成长之路:mysqli与PDO的增删改查操作(CURD)

周Sir-BLOG
周Sir-BLOG原创
2020年07月22日 00:42:09530浏览

mysqli与PDO的增删改查操作(CURD)

数据库结构如下:

database.php (演示公用数据库连接参数)

  1. <?php
  2. //直接以一维数组输出
  3. return [
  4. // 数据库类型
  5. 'type' => $type ?? 'mysql', //等于:isset($type)?$type:'mysql';
  6. // 服务器地址
  7. 'hostname' => $hostname ??'127.0.0.1',
  8. // 数据库名
  9. 'database' => $database ?? 'php_pro',
  10. // 用户名
  11. 'username' => $username ?? 'root',
  12. // 密码
  13. 'password' => $password ?? 'root',
  14. // 端口
  15. 'hostport' => $hostport ?? '3306',
  16. // 数据库编码默认采用utf8
  17. 'charset' => $charset ?? 'utf8',
  18. ];

1、mysqli

连接数据库

  1. // 导入配置参数(一维数组)
  2. $config = require './database.php';
  3. // extract(数组,参数,前缀)将关联数组转为独立变量(返回数组长度)
  4. extract($config);
  5. //第二个参数如下:
  6. // EXTR_OVERWRITE - 默认。如果有冲突,则覆盖已有的变量。
  7. // EXTR_SKIP - 如果有冲突,不覆盖已有的变量。
  8. // EXTR_PREFIX_SAME - 如果有冲突,在变量名前加上前缀 prefix。
  9. // EXTR_PREFIX_ALL - 给所有变量名加上前缀 prefix。
  10. // EXTR_PREFIX_INVALID - 仅在不合法或数字变量名前加上前缀 prefix。
  11. // EXTR_IF_EXISTS - 仅在当前符号表中已有同名变量时,覆盖它们的值。其它的都不处理。
  12. // EXTR_PREFIX_IF_EXISTS - 仅在当前符号表中已有同名变量时,建立附加了前缀的变量名,其它的都不处理。
  13. // EXTR_REFS - 将变量作为引用提取。导入的变量仍然引用了数组参数的值。
  14. //加盐
  15. $salt="php.pro";
  16. //连接数据库(示例化mysqli对象)
  17. $mysqli = new mysqli($hostname, $username, $password, $database);
  18. // 检测错误(如果存在错误,终止脚本执行并使用mysqli函数:connect_error 输出mysqli连接错误的描述)
  19. if ($mysqli->connect_errno) exit('Connect Error: ' . $mysqli->connect_error);
  20. // 最好设置数据库字符编码,防止乱码
  21. $mysqli->set_charset($charset);

1.1、mysqli添加操作

  1. // +---------------------------------------------------------
  2. // | 1、mysqli添加操作:
  3. // +---------------------------------------------------------
  4. // step1: sql语句
  5. $sql = 'INSERT `users` SET `username`=?, `age`=?, `email`= ?, `password`=?;';
  6. // $sql = "INSERT INTO `users`(`username`, `age`, `email`,`password`) VALUES (?,?,?,?);";
  7. // step2: 将sql语句转为sql语句对象: stmt对象,预处理对象, 预编译语句对象
  8. $stmt = $mysqli->prepare($sql);
  9. // step3: 给占位符绑定一个变量名(变量标识符)
  10. $stmt->bind_param('sdss', $username,$age,$email,$password);
  11. // 将变量名与一个具体的值进行绑定: 变量赋值
  12. $data = [
  13. 'username' => 'arwang',
  14. 'age' => 30,
  15. 'email' => 'arwang@126.com',
  16. 'password' => md5('123456'.$salt),
  17. ];
  18. // 将关联数组解构成独立变量
  19. extract($data);
  20. // step4:执行
  21. $stmt->execute() or die($stmt->error);
  22. printf('成功的新增了 %s 条记录, 新增主键ID = %d<br>', $stmt->affected_rows, $stmt->insert_id);
  23. // step5:关闭连接
  24. $mysqli->close();

如果要批量添加,可以使用foreach遍历数组,解构变量:

  1. // 通过遍历一个二维数组,可以实现一次性插入多条记录
  2. $users = [
  3. ['username'=> 'xiaoyanzi','age'=>30,'email'=>'xyz@php.cn', 'password'=>md5('123456'.$salt)],
  4. ['username'=> 'ziwei','age'=>20,'email'=>'zw@php.cn', 'password'=>md5('123456'.$salt)],
  5. ['username'=> 'wuage','age'=>25,'email'=>'wag@php.cn', 'password'=md5('123456'.$salt)],
  6. ['username'=> 'erkang','age'=>33,'email'=>'ek@php.cn', 'password'=>md5('123456'.$salt)],
  7. ['username'=> 'jinsuo','age'=>18,'email'=>'js@php.cn', 'password'=>md5('123456'.$salt)],
  8. ];
  9. foreach ($users as $user) {
  10. extract($user);
  11. if ($stmt->execute())
  12. printf('成功的新增了 %s 条记录, 新增主键ID = %d<br>', $stmt->affected_rows, $stmt->insert_id);
  13. else
  14. exit(sprintf('新增失败 , $d: %s', $stmt->errno, $stmt->error ));
  15. }

1.2、mysqli删除操作

  1. // +---------------------------------------------------------
  2. // | 2、mysqli删除操作:
  3. // +---------------------------------------------------------
  4. // step1: sql语句
  5. $sql = 'DELETE FROM `users` WHERE `id` = ?;';
  6. // step2: 将sql语句转为stmt对象
  7. $stmt = $mysqli->prepare($sql);
  8. // step3: 给占位符绑定一个变量名(变量标识符)
  9. $stmt->bind_param('i',$id);
  10. // 变量赋值
  11. $id=19;
  12. // step4:执行更新
  13. $stmt->execute();
  14. printf('删除了 %s 条记录', $stmt->affected_rows);
  15. // step5:关闭连接
  16. $mysqli->close();

1.3、mysqli更新操作

  1. // +---------------------------------------------------------
  2. // | 3、mysqli修改操作:
  3. // +---------------------------------------------------------
  4. // step1: sql语句
  5. $sql = 'UPDATE `users` SET `username`=?, `age`=?, `email`= ?, `password`=? WHERE `id` = ?;';
  6. // step2: 将sql语句转为stmt对象
  7. $stmt = $mysqli->prepare($sql);
  8. // step3: 给占位符绑定一个变量名(变量标识符)
  9. $stmt->bind_param('sissi', $username, $age, $email, $password, $id);
  10. // 变量赋值
  11. $user = ['username'=>'lixiaoming','age'=>23,'email'=>'lixiaoming@php.cn', 'password'=>md5('123456'.$salt), 'id'=>15 ];
  12. // 将关联数组解构成独立变量
  13. extract($user);
  14. // step4:执行更新
  15. $stmt->execute();
  16. printf('更新了 %s 条记录', $stmt->affected_rows);
  17. // step5:关闭连接
  18. $mysqli->close();

1.4、mysqli查询操作

  1. // mysqli查询1: fetch_assoc() + while()
  2. // step1: sql语句
  3. $sql = 'SELECT * FROM `users` WHERE `id` > ?';
  4. // step2: 将sql语句转为stmt对象
  5. $stmt = $mysqli->prepare($sql);
  6. $stmt->bind_param('i', $id);
  7. $id = 5;
  8. // step3:执行查询
  9. $stmt->execute() or die($stmt->error);
  10. // step4:获取结果集
  11. $result = $stmt->get_result();
  12. if ($result->num_rows === 0) exit('结果为空');
  13. // fetch_assoc():以关联数组方式返回一个记录
  14. // 循环遍历
  15. while ($user=$result->fetch_assoc()) {
  16. vprintf('%d: %s | %s <br>', $user);
  17. }
  18. // step5:释放结果
  19. $result->free();
  20. // step6:关闭连接
  21. $mysqli->close();
  1. // mysqli查询2: fetch_all() + foreach()
  2. // step1: sql语句
  3. $sql = 'SELECT * FROM `users` WHERE `id` > ?';
  4. // step2: 将sql语句转为stmt对象
  5. $stmt = $mysqli->prepare($sql);
  6. $stmt->bind_param('i', $id);
  7. $id = 5;
  8. // step3:执行查询
  9. $stmt->execute() or die($stmt->error);
  10. // step4:获取结果集
  11. $result = $stmt->get_result();
  12. if ($result->num_rows === 0) exit('结果为空');
  13. // fetch_all():以二维关联数组方式返回一个满足查询条件的所有记录集合
  14. $users=$result->fetch_all(MYSQLI_ASSOC);
  15. // 循环遍历
  16. foreach ($users as $user) {
  17. vprintf('%d: %s ******* | %s <br>', $user);
  18. }
  19. // step5:释放结果
  20. $result->free();
  21. // step6:关闭连接
  22. $mysqli->close();
  1. // mysqli查询3: bind_result() + fetch() + while()
  2. // 将结果集中的每条记录的每个字段,与一个变量进行绑定
  3. // step1: sql语句
  4. $sql = 'SELECT `id`,`username`,`age`,`email` FROM `users` WHERE `id` > ?';
  5. // step2: 将sql语句转为stmt对象
  6. $stmt = $mysqli->prepare($sql);
  7. $stmt->bind_param('i', $id);
  8. $id = 5;
  9. // step3:执行查询
  10. $stmt->execute() or die($stmt->error);
  11. // step4:字段与变量的绑定
  12. $stmt->bind_result($id,$username,$age,$email);
  13. // 因为当前操作不涉及结果集对象,如果要获取结果集中的数量,用以下二行代码
  14. $stmt->store_result();
  15. if ($stmt->num_rows === 0) exit('没有内容');
  16. // 循环遍历
  17. while ($stmt->fetch()) {
  18. printf('%d: %s --%d--| %s <br>', $id,$username,$age, $email);
  19. }
  20. // step5:关闭连接
  21. $mysqli->close();

2、PDO

连接数据库

  1. // 导入配置参数(一维数组)
  2. $config = require './database.php';
  3. // extract(数组,参数,前缀)将关联数组转为独立变量(返回数组长度)
  4. extract($config);
  5. //加盐
  6. $salt="php.pro";
  7. // 创建连接对象: 连接数据库
  8. // $dsn: 数据源名称
  9. // $dsn = 'mysql:host=localhost;dbname=phpedu;charset=utf8;port=3306';
  10. try {
  11. $dsn= sprintf('%s:host=%s;dbname=%s;charset=%s;port=%s',$type,$hostname,$database,$charset,$hostport);
  12. $pdo = new PDO($dsn, $username, $password);
  13. // 设置结果集的默认获取模式: 只关心关联数组部分
  14. $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
  15. } catch (PDOException $e) {
  16. exit('Connection Error: ' . $e->getMessage());
  17. }

2.1、PDO添加操作

2.1.1 bindParam变量名绑定, 引用绑定

  1. // +---------------------------------------------------------
  2. // | 1、PDO添加操作:
  3. // +---------------------------------------------------------
  4. // step1: sql语句
  5. $sql = 'INSERT `users` SET `username`=?, `age`=?, `email`= ?, `password`=?;';
  6. // step2: 将sql语句转为PDOstmt对象
  7. $stmt = $pdo->prepare($sql);
  8. // step3: ? 与 变量名绑定, 引用绑定
  9. $stmt->bindParam(1, $username, PDO::PARAM_STR, 30);
  10. $stmt->bindParam(2, $age, PDO::PARAM_INT, 3);
  11. $stmt->bindParam(3, $email, PDO::PARAM_STR, 100);
  12. $stmt->bindParam(4, $password, PDO::PARAM_STR, 32);
  13. // 将变量名与一个具体的值进行绑定: 变量赋值
  14. $data = [
  15. 'username' => 'arwang',
  16. 'age' => 30,
  17. 'email' => 'arwang@126.com',
  18. 'password' => md5('123456'.$salt),
  19. ];
  20. // 将关联数组解构成独立变量
  21. extract($data);
  22. // step4:执行
  23. $stmt->execute() or die(print_r($stmt->errorInfo(),true));
  24. // rowCount():返回表中受影响的记录数量,当前是新增的记录数量
  25. if ($stmt->rowCount() > 0) echo '新增成功 ' . $stmt->rowCount() . ' 条记录,主键id: ' . $pdo->lastInsertId();
  26. // step5:关闭连接
  27. // $pdo = null;
  28. unset($pdo);

2.1.2 bindValue值绑定,变量必须先赋值

  1. // +---------------------------------------------------------
  2. // | 1、PDO添加操作:
  3. // +---------------------------------------------------------
  4. // `bindValue `值绑定,变量必须先赋值
  5. // step1: sql语句
  6. $sql = 'INSERT `users` SET `username`=?, `age`=?, `email`= ?, `password`=?;';
  7. // step2: 将sql语句转为PDOstmt对象
  8. $stmt = $pdo->prepare($sql);
  9. // step3: ? 与 值绑定,变量必须先赋值
  10. // 变量赋值
  11. $data = [
  12. 'username' => 'arwang',
  13. 'age' => 30,
  14. 'email' => 'arwang@126.com',
  15. 'password' => md5('123456'.$salt),
  16. ];
  17. // 将关联数组解构成独立变量
  18. extract($data);
  19. // 值绑定
  20. $stmt->bindValue(1, $username, PDO::PARAM_STR);
  21. $stmt->bindParam(2, $age, PDO::PARAM_INT);
  22. $stmt->bindValue(3, $email, PDO::PARAM_STR);
  23. $stmt->bindValue(4, $password, PDO::PARAM_STR);
  24. // step4:执行
  25. $stmt->execute() or die(print_r($stmt->errorInfo(),true));
  26. // rowCount():返回表中受影响的记录数量,当前是新增的记录数量
  27. if ($stmt->rowCount() > 0) echo '新增成功 ' . $stmt->rowCount() . ' 条记录,主键id: ' . $pdo->lastInsertId();
  28. // step5:关闭连接
  29. // $pdo = null;
  30. unset($pdo);

2.1.3 bindValue值绑定简化操作

  1. // +---------------------------------------------------------
  2. // | 1、PDO添加操作:
  3. // +---------------------------------------------------------
  4. // `bindValue `值绑定简化方式
  5. // step1: sql语句
  6. $sql = 'INSERT `users` SET `username`=?, `age`=?, `email`= ?, `password`=?;';
  7. // step2: 将sql语句转为PDOstmt对象
  8. $stmt = $pdo->prepare($sql);
  9. // step3: ? 与 值绑定,变量必须先赋值
  10. // 数组赋值
  11. $data = ['arwang',30,'arwang@126.com',md5('123456'.$salt)];
  12. // step4:执行
  13. $stmt->execute($data) or die(print_r($stmt->errorInfo(),true));
  14. // rowCount():返回表中受影响的记录数量,当前是新增的记录数量
  15. if ($stmt->rowCount() > 0) echo '新增成功 ' . $stmt->rowCount() . ' 条记录,主键id: ' . $pdo->lastInsertId();
  16. // step5:关闭连接
  17. // $pdo = null;
  18. unset($pdo);

2.2、PDO删除操作

  1. // +---------------------------------------------------------
  2. // | 2、PDO删除操作:
  3. // +---------------------------------------------------------
  4. // step1: sql语句
  5. $sql = 'DELETE FROM `users` WHERE `id` = ?;';
  6. // step2: 将sql语句转为PDOstmt对象
  7. $stmt = $pdo->prepare($sql);
  8. // step3:执行
  9. // 值直接绑定到匿名占位符?上面
  10. $stmt->execute([22]);
  11. if ($stmt->rowCount() > 0) echo '删除成功 ' . $stmt->rowCount() . ' 条记录';
  12. // step4:关闭连接
  13. unset($pdo);

2.3、PDO修改操作

  1. // +---------------------------------------------------------
  2. // | 3、PDO修改操作:
  3. // +---------------------------------------------------------
  4. // step1: sql语句
  5. $sql = 'UPDATE `users` SET `username`=?,`age`=?, `email`= ?, `password`=? WHERE `id` = ?;';
  6. // step2: 将sql语句转为PDOstmt对象
  7. $stmt = $pdo->prepare($sql);
  8. // step3:执行
  9. // 将值直接绑定到匿名占位符?上面
  10. $stmt->execute(['arwang',33,'arwang@php.cn', md5('123456'.$salt), 11]);
  11. if ($stmt->rowCount() > 0) echo '更新成功 ' . $stmt->rowCount() . ' 条记录';
  12. // step4:关闭连接
  13. unset($pdo);

2.4、PDO查询操作

  1. // pdo查询操作: fetch() + while()
  2. // step1: sql语句
  3. $sql = 'SELECT `id`,`username`,`age`,`email` FROM `users` WHERE `id` >= ?;';
  4. // step2: 将sql语句转为PDOstmt对象
  5. $stmt = $pdo->prepare($sql);
  6. // step3:执行
  7. // 将值直接绑定到匿名占位符?上面
  8. $stmt->execute([5]);
  9. while ($user = $stmt->fetch()) {
  10. vprintf('<li>%s: %s | %s</li>', $user);
  11. }
  12. // step4:关闭连接
  13. unset($pdo);
  1. // pdo查询操作2: fetchAll() + foreach()
  2. // step1: sql语句
  3. $sql = 'SELECT `id`,`username`,`age`,`email` FROM `users` WHERE `id` >= ?;';
  4. // step2: 将sql语句转为PDOstmt对象
  5. $stmt = $pdo->prepare($sql);
  6. // 将值直接绑定到匿名占位符?上面
  7. $stmt->execute([5]);
  8. $users = $stmt->fetchAll();
  9. foreach ($users as $user) {
  10. vprintf('<li>%s: %s | %s</li>', $user);
  11. }
  12. // step4:关闭连接
  13. unset($pdo);
  1. // +---------------------------------------------------------
  2. // | 4、PDO查询操作:
  3. // +---------------------------------------------------------
  4. // pdo查询操作3: bindColumn() + fetch() + while()
  5. // step1: sql语句
  6. $sql = 'SELECT `id`,`username`,`age`,`email` FROM `users` WHERE `id` >= ?;';
  7. // step2: 将sql语句转为PDOstmt对象
  8. $stmt = $pdo->prepare($sql);
  9. // step3:执行
  10. // 将值直接绑定到匿名占位符?上面
  11. $stmt->execute([5]);
  12. // 将三个字段与三个变量绑定
  13. $stmt->bindColumn('id', $id);
  14. $stmt->bindColumn('username', $username);
  15. $stmt->bindColumn('age', $age);
  16. $stmt->bindColumn('email', $email);
  17. while ($stmt->fetch(PDO::FETCH_BOUND)) {zensan
  18. printf('<li>%d: %s -%d | %s</li>',$id, $username,$age, $email);
  19. }
  20. // step4:关闭连接
  21. unset($pdo);

总结

  • 对mysqli和PDO的增删改查有了更深的理解
  • mysqli和PDO的常用方法使用老师总结的写在了另一篇博客,因为老师总结的值得收藏查阅。
    https://www.php.cn/blog/detail/23346.html
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议