PHP8.1.21版本已发布
vue8.1.21版本已发布
jquery8.1.21版本已发布

博客列表 > 0211作业-mysqli基础和接口实战-php培训十期线上班

0211作业-mysqli基础和接口实战-php培训十期线上班

Dseven
Dseven 原创
2020年02月13日 00:50:17 717浏览

0211作业-mysqli基础和接口实战-php培训十期线上班

1. mysqli常见的CURD(增删改查)操作

1.1 用mysqli_stmt类面对对象风格插入数据

  1. //准备需要插入的数据
  2. $arr = [
  3. ['杨过','yangguo@php.cn',sha1('123456'),time()],
  4. ['段誉','duanyu@php.cn',sha1('123456'),time()],
  5. ['虚竹','xuzhu@php.cn',sha1('123456'),time()],
  6. ['乔峰','qiaofeng@php.cn',sha1('123456'),time()],
  7. ];
  8. //第一步实例化mysql对象
  9. $db = new mysqli('localhost','root1','root123','test');
  10. //第二步调用mysqli中的stmt_init方法,得到预处理对象
  11. $stmt = $db->stmt_init();
  12. //准备增加数据库记录的SQL语句
  13. $sql = 'INSERT `new_user` SET `name`=?, `email`=?, `password`=?, `regs_time`=?';
  14. //调用预处理对象中的prepare()方法对SQL语句进行预处理
  15. $stmt->prepare($sql);
  16. //因为SQL语句中使用了占位符,需要进行参数绑定,这里参数类型中标明的参数个数与后面变量的数量必须一致
  17. $stmt->bind_param('sssi',$name,$email,$password,$time);
  18. //调用预处理对象中的execute方法执行SQL语句
  19. foreach($arr as $value):
  20. //将变量和数组里的值一一绑定
  21. list($name,$email,$password,$time)=$value;
  22. $stmt->execute();
  23. if($stmt->affected_rows === 1)
  24. $i += $stmt->affected_rows;
  25. else
  26. echo $stmt->error;
  27. endforeach;
  28. //输出收影响的记录数
  29. echo '增加了'.$i.'条记录'.'<br>';
  30. //输出最后一条记录的主键ID
  31. echo '最后一条记录的主键ID是:'.$stmt->insert_id;
  32. //关闭预处理对象
  33. $stmt->close();

1.2 用mysqli_stmt类面对对象风格查询数据(用结果集类)

  1. //通过mysqli_stmt的方式查询
  2. //第一步实例化mysql对象
  3. $db = new mysqli('localhost', 'root1', 'root123', 'test');
  4. //第二步调用mysqli中的stmt_init方法,得到预处理对象
  5. $stmt = $db->stmt_init();
  6. //准备增加数据库记录的SQL语句
  7. $sql = 'SELECT `id`,`name`,`email` FROM `new_user` WHERE `id`>?;';
  8. //调用预处理对象中的prepare()方法对SQL语句进行预处理
  9. $stmt->prepare($sql);
  10. //因为SQL语句中使用了占位符,需要进行参数绑定
  11. $stmt->bind_param('i',$id);
  12. $id = 2;
  13. //需要先执行SQL语句,再得到结果集对象
  14. //执行SQL语句
  15. $stmt->execute();
  16. //得到一个结果集对象,
  17. $result = $stmt->get_result();
  18. //从结果集中单条输出,输出一次指针下移一位
  19. //$result->fetch_array();//返回一条数据,是既有索引又有关联的数组
  20. //$result->fetch_row();//返回一条数据,是索引数组
  21. //$result->fetch_assoc();//返回一条数据,是关联数组
  22. while($user=$result->fetch_assoc()){
  23. echo "{$user['id']}|{$user['name']}===>{$user['email']}<br>";
  24. }
  25. //将指针归零
  26. $result->data_seek(0);
  27. //返回所有数据,是索引数组
  28. //$result->fetch_all();
  29. //返回所有数据,是关联数组
  30. //$result->fetch_all(MYSQLI_ASSOC);
  31. $users = $result->fetch_all(MYSQLI_ASSOC);
  32. foreach($users as $user){
  33. echo "{$user['id']}|{$user['name']}===>{$user['email']}<br>";
  34. }
  35. //释放结果集对象,这里是用结果集对象$result
  36. $result->free_result();
  37. //关闭预处理对象
  38. $stmt->close();

