Blogger Information
Blog 30
fans 0
comment 1
visits 24059
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
0211 MySQLi操作数据库与多态
Original
969 people have browsed it

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,很多时候都是一行一行的自己慢慢找。输入法错误也有,有时候明明看上去正确的代码,就因为输入法变成全角了而错误
然后注释是个好东西,建议和我一样初学的,一定要习惯写注释,帮助学习有好处

Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:namespace MYSQLi; 命名空间不要使用这样的关键字, 有可能出现一些难以察觉的错误, 下次注意
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post