博客列表 >0211 MySQLi操作数据库与多态

0211 MySQLi操作数据库与多态

曾
原创
2020年02月22日 18:59:26968浏览

MySQLi基本操作

一.MySQLi是什么
-MySQLi是PHP内置的操作MySQL数据库的扩展,默认为开启。
-MySQLi提供了面向过程和面向对象的两种方式操作数据库
二.MySQLi操作数据库的基本步骤
-连接数据库
创建一个MySQLi类实例,需要传入(主机名,用户名,密码,数据库名),设置字符集
-操作数据库
-1.新增

  1. <?php
  2. //新增操作
  3. namespace MYSQLi;
  4. use mysqli;
  5. // 1连接数据库
  6. // MYSQLI连接数据库需要主机,用户名,密码,数据库名
  7. $mysqli = new mysqli('localhost','root','root','phpedu');
  8. // 创建SQL语句 ,每个字段需要用逗号隔开 ?为占位符
  9. $sql = 'INSERT `test` SET `name`=?,`age`=?, `email`=?;';
  10. // 使用预处理方式,防止SQL注入
  11. $stmt = $mysqli->stmt_init();
  12. // 创建SQL语句对象
  13. $stmt = $mysqli->prepare($sql);
  14. // 创建数据数组,然后使用使用bind_param与占位符进行绑定
  15. $user = ['马超',22,'machao@php.cn'];
  16. list($name,$age,$email) = $user;
  17. $stmt->bind_param('sis',$name,$age,$email);
  18. // 执行SQL语句
  19. $stmt->execute();
  20. echo $stmt->affected_rows ===1 ? '新增成功' : '新增失败';
  21. //关闭数据库
  22. $stmt->close();

-2.更新
例:步骤类似,稍微改下SQL语句就能用了

  1. <?php
  2. //更新操作
  3. namespace MYSQLi;
  4. use mysqli;
  5. // 1连接数据库
  6. // MYSQLI连接数据库需要主机,用户名,密码,数据库名
  7. $mysqli = new mysqli('localhost','root','root','phpedu');
  8. // 创建SQL语句,修改邮箱,如果需要更新多个字段,每个字段需要用逗号隔开 ?为占位符
  9. $sql = 'UPDATE `test` SET `email`=? WHERE `name`=?;';
  10. $stmt = $mysqli->stmt_init();
  11. // 创建SQL语句对象
  12. $stmt ->prepare($sql);
  13. // 创建数据数组,然后使用使用bind_param与占位符进行绑定
  14. $user = ['machao@admin.cn','马超'];
  15. list($email,$name) = $user;
  16. $stmt->bind_param('ss',$email,$name);
  17. // 执行SQL语句
  18. $stmt->execute();
  19. echo $stmt->affected_rows ===1 ? '更新成功' : '更新失败';
  20. //关闭数据库
  21. $stmt->close();

-3.删除

  1. <?php
  2. //删除操作
  3. namespace MYSQLi;
  4. use mysqli;
  5. // 1连接数据库
  6. // MYSQLI连接数据库需要主机,用户名,密码,数据库名
  7. $mysqli = new mysqli('localhost','root','root','phpedu');
  8. // 创建SQL语句 ?为占位符
  9. $sql = 'DELETE FROM `test` WHERE `name`=?;';
  10. $stmt = $mysqli->stmt_init();
  11. // 创建SQL语句对象
  12. $stmt ->prepare($sql);
  13. // 创建数据,然后使用使用bind_param与占位符进行绑定
  14. $name = '马超';
  15. $stmt->bind_param('s',$name);
  16. // 执行SQL语句
  17. $stmt->execute();
  18. echo $stmt->affected_rows ===1 ? '删除成功' : '删除失败';
  19. //关闭数据库
  20. $stmt->close();