1.3 用mysqli_stmt类面对对象风格更新数据

  1. //准备需要更新的数据
  2. $arr = [
  3. ['杨过', 'yangguo@sina.com', sha1('12345678')],
  4. ['虚竹', 'xuzhu@gmail.com', sha1('12345678')],
  5. ];
  6. //第一步实例化mysql对象
  7. $db = new mysqli('localhost', 'root1', 'root123', 'test');
  8. //第二步调用mysqli中的stmt_init方法,得到预处理对象
  9. $stmt = $db->stmt_init();
  10. //准备增加数据库记录的SQL语句
  11. $sql = 'UPDATE `new_user` SET `email`=?,`password`=? WHERE `name`=?;';
  12. //调用预处理对象中的prepare()方法对SQL语句进行预处理
  13. $stmt->prepare($sql);
  14. //因为SQL语句中使用了占位符,需要进行参数绑定
  15. $stmt->bind_param('sss', $email, $password, $name);
  16. //将变量和数组里的值一一绑定
  17. foreach ($arr as $value):
  18. //将变量和数组里的值一一绑定
  19. list($name, $email, $password,) = $value;
  20. $stmt->execute();
  21. if ($stmt->affected_rows === 1)
  22. echo '更新成功';
  23. else
  24. echo '更新失败';
  25. endforeach;
  26. //关闭预处理对象
  27. $stmt->close();

1.4 用mysqli_stmt类面对对象风格删除数据

  1. //第一步实例化mysql对象
  2. $db = new mysqli('localhost', 'root1', 'root123', 'test');
  3. //第二步调用mysqli中的stmt_init方法,得到预处理对象
  4. $stmt = $db->stmt_init();
  5. //准备增加数据库记录的SQL语句
  6. $sql = 'DELETE FROM `new_user` WHERE `id`=?;';
  7. //调用预处理对象中的prepare()方法对SQL语句进行预处理
  8. $stmt->prepare($sql);
  9. //因为SQL语句中使用了占位符,需要进行参数绑定
  10. $stmt->bind_param('i', $id);
  11. for($i=10;$i<29;$i++){
  12. $id = $i;
  13. $stmt->execute();
  14. }
  15. if ($stmt->affected_rows === 1)
  16. echo '删除成功';
  17. else
  18. echo '删除失败'.$stmt->error;
  19. //关闭预处理对象
  20. $stmt->close();

2.接口实战项目

  • 接口实战项目要求:通过接口的方式,来将PDO和MySqli两种数据库操作进行封装,使用户不用关注具体的实现方法。

