博客列表 >MySQLi常见CURD操作和接口实战(0211)

MySQLi常见CURD操作和接口实战(0211)

暴风战斧
暴风战斧原创
2020年02月20日 17:22:121039浏览

编程思路

MySQLi常见CURD操作直观好理解,直接写代码;接口实现数据库操作理解的时候容易理解错,多看了几遍视频看课件注释帮助理解最后写代码。

作业总结

接口实战编程完后,测试时遇到蛮多报错,都是自己小失误造成的,比如查询的’WHERE’没有敲空格,导致SQL语句不生效,’ WHERE ‘,这样才对:

  1. // 查询
  2. public function select(string $where = '')
  3. {
  4. $where = empty($where) ? $where : 'WHERE' . $where;
  5. $sql = "SELECT * FROM `users` {$where}";
  6. $stmt = $this->pdo->prepare($sql);
  7. $stmt->execute();
  8. return $stmt->fetchAll(PDO::FETCH_ASSOC);
  9. }

慢慢改,最后解决了。为了辅助自己理解记忆整理了下他们的关系:

1、手写作业

2、MySQLi常见CURD操作

  • 新增操作
  1. <?php
  2. namespace chapter02;
  3. use mysqli;
  4. //一、新增操作
  5. //1.连接数据库
  6. $mysqli = new mysqli('localhost', 'root', 'root', 'phpedu');
  7. //2.执行SQL查询
  8. //准备sql语句
  9. $sql = 'INSERT `users` SET `name`=?, `email`=?, `password`=?, `register_time`=?;';
  10. //使用预处理方式防止sql注入攻击
  11. $stmt = $mysqli->stmt_init();
  12. //创建sql语句对象
  13. $stmt->prepare($sql);
  14. //绑定变量参数
  15. $user = ['admin', 'admin@php.cn', sha1('123456'), time()];
  16. list($name, $email, $password, $register_time) = $user;
  17. $stmt->bind_param('sssi', $name, $email, $password, $register_time);
  18. //执行
  19. $stmt->execute();
  20. //3.处理执行的结果
  21. if ($stmt->affected_rows === 1) :
  22. echo '添加成功,新记录的主键id:' . $stmt->insert_id;
  23. else :
  24. echo '添加失败' . $stmt->error;
  25. endif;
  26. //4.结束操作
  27. //关闭数据库连接
  28. $stmt->close();

  • 更新操作
  1. <?php
  2. namespace chapter02;
  3. use mysqli;
  4. //二、更新操作
  5. //1.连接数据库
  6. $mysqli = new mysqli('localhost', 'root', 'root', 'phpedu');
  7. //2.执行sql查询
  8. //准备sql语句
  9. $sql = 'UPDATE `users` SET `name`=?, `email`=? WHERE `id`=?;';
  10. //使用预处理方式防止sql注入攻击
  11. $stmt = $mysqli->stmt_init();
  12. //创建sql语句对象
  13. $stmt->prepare($sql);
  14. //绑定参数变量
  15. $user = ['jack', 'jack@php.cn', '8'];
  16. list($name, $email, $id) = $user;
  17. $stmt->bind_param('ssi', $name, $email, $id);
  18. //执行
  19. $stmt->execute();
  20. //3.处理执行的结果
  21. if ($stmt->affected_rows === 1 ) :
  22. echo '更新成功';
  23. else :
  24. echo '更新失败';
  25. endif;
  26. //4.结束操作
  27. //关闭数据库
  28. $stmt->close();

  • 删除操作
  1. <?php
  2. namespace chapter02;
  3. use mysqli;
  4. //三、删除操作
  5. //1.连接数据库
  6. $mysqli = new mysqli('localhost', 'root', 'root', 'phpedu');
  7. //2.执行sql查询
  8. //准备sql语句
  9. $sql = 'DELETE FROM `users` WHERE `id`=?;';
  10. //使用预处理方式防止sql注入攻击
  11. $stmt = $mysqli->stmt_init();
  12. //创建sql语句对象
  13. $stmt->prepare($sql);
  14. //绑定参数变量
  15. $id = '8';
  16. $stmt->bind_param('i', $id);
  17. //执行
  18. $stmt->execute();
  19. //3.处理执行结果
  20. if ($stmt->affected_rows === 1) :
  21. echo '删除成功';
  22. else :
  23. echo '删除失败';
  24. endif;
  25. //4.结束操作
  26. //关闭数据库连接
  27. $stmt->close();

  • 查询操作
  1. <?php
  2. namespace chapter02;
  3. use mysqli;
  4. //四、查询操作—使用STMT对象
  5. //1.连接数据库
  6. $mysqli = new mysqli('localhost', 'root', 'root', 'phpedu');
  7. //2.执行SQL查询
  8. //准备sql语句
  9. $sql = 'SELECT `id`,`name`,`email` FROM `users` WHERE `id`>?;';
  10. //使用预处理方式防止sql注入攻击
  11. $stmt = $mysqli->stmt_init();
  12. //创建sql语句对象
  13. $stmt->prepare($sql);
  14. //绑定变量参数
  15. $id = 3;
  16. $stmt->bind_param('i', $id);
  17. //执行
  18. $stmt->execute();
  19. //3.处理执行的结果
  20. //将结果集中的字段/列,绑定到指定的变量上
  21. $stmt->bind_result($id, $name, $email);
  22. //遍历结果集
  23. while ($stmt->fetch()) {
  24. echo "$id : $name ---> $email <br>";
  25. }
  26. //4.结束操作
  27. //释放结果集
  28. $stmt->free_result();
  29. //关闭数据库连接
  30. $stmt->close();

  1. <?php
  2. namespace chapter02;
  3. use mysqli;
  4. //四、查询操作—使用结果集对象
  5. //1.连接数据库
  6. $mysqli = new mysqli('localhost', 'root', 'root', 'phpedu');
  7. //2.执行SQL查询
  8. //准备sql语句
  9. $sql = 'SELECT `id`,`name`,`email` FROM `users` WHERE `id`>?;';
  10. //使用预处理方式防止sql注入攻击
  11. $stmt = $mysqli->stmt_init();
  12. //创建sql语句对象
  13. $stmt->prepare($sql);
  14. //绑定变量参数
  15. $id = 3;
  16. $stmt->bind_param('i', $id);
  17. //执行
  18. $stmt->execute();
  19. //获取到结果集对象
  20. $result = $stmt->get_result();
  21. //3.处理执行的结果
  22. //获取记录,返回关联数组
  23. while ($user = $result->fetch_assoc()) {
  24. echo "{$user['id']} : {$user['name']} ==> {$user['email']} <br>";
  25. }
  26. echo '<hr>';
  27. //数据表指针复位
  28. $result->data_seek(0);
  29. //一次性的获取所有数据
  30. $users = $result->fetch_all(MYSQLI_ASSOC);
  31. foreach ($users as $user) {
  32. echo "{$user['id']} : {$user['name']} ==> {$user['email']} <br>";
  33. }
  34. //4.结束操作
  35. //释放结果集
  36. $stmt->free_result();
  37. //关闭数据库连接
  38. $stmt->close();