-4.查询

  1. <?php
  2. //查询操作(使用结果集查看)
  3. namespace MYSQLi;
  4. use mysqli;
  5. // 1连接数据库
  6. // MYSQLI连接数据库需要主机,用户名,密码,数据库名
  7. $mysqli = new mysqli('localhost','root','root','phpedu');
  8. // 创建SQL语句 如果需要更新多个字段,每个字段需要用逗号隔开 ?为占位符
  9. $sql = 'SELECT * FROM `test` WHERE `id`>?;';
  10. // 使用预处理方式,防止SQL注入
  11. $stmt = $mysqli->stmt_init();
  12. // 创建SQL语句对象
  13. $stmt ->prepare($sql);
  14. // 创建数据数组,然后使用使用bind_param与占位符进行绑定
  15. $id = 3;
  16. $stmt->bind_param('i',$id);
  17. // 执行SQL语句
  18. $stmt->execute();
  19. // 处理结果,获取结果集
  20. $result = $stmt->get_result();
  21. // 一条一条查看,fetch_assoc:显示结果中的关联部分(常用)
  22. // $user = $result->fetch_assoc();
  23. // 使用while循环 遍历出所有结果
  24. // while($user = $result->fetch_assoc()){
  25. // echo "id={$user['id']}:name={$user['name']}:age={$user['age']}:email={$user['email']}<br>";
  26. // }
  27. //一次查询所有满足条件的结果
  28. $users = $result->fetch_all(MYSQLI_ASSOC);
  29. // print_r($users);
  30. //使用foreach 遍历出所有结果
  31. foreach($users as $user){
  32. echo "id={$user['id']}:name={$user['name']}:age={$user['age']}:email={$user['email']}<br>";
  33. }
  34. // 释放结果集
  35. $stmt->free_result();
  36. //关闭数据库
  37. $stmt->close();

-最后就是关闭数据库 close()

接口与多态实例练习

1.先创建接口文件

  1. <?php
  2. namespace DETAIL;
  3. //创建一个接口,里面都是数据库连接常量
  4. interface iParam
  5. {
  6. const MYSQL='mysql';
  7. const HOST='localhost';
  8. const USERNAME='root';
  9. const PASSWORD='root';
  10. const DBNAME='phpedu';
  11. }
  12. // 创建一个接口,表示需要使用构造方法
  13. interface iDBlink
  14. {
  15. public function __construct(array $link);
  16. }
  17. //创建一个接口,表示数据的操作
  18. interface iCURD extends iDBlink,iParam
  19. {
  20. //新增操作
  21. public function insert(array $data);
  22. // 更新操作
  23. public function update(array $data,string $where);
  24. //查询操作
  25. public function select(string $where='');
  26. //删除操作
  27. public function delete(string $where);
  28. //关闭操作
  29. public function close();
  30. }

2.根据接口规范,创建PDO与MYSQLI两个文件来实现接口