2.1 项目步骤

  • 定义接口:定义常量接口、连接对象接口、增删改查接口,其中增删改查接口继承自常量定义接口和连接对象接口。
  • 实现接口:一是用PDO的方式来实现增删改查接口;二是用MySqli的方式实现增删改查接口。
  • 基于接口的通用类:用基于接口的方式,定义一个通用类,实现具体增删改查方式的隔离或封装。
  • 演示验证:用不同方式验证增删改查的操作是否正常。

    2.2 定义接口

    1. //定义数据库操作接口
    2. namespace part1;
    3. //定义参数接口
    4. interface iDbPaparms{
    5. const HOST = 'localhost';
    6. const TYPE = 'mysql';
    7. const USER_NAME = 'root1';
    8. const PASSWORD = 'root123';
    9. const CHARSET = 'utf8';
    10. const DBNAME = 'test';
    11. }
    12. //定义初始化接口
    13. interface iDbLink{
    14. public function __construct(...$linkPaparm);
    15. }
    16. //定义数据库常用操作增删改查接口
    17. interface iCURD extends iDbPaparms,iDbLink {
    18. //新增
    19. public function insert(array $data):string;
    20. //查询
    21. public function select(string $where=null);
    22. //更新
    23. public function update(array $data,string $where=null):string;
    24. //删除
    25. public function delete(string $where=null):string;
    26. }

    2.3 PDO方式实现CURD

    1. //用PDO的方式实现数据库操作接口
    2. namespace part1;
    3. require 'demo1.php';
    4. //导入PDO
    5. use PDO;
    6. class Db_PDO implements iCURD{
    7. //定义一个私有对象
    8. private $pdo=null;
    9. //实现构造方法
    10. public function __construct(...$linkPaparm)
    11. {
    12. list($dsn,$username,$password)=$linkPaparm;//曾经出错的地方,默写时忘记了
    13. $this->pdo = new PDO($dsn,$username,$password);//曾经出错的地方,没有用this,导致对象为空
    14. }
    15. //实现新增方法
    16. public function insert(array $data): string
    17. {
    18. // TODO: Implement insert() method.
    19. //准备sql语句
    20. $sql = "INSERT `new_user` SET `name`=?,`email`=?,`password`=?,`regs_time`=?";
    21. //调用prepare方法得到PDOStatement预处理对象
    22. $stmt = $this->pdo->prepare($sql);
    23. //调用PDOStatement的execute方法执行SQL语句
    24. $stmt->execute($data);
    25. //判断新增结果
    26. return $stmt->rowCount()===1 ? '新增成功':'新增失败';
    27. }
    28. //实现查询方法
    29. public function select(string $where = null)
    30. {
    31. // TODO: Implement select() method.
    32. //准备sql语句
    33. $where = empty($where) ? $where : ' WHERE '.$where;
    34. $sql = "SELECT * FROM `new_user` {$where};";
    35. echo $sql;
    36. //调用prepare方法得到PDOStatement预处理对象
    37. $stmt = $this->pdo->prepare($sql);
    38. //调用PDOStatement的execute方法执行SQL语句,得到结果集对象
    39. $stmt->execute();
    40. return $stmt->fetchAll(PDO::FETCH_ASSOC);
    41. }
    42. //实现更新方法
    43. public function update(array $data, string $where = null): string
    44. {
    45. // TODO: Implement updata() method.
    46. //将$data转换成字符串
    47. $paparm = '';
    48. foreach($data as $key=>$value){
    49. $paparm .= "`{$key}`='{$value}',";
    50. }
    51. $paparm = rtrim($paparm,',');
    52. //准备sql字符串
    53. $sql = "UPDATE `new_user` SET {$paparm} WHERE {$where};";
    54. //调用prepare方法得到PDOStatement预处理对象
    55. $stmt = $this->pdo->prepare($sql);
    56. //调用PDOStatement的execute方法执行SQL语句
    57. $stmt->execute();
    58. //判断更新结果
    59. return $stmt->rowCount()>=1 ? '更新成功':'更新失败';
    60. }
    61. //实现删除方法
    62. public function delete(string $where = null): string
    63. {
    64. // TODO: Implement delete() method.
    65. //准备sql语句
    66. $sql = "DELETE FROM `new_user` WHERE {$where}";
    67. //调用prepare方法得到PDOStatement预处理对象
    68. $stmt = $this->pdo->prepare($sql);
    69. //调用PDOStatement的execute方法执行SQL语句
    70. $stmt->execute();
    71. //判断删除结果
    72. return $stmt->rowCount()>=1 ? '删除成功':'删除失败';
    73. }
    74. }

    2.4 MySqli方式实现CURD

    1. //用mysqli的方式实现数据库操作接口
    2. namespace part1;
    3. //加载接口声明
    4. require 'demo1.php';
    5. //导入mysqli
    6. use mysqli;
    7. class Db_Mysqli implements iCURD{
    8. //定义一个私有对象
    9. private $mysqli=null;
    10. //实现构造方法
    11. public function __construct(...$linkPaparm)
    12. {
    13. list($host,$username,$password,$dbname)=$linkPaparm;//曾经出错的地方,默写时忘记了
    14. $this->mysqli = new mysqli($host,$username,$password,$dbname);//曾经出错的地方,没有用this,导致对象为空
    15. // 设置默认字符集
    16. $this->mysqli -> set_charset('utf8');
    17. }
    18. //实现新增方法
    19. public function insert(array $data): string
    20. {
    21. // TODO: Implement insert() method.
    22. //准备sql语句
    23. $sql = "INSERT `new_user` SET `name`=?,`email`=?,`password`=?,`regs_time`=?";
    24. //调用mysqli类的stmt_init方法得到mysqli_stmt类预处理对象实例
    25. //如果用了stmt_init(),任何其后调用的mysqli_stmt函数都会失败,直到mysqli_stmt_prepare()被调用.
    26. $stmt = $this->mysqli->stmt_init();
    27. //调用mysqli_stmt类的prepare预处理SQL语句
    28. $stmt->prepare($sql);
    29. //调用mysqli_stmt类的bind_Paparm绑定参数,这个只能在prepare之后
    30. $stmt->bind_param('ssss',$name,$email,$password,$regs_time);
    31. list($name,$email,$password,$regs_time)=$data;
    32. //调用mysqli_stmt类的execute方法执行SQL语句
    33. $stmt->execute();
    34. //判断新增结果
    35. return $stmt->affected_rows===1 ? '新增成功':'新增失败';
    36. }
    37. //实现查询方法
    38. public function select(string $where = null)
    39. {
    40. // TODO: Implement select() method.
    41. //准备sql语句
    42. $where = empty($where) ? $where : ' WHERE '.$where;
    43. $sql = "SELECT * FROM `new_user` {$where};";
    44. //调用mysqli类的stmt_init方法得到mysqli_stmt类预处理对象实例
    45. $stmt = $this->mysqli->stmt_init();
    46. //调用mysqli_stmt类的prepare预处理SQL语句
    47. $stmt->prepare($sql);
    48. //上面两条语句可以合并成下面一条,因为prepare返回的就是mysqli_stmt类的对象实例
    49. //$stmt = $this->mysqli->prepare($sql);
    50. //调用PDOStatement的execute方法执行SQL语句,得到结果集对象
    51. $stmt->execute();
    52. //获得结果集对象,以便用stmt_result类来获取查询结果
    53. $result = $stmt->get_result();
    54. //调用stmt_result的fetch_all方法设置MYSQLI_ASSOC获得关联数组
    55. $datas = $result->fetch_all(MYSQLI_ASSOC);
    56. //释放结果集对象
    57. $result->free_result();
    58. //释放预处理对象
    59. $stmt->close();
    60. return $datas;
    61. }
    62. //实现更新方法
    63. public function update(array $data, string $where = null): string
    64. {
    65. // TODO: Implement updata() method.
    66. //将$data转换成字符串
    67. $paparm = '';
    68. foreach($data as $key=>$value){
    69. $paparm .= "`{$key}`='{$value}',";
    70. }
    71. $paparm = rtrim($paparm,',');
    72. //准备sql字符串
    73. $sql = "UPDATE `new_user` SET {$paparm} WHERE {$where};";
    74. //调用mysqli类的stmt_init方法得到mysqli_stmt类预处理对象实例
    75. $stmt = $this->mysqli->stmt_init();
    76. //调用mysqli_stmt类的prepare预处理SQL语句
    77. $stmt->prepare($sql);
    78. //调用PDOStatement的execute方法执行SQL语句,得到结果集对象
    79. $stmt->execute();
    80. //判断更新结果
    81. return $stmt->affected_rows>=1 ? '更新成功':'更新失败';
    82. }
    83. //实现删除方法
    84. public function delete(string $where = null): string
    85. {
    86. // TODO: Implement delete() method.
    87. //准备sql语句
    88. $sql = "DELETE FROM `new_user` WHERE {$where}";
    89. //调用mysqli类的stmt_init方法得到mysqli_stmt类预处理对象实例
    90. $stmt = $this->mysqli->stmt_init();
    91. //调用mysqli_stmt类的prepare预处理SQL语句
    92. $stmt->prepare($sql);
    93. //调用PDOStatement的execute方法执行SQL语句,得到结果集对象
    94. $stmt->execute();
    95. //判断删除结果
    96. return $stmt->affected_rows>=1 ? '删除成功':'删除失败';
    97. }
    98. }

    2.5 通用类

    1. //设立通用调用接口类
    2. namespace part1;
    3. use part1\iCURD;
    4. class Db{
    5. //新增
    6. public static function insert(iCURD $db,array $data):string{
    7. return $db->insert($data);
    8. }
    9. //查询
    10. public static function select(iCURD $db,string $where=null){
    11. return $db->select($where);
    12. }
    13. //更新
    14. public static function updata(iCURD $db,array $data,string $where=null):string{
    15. return $db->update($data,$where);
    16. }
    17. //删除
    18. public static function delete(iCURD $db,string $where=null):string{
    19. return $db->delete($where);
    20. }
    21. }

    2.6 代码验证

    1. namespace part2;
    2. require 'demo4.php';
    3. //require 'demo2.php';
    4. require 'demo3.php';
    5. //use part1\Db_PDO;
    6. use part1\Db_Mysqli;
    7. use part1\iDbPaparms;
    8. use part1\Db;
    9. use part1\iCURD;
    10. //--------------------测试Db_PDO-------------------------------------------//
    11. //$dsn = iDbPaparms::TYPE.':host='.iDbPaparms::HOST.';dbname='.iDbPaparms::DBNAME;
    12. //$links = new Db_PDO($dsn,iDbPaparms::USER_NAME,iDbPaparms::PASSWORD);
    13. //测试新增
    14. //echo DB::insert($links,['赵敏','zhaomin1@php.cn',sha1('123456'),date('Y-m-d',time())]);
    15. //测试查询
    16. //$result = DB::select($links,"name='赵敏'");
    17. //print_r($result);
    18. //测试更新
    19. //echo DB::updata($links,['regs_time'=>date('Y-m-d',time())],"name = '赵敏'");
    20. //测试删除
    21. //echo DB::delete($links,"name = '赵敏'");
    22. //----------------测试Db_Mysqli--------------------------------------------//
    23. //echo iDbPaparms::HOST,iDbPaparms::USER_NAME,iDbPaparms::PASSWORD,iDbPaparms::DBNAME;
    24. //$links = new Db_Mysqli(iDbPaparms::HOST,iDbPaparms::USER_NAME,iDbPaparms::PASSWORD,iDbPaparms::DBNAME);
    25. //echo DB::insert($links,['赵敏','zhaomin1@php.cn',sha1('123456'),date('Y-m-d',time())]);
    26. //测试查询
    27. //$result = DB::select($links,"name='杨过'");
    28. //print_r($result);
    29. //测试更新
    30. //echo DB::updata($links,['email'=>'yangguo@php.cn'],"name = '杨过'");
    31. //测试删除
    32. //echo DB::delete($links,"id = 53");

    3.手抄代码

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