3.接口实战

  • 3.1.定义接口
  1. <?php
  2. # 接口实战: 使用PDO/MySQLi实现数据库的多态操作
  3. namespace chapter2;
  4. // 配置数据库的连接参数: 接口常量
  5. interface iDbParam
  6. {
  7. const HOST = 'localhost';
  8. const TYPE = 'mysql';
  9. const DBNAME = 'phpedu';
  10. const USER_NAME = 'root';
  11. const PASSWORD = 'root';
  12. const CHARSET = 'utf8';
  13. const PORT = '3306';
  14. }
  15. // 接口构造方法
  16. interface iDbLink
  17. {
  18. // 接口中允许构造方法
  19. public function __construct(...$linkParams);
  20. }
  21. // 接口方法: 后面的代码就是用下面的这个主接口
  22. // 接口之间允许继承, 而且允许多重继承
  23. interface iCURD extends iDbLink, iDbParam
  24. {
  25. // 新增
  26. public function insert(array $data);
  27. // 查询
  28. public function select(string $where = '');
  29. // 更新
  30. public function update(array $data, string $where);
  31. // 删除
  32. public function delete(string $where);
  33. }
  • 3.2.PDO实现方法
  1. <?php
  2. namespace chapter2;
  3. // 用PDO来实现数据库操作
  4. use PDO;
  5. // 加载iCURD的接口声明
  6. require 'demo7.php';
  7. class Db_PDO implements iCURD
  8. {
  9. // 连接对象
  10. private $pdo = null;
  11. // 实现接口中的构造方法:连接数据库
  12. public function __construct(...$linkParams)
  13. {
  14. list($dsn, $username, $password) = $linkParams;
  15. $this->pdo = new PDO($dsn, $username, $password);
  16. }
  17. // 新增
  18. public function insert(array $data)
  19. {
  20. $sql = "INSERT `users` SET `name`=?, `email`=?,`password`=?,`register_time`=?";
  21. $stmt = $this->pdo->prepare($sql);
  22. $stmt->execute($data);
  23. return $stmt->rowCount() === 1 ? '新增成功' : '新增失败';
  24. }
  25. // 查询
  26. public function select(string $where = '')
  27. {
  28. $where = empty($where) ? $where : ' WHERE ' . $where;
  29. $sql = "SELECT * FROM `users` {$where}";
  30. $stmt = $this->pdo->prepare($sql);
  31. $stmt->execute();
  32. return $stmt->fetchAll(PDO::FETCH_ASSOC);
  33. }
  34. // 更新
  35. public function update(array $data, string $where)
  36. {
  37. // 设置更新参数
  38. $params = '';
  39. foreach ($data as $key => $value) {
  40. $params .= "`{$key}` = '{$value}', ";
  41. }
  42. // 将最后的", "去掉
  43. $params = rtrim($params, ', ');
  44. // 执行更新
  45. $sql = "UPDATE `users` SET {$params} WHERE {$where}";
  46. $stmt = $this->pdo->prepare($sql);
  47. $stmt->execute();
  48. return $stmt->rowCount() === 1 ? '更新成功' : '更新失败';
  49. }
  50. // 删除
  51. public function delete(string $where)
  52. {
  53. $sql = "DELETE FROM `users` WHERE {$where}";
  54. $stmt = $this->pdo->prepare($sql);
  55. $stmt->execute();
  56. return $stmt->rowCount() === 1 ? '删除成功' : '删除失败';
  57. }
  58. }
  • 3.3.MySQLi实现方法
  1. <?php
  2. namespace chapter2;
  3. // 用MySQLi来实现数据库操作
  4. use mysqli;
  5. // 加载iCURD的接口声明
  6. require 'demo7.php';
  7. class Db_MySQLi implements iCURD
  8. {
  9. // 连接对象
  10. private $mysqli = null;
  11. // 实现接口中的构造方法:连接数据库
  12. public function __construct(...$linkParams)
  13. {
  14. list($host, $username, $password, $dbname) = $linkParams;
  15. $this->mysqli = new mysqli($host, $username, $password, $dbname);
  16. // 设置默认字符集
  17. $this->mysqli -> set_charset('utf8');
  18. }
  19. // 新增
  20. public function insert(array $data)
  21. {
  22. $sql = "INSERT `users` SET `name`=?, `email`=?,`password`=?,`register_time`=?";
  23. $stmt = $this->mysqli->prepare($sql);
  24. $stmt->bind_param('sssi', $name, $email, $password, $register_time);
  25. list($name, $email, $password, $register_time) = $data;
  26. $stmt->execute();
  27. return $stmt->affected_rows === 1 ? '新增成功' : '新增失败';
  28. }
  29. // 查询
  30. public function select(string $where = '')
  31. {
  32. $where = empty($where) ? $where : ' WHERE ' . $where;
  33. $sql = "SELECT * FROM `users` {$where}";
  34. $stmt = $this->mysqli->prepare($sql);
  35. $stmt->execute();
  36. return $stmt->get_result();
  37. }
  38. // 更新
  39. public function update(array $data, string $where)
  40. {
  41. // 设置更新参数
  42. $params = '';
  43. foreach ($data as $key => $value) {
  44. $params .= "`{$key}` = '{$value}', ";
  45. }
  46. // 将最后的", "去掉
  47. $params = rtrim($params, ', ');
  48. // 执行更新
  49. $sql = "UPDATE `users` SET {$params} WHERE {$where}";
  50. $stmt = $this->mysqli->prepare($sql);
  51. $stmt->execute();
  52. return $stmt->affected_rows === 1 ? '更新成功' : '更新失败';
  53. }
  54. // 删除
  55. public function delete(string $where)
  56. {
  57. $sql = "DELETE FROM `users` WHERE {$where}";
  58. $stmt = $this->mysqli->prepare($sql);
  59. $stmt->execute();
  60. return $stmt->affected_rows === 1 ? '删除成功' : '删除失败';
  61. }
  62. }
  • 3.4.通用类DB
  1. <?php
  2. namespace chapter2;
  3. // 通用类: 数据库操作,面向接口实现多态, 动态的支持PDO, MySQLi
  4. use chapter2\iCURD;
  5. class DB
  6. {
  7. // 新增
  8. public static function insert(iCURD $db, array $data)
  9. {
  10. return $db->insert($data);
  11. }
  12. // 查询
  13. public static function select(iCURD $db, string $where = '')
  14. {
  15. return $db->select($where);
  16. }
  17. // 更新
  18. public static function update(iCURD $db, array $data, string $where= '')
  19. {
  20. return $db->update($data, $where);
  21. }
  22. // 删除
  23. public static function delete(iCURD $db, string $where= '')
  24. {
  25. return $db->delete($where);
  26. }
  27. }
  • 3.5.PDO实现数据库操作
  1. <?php
  2. namespace chapter02;
  3. //使用PDO来操作数据库:接口实现
  4. // 加载PDO操作类: Db_PDO
  5. require 'demo8.php';
  6. //加载数据库的通用类
  7. require 'demo10.php';
  8. //先创建DSN
  9. $dsn = iDbParam::TYPE . ':host=' . iDbParam::HOST . ';dbname=' . iDbParam::DBNAME . ';charset=' . iDbParam::CAHRSET;
  10. $link = new Db_PDO($dsn, iDbParam::USER_NAME, iDbParam::PASSWORD);
  11. //var_dump($link);
  12. //var_dump($dsn);
  13. //测试新增操作
  14. echo DB::insert($link, ['欧阳峰', 'rose@php.cn', sha1('123456'), time()]);
  15. echo '<hr>';
  16. //
  17. //测试查询
  18. foreach (DB::select($link,'id > 2') as $user) {
  19. echo "{$user['id']} -- {$user['name']} -- {$user['email']} <br>";
  20. }
  21. echo '<hr>';
  22. //测试更新
  23. echo DB::update($link, ['id'=>'9', 'email'=>'ouyang@php.cn'], 'id=26');
  24. echo '<hr>';
  25. //测试删除
  26. echo DB::delete($link, 'id=8');

  • 3.6.MySQLi实现数据库操作
  1. <?php
  2. namespace chapter02;
  3. //使用MySQLi来操作数据库:接口实现
  4. // 加载MySQLi操作类: Db_MySQLi
  5. require 'demo9.php';
  6. //加载数据库的通用类
  7. require 'demo10.php';
  8. //连接实例
  9. $link = new Db_MySQLi(iDbParam::HOST, iDbParam::USER_NAME, iDbParam::PASSWORD, iDbParam::DBNAME);
  10. //var_dump($link);
  11. //var_dump($dsn);
  12. //测试新增操作
  13. echo DB::insert($link, ['丘处机', 'rose@php.cn', sha1('123456'), time()]);
  14. echo '<hr>';
  15. //测试查询
  16. foreach (DB::select($link,'id > 3') as $user) {
  17. echo "{$user['id']} -- {$user['name']} -- {$user['email']} <br>";
  18. }
  19. echo '<hr>';
  20. ////测试更新
  21. echo DB::update($link, ['name'=>'郭芙蓉', 'email'=>'guofurong@php.cn'], 'id=3');
  22. //echo DB::update($link, ['id'=>'8'], 'id=9');
  23. echo '<hr>';
  24. //测试删除
  25. echo DB::delete($link, 'id=2');

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议