PDO

  1. <?php
  2. namespace DETAIL;
  3. //导入PDO
  4. use PDO;
  5. class DB_PDO implements iCURD
  6. {
  7. private $pdo;
  8. //实现接口的构造方法,需要传入一个数组参数,数组里面包括(PDO数据源,数据库用户名,密码)
  9. public function __construct(array $links)
  10. {
  11. list($dsn, $username, $password) = $links;
  12. $this->pdo = new pdo($dsn, $username, $password);
  13. }
  14. //实现接口的新增方法,需要传入一个数组参数,数组里面包括(姓名,年龄,邮箱)例('张三',20,'zhangsan@php.cn')
  15. public function insert(array $data)
  16. {
  17. $sql = 'INSERT `test` SET `name`=?,`age`=?,`email`=?';
  18. $stmt = $this->pdo->prepare($sql);
  19. $stmt->execute($data);
  20. return $stmt->rowCount() === 1 ? '新增成功' : '新增失败';
  21. }
  22. // 实现接口更新操作,需要传入一个更新参数数组
  23. // 再传入一个条件参数必须为字符串(传递进来的字符串必须与SQL命令语句符合)例("`name`='张三'")
  24. public function update(array $data, string $where = '')
  25. {
  26. //因为更新参数都为字符串,要先创建一个空变量
  27. $params = '';
  28. //遍历传递进来的更新参数数组,并把键名与键值输出,拼接赋值给$params
  29. foreach ($data as $key => $value) {
  30. $params .= "`{$key}`='{$value}',";
  31. }
  32. //去掉最右边的逗号
  33. $params = rtrim($params, ',');
  34. $sql = "UPDATE `test` SET {$params} WHERE {$where}";
  35. $stmt = $this->pdo->prepare($sql);
  36. $stmt->execute();
  37. return $stmt->rowCount() === 1 ? '更新成功' : '更新失败';
  38. }
  39. //实现接口查询操作
  40. //传入一个条件参数必须为字符串(传递进来的字符串必须与SQL命令语句符合)例("`name`='张三'")
  41. public function select(string $where = '')
  42. {
  43. //查询的时候条件可以为空,所以要判断$where时候为空,如果为空就查询整张数据表
  44. //如果不为空,就把后面拼接的赋值给$where组成完整的SQL语句
  45. $where = empty($where) ? $where : ' WHERE ' . $where;
  46. $sql = "SELECT * FROM `test` {$where}";
  47. $stmt = $this->pdo->prepare($sql);
  48. $stmt->execute();
  49. return $stmt->fetchall(PDO::FETCH_ASSOC);
  50. }
  51. //实现接口删除操作
  52. public function delete(string $where)
  53. {
  54. $sql = "DELETE FROM `test` WHERE {$where}";
  55. $stmt = $this->pdo->prepare($sql);
  56. $stmt->execute();
  57. return $stmt->rowCount() === 1 ? '删除成功' : '删除失败';
  58. }
  59. //关闭数据库
  60. public function close()
  61. {
  62. return $this->pdo = null;
  63. }
  64. }

MYSQLI

  1. <?php
  2. namespace DETAIL;
  3. use MYSQLi;
  4. class DB_MYSQLI implements iCURD
  5. {
  6. private $mysqli;
  7. //连接数据库
  8. //实现接口的构造方法,需要传入一个数组参数,数组里面包括(数据库主机名,数据库用户名,密码,数据库名)
  9. public function __construct(array $links)
  10. {
  11. list($host, $username, $password, $dbname) = $links;
  12. $this->mysqli = new MYSQLI($host, $username, $password, $dbname);
  13. //设置默认字符集,防止有乱码出现
  14. $this->mysqli->set_charset('uft8');
  15. }
  16. //实现接口的新增方法,需要传入一个数组参数,数组里面包括(姓名,年龄,邮箱)例('张三',20,'zhangsan@php.cn')
  17. public function insert(array $data)
  18. {
  19. //创建SQL语句
  20. $sql = 'INSERT `test` SET `name`=?,`age`=?,`email`=?';
  21. $stmt = $this->mysqli->prepare($sql);
  22. list($name, $age, $email) = $data;
  23. $stmt->bind_param('sis', $name, $age, $email);
  24. $stmt->execute();
  25. return $stmt->affected_rows === 1 ? '新增成功' : '新增失败';
  26. }
  27. // 实现接口更新操作,需要传入一个更新参数数组
  28. // 再传入一个条件参数必须为字符串(传递进来的字符串必须与SQL命令语句符合)例("`name`='张三'")
  29. public function update(array $data, string $where)
  30. {
  31. //创建SQL语句
  32. //因为更新参数都为字符串,要先创建一个空变量
  33. $params = '';
  34. //遍历传递进来的更新参数数组,并把键名与键值输出,拼接赋值给$params
  35. foreach ($data as $key => $value) {
  36. $params .= "`{$key}`='{$value}',";
  37. }
  38. $params = rtrim($params, ',');
  39. $sql = "UPDATE `test` SET {$params} WHERE {$where}";
  40. $stmt = $this->mysqli->prepare($sql);
  41. $stmt->execute();
  42. return $stmt->affected_rows === 1 ? '更新成功' : '更新失败';
  43. }
  44. //实现接口查询操作
  45. //传入一个条件参数必须为字符串(传递进来的字符串必须与SQL命令语句符合)例("`name`='张三'")
  46. public function select(string $where = '')
  47. {
  48. //查询的时候条件可以为空,所以要判断$where时候为空,如果为空就查询整张数据表
  49. //如果不为空,就把后面拼接的赋值给$where组成完整的SQL语句
  50. $where = empty($where) ? $where : ' WHERE ' . $where;
  51. $sql = "SELECT * FROM `test` WHERE {$where}";
  52. $stmt = $this->mysqli->prepare($sql);
  53. $stmt->execute();
  54. $result = $stmt->get_result();
  55. return $result->fetch_all(MYSQLI_ASSOC);
  56. }
  57. //删除操作
  58. public function delete(string $where)
  59. {
  60. $sql = "DELETE FROM `test` WHERE {$where}";
  61. $stmt = $this->mysqli->prepare($sql);
  62. $stmt->execute();
  63. return $stmt->affected_rows === 1 ? '删除成功' : '删除失败';
  64. }
  65. //关闭数据库
  66. public function close()
  67. {
  68. return $this->mysqli->close();
  69. }
  70. }

最后创建一个通用类文件

  1. <?php
  2. namespace DETAIL;
  3. //创建数据操作通用类
  4. class DB
  5. {
  6. //通用操作,$db为操作语言(传入$DB_PDO实例就是PDO,传入$DB_MYSQLI实例就是mysqli语言)
  7. public function insert(iCURD $db,array $data)
  8. {
  9. return $db->insert($data);
  10. }
  11. public function update(iCURD $db,array $data,string $where)
  12. {
  13. return $db->update($data,$where);
  14. }
  15. public function select(iCURD $db,string $where='')
  16. {
  17. return $db->select($where);
  18. }
  19. public function delete(iCURD $db,string $where)
  20. {
  21. return $db->delete($where);
  22. }
  23. public function close(iCURD $db)
  24. {
  25. return $db->close();
  26. }
  27. }

最后调用

  1. <?php
  2. namespace DETAIL;
  3. //导入接口文件
  4. require 'demo4.php';
  5. //导入MYSQLI类,接口实现方法
  6. require 'demo6.php';
  7. //导入数据库查询通用类
  8. require 'demo7.php';
  9. //创建MYSQLI数据源
  10. $links = [iParam::HOST,iParam::USERNAME,iParam::PASSWORD,iParam::DBNAME];
  11. //实例化MYSQLI
  12. $db_mysqli = new DB_MYSQLI($links);
  13. //实例化通用类
  14. $db =new db;
  15. //新增测试
  16. // echo $db->insert($db_mysqli,['孙权',28,'sunquan@php.cn']);
  17. //更新测试
  18. // echo $db->update($db_mysqli,['age'=>38],'id=25');
  19. //查询测试
  20. // echo '<pre>'.print_r($db->select($db_mysqli,'`id`>2'),true).'</pre>';
  21. //删除测试
  22. // echo $db->delete($db_mysqli,"`name`='孙权'");
  23. //关闭数据库
  24. echo $db->close($db_mysqli);

笔记1

笔记2

实战练习的时候,感觉错误还是很多(主要写少了),都是写完整了一个方法就测试,有问题马上修改,就是怕如果全部写完了在测试会找不到错误在哪里!一边写一边改,不太会查找BUG,很多时候都是一行一行的自己慢慢找。输入法错误也有,有时候明明看上去正确的代码,就因为输入法变成全角了而错误
然后注释是个好东西,建议和我一样初学的,一定要习惯写注释,帮助学习有好处

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