Blogger Information
Blog 22
fans 1
comment 0
visits 17693
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
第十期PHPMySQLi操作数据库、接口与多态实战(2020-02-11)
齐齐
Original
601 people have browsed it

1.MySQLi常用数据库操作

1.1 新增操作

  1. namespace chapter2;
  2. //1.连接数据库
  3. $mysqli=new \mysqli('localhost','root','root','phpstudy');
  4. //2.sql查询操作
  5. //准备一条sql语句
  6. $sql='insert `users` set `name`=?,`email`=?,`password`=?,`register_time`=?';
  7. //创建预处理对象,通过stmt->init方法
  8. $stmt=$mysqli->stmt_init();
  9. //创建sql语句对象
  10. $stmt->prepare($sql);
  11. //变量与sql语句中的占位符绑定 bind_param()
  12. $user=['qiqi','qiqi@qq.com',sha1(123456),time()];
  13. list($name,$email,$password,$register_time)=$user;
  14. $stmt->bind_param('sssi',$name,$email,$password,$register_time);
  15. //执行
  16. $stmt->execute();
  17. //3.结果处理
  18. if($stmt->affected_rows===1):
  19. echo '增加成功,增加的主键id为'.$stmt->insert_id;
  20. else:
  21. echo '增加失败'.$stmt->error;
  22. endif;
  23. //4.结束操作 关闭数据库连接
  24. $stmt->close();

1.2 更新操作

  1. //更新操作
  2. namespace chapter2;
  3. //1.连接数据库
  4. $mysqli=new \mysqli('localhost','root','root','phpstudy');
  5. //2.sql查询操作
  6. //准备一条sql语句
  7. $sql='update `users` set `name`=?,`email`=? where `id`=?';
  8. //创建预处理对象,通过stmt->init方法
  9. $stmt=$mysqli->stmt_init();
  10. //创建sql语句对象
  11. $stmt->prepare($sql);
  12. //变量与sql语句中的占位符绑定 bind_param()
  13. $user=['qiqi','qiqi@qq.com',9];
  14. list($name,$email,$id)=$user;
  15. $stmt->bind_param('ssi',$name,$email,$id);
  16. //执行
  17. $stmt->execute();
  18. //3.结果处理
  19. if($stmt->affected_rows===1):
  20. echo '更新成功';
  21. else:
  22. echo '更新失败'.$stmt->error;
  23. endif;
  24. //4.结束操作 关闭数据库连接
  25. $stmt->close();

1.3 删除操作

  1. //删除操作
  2. namespace chapter2;
  3. //1.连接数据库
  4. $mysqli=new \mysqli('localhost','root','root','phpstudy');
  5. //2.sql查询操作
  6. //准备一条sql语句
  7. $sql='delete from `users`where `id`=?';
  8. //创建预处理对象,通过stmt->init方法
  9. $stmt=$mysqli->stmt_init();
  10. //创建sql语句对象
  11. $stmt->prepare($sql);
  12. //变量与sql语句中的占位符绑定 bind_param()
  13. //$user=[9];
  14. //list($id)=$user;
  15. $id=9;
  16. $stmt->bind_param('i',$id);
  17. //执行
  18. $stmt->execute();
  19. //3.结果处理
  20. if($stmt->affected_rows===1):
  21. echo '删除成功';
  22. else:
  23. echo '删除失败'.$stmt->error;
  24. endif;
  25. //4.结束操作 关闭数据库连接
  26. $stmt->close();

1.3 查询操作

1.3.1 查询操作:用STMT对象查询
  1. //查询操作
  2. namespace chapter2;
  3. //查询1:用STMT对象查询
  4. //1.连接数据库
  5. $mysqli=new \mysqli('localhost','root','root','phpstudy');
  6. //2.sql查询操作
  7. //准备一条sql语句
  8. $sql='select `id`,`name`,`email` from `users`where `id`>?';
  9. //创建预处理对象,通过stmt->init方法
  10. $stmt=$mysqli->stmt_init();
  11. //创建sql语句对象
  12. $stmt->prepare($sql);
  13. //变量与sql语句中的占位符绑定 bind_param()
  14. //$user=[9];
  15. //list($id)=$user;
  16. $id=2;
  17. $stmt->bind_param('i',$id);
  18. //执行
  19. $stmt->execute();
  20. //3.结果处理
  21. //bind_result():将结果集中的字段(列),绑定到指定的变量上
  22. $stmt->bind_result($id,$name,$email);
  23. while ($stmt->fetch())
  24. {
  25. echo "$id===>$name===>$email<br>";
  26. }
  27. //4.结束操作 关闭数据库连接
  28. //释放结果集
  29. $stmt->free_result();
  30. $stmt->close();
1.3.2 查询操作:用结果集对象查询
  1. //查询操作
  2. namespace chapter2;
  3. //查询2:用结果集对象查询
  4. //1.连接数据库
  5. $mysqli=new \mysqli('localhost','root','root','phpstudy');
  6. //2.sql查询操作
  7. //准备一条sql语句
  8. $sql='select `id`,`name`,`email` from `users`where `id`>?';
  9. //创建预处理对象,通过stmt->init方法
  10. $stmt=$mysqli->stmt_init();
  11. //创建sql语句对象
  12. $stmt->prepare($sql);
  13. //变量与sql语句中的占位符绑定 bind_param()
  14. //$user=[9];
  15. //list($id)=$user;
  16. $id=3;
  17. $stmt->bind_param('i',$id);
  18. //执行
  19. $stmt->execute();
  20. //3.结果处理
  21. $result=$stmt->get_result();
  22. //$user=$result->fetch_array();
  23. //$user=$result->fetch_row();
  24. //$user=$result->fetch_assoc();
  25. while ($user=$result->fetch_assoc())
  26. {
  27. echo "{$user['id']}==>{$user['name']}==>{$user['email']} <br>";
  28. }
  29. echo "<br>";
  30. $result->data_seek(0);
  31. $users=$result->fetch_all(MYSQLI_ASSOC);
  32. foreach ($users as $user)
  33. {
  34. echo "{$user['id']}==>{$user['name']}==>{$user['email']} <br>";
  35. }
  36. print_r($users);
  37. //4.结束操作 关闭数据库连接
  38. //释放结果集
  39. $result->free_result();
  40. $stmt->close();

2.接口与多态实战

2.1 配置接口常量,构造方法,增删改查操作

  1. namespace chapter2;
  2. //配置接口常量
  3. interface iDbParam
  4. {
  5. //主机名
  6. const HOST="localhost";
  7. //数据库类型
  8. const TYPE="mysql";
  9. //默认数据库名称
  10. const DBNAME="phpstudy";
  11. //数据库数据库账号
  12. const DB_NAME="root";
  13. //数据库数据库密码
  14. const DB_PASSWORD="root";
  15. //默认编码字符集
  16. const CHARSET="utf8";
  17. }
  18. //接口构造方式:实例化数据库连接对象
  19. interface iDBLink
  20. {
  21. public function __construct(...$linkParams);
  22. }
  23. //接口方法,允许多重继承
  24. interface iCURD extends iDbParam,iDBLink
  25. {
  26. //新增操作
  27. public function insert(array $data);
  28. //更新操作
  29. public function update(array $date,string $where='');
  30. //查询操作
  31. public function select(string $where);
  32. //删除操作
  33. public function delete(string $where);
  34. }

2.2 用PDO来实现数据库操作

  1. namespace chapter2;
  2. //用PDO来实现数据库操作
  3. //加载iCUDR接口文件
  4. use PDO;
  5. require "demo7.php";
  6. class Db_PDO implements iCURD
  7. {
  8. // 新增pdo操作对象属性
  9. private $pdo=null;
  10. public function __construct(...$linkParams)
  11. {
  12. list($dsn,$username,$password)=$linkParams;
  13. $this->pdo=new PDO($dsn,$username,$password);
  14. }
  15. //新增操作
  16. public function insert(array $data)
  17. {
  18. $sql="insert `users` set `name`=?,`email`=?,`password`=?,`register_time`=?;";
  19. $stmt=$this->pdo->prepare($sql);
  20. $stmt->execute($data);
  21. return $stmt->rowCount()===1?'新增成功':'新增失败';
  22. }
  23. //更新操作
  24. public function update(array $date,string $where='')
  25. {
  26. //生成更新字符串
  27. $param='';
  28. foreach($date as $key =>$value)
  29. {
  30. $param.="`{$key}`='{$value}',";
  31. }
  32. $param=rtrim($param,',');
  33. $sql="update `users` set {$param} where {$where}";
  34. $stmt=$this->pdo->prepare($sql);
  35. $stmt->execute();
  36. return $stmt->rowCount()===1?'更新成功':'更新失败';
  37. }
  38. //查询操作
  39. public function select(string $where)
  40. {
  41. $where=empty($where)?$where:'where '.$where;
  42. $sql="select * from `users` {$where}";
  43. $stmt=$this->pdo->prepare($sql);
  44. $stmt->execute();
  45. return $stmt->fetchAll(PDO::FETCH_ASSOC);
  46. }
  47. //删除操作
  48. public function delete(string $where)
  49. {
  50. $sql="delete from `users` where {$where}";
  51. $stmt=$this->pdo->prepare($sql);
  52. $stmt->execute();
  53. return $stmt->rowCount()===1?'删除成功':'删除失败';
  54. }
  55. }

2.3 用MYSQLI来实现数据库操作

  1. namespace chapter2;
  2. //用MYSQLI来实现数据库操作
  3. use mysqli;
  4. //加载iCUDR接口文件
  5. require "demo7.php";
  6. class Db_MySQLI implements iCURD
  7. {
  8. // 新增pdo操作对象属性
  9. private $mysqli=null;
  10. public function __construct(...$linkParams)
  11. {
  12. list($host,$username,$password,$dbname)=$linkParams;
  13. $this->mysqli=new mysqli($host,$username,$password,$dbname);
  14. }
  15. //新增操作
  16. public function insert(array $data)
  17. {
  18. $sql="insert `users` set `name`=?,`email`=?,`password`=?,`register_time`=?;";
  19. $stmt=$this->mysqli->prepare($sql);
  20. list($name,$email,$password,$register_time)=$data;
  21. $stmt->bind_param('sssi',$name,$email,$password,$register_time);
  22. $stmt->execute();
  23. return $stmt->affected_rows===1?'新增成功':'新增失败';
  24. }
  25. //更新操作
  26. public function update(array $date,string $where='')
  27. {
  28. //生成更新字符串
  29. $param='';
  30. foreach($date as $key =>$value)
  31. {
  32. $param.="`{$key}`='{$value}',";
  33. }
  34. $param=rtrim($param,',');
  35. $sql="update `users` set {$param} where {$where}";
  36. $stmt=$this->mysqli->prepare($sql);
  37. $stmt->execute();
  38. return $stmt->affected_rows===1?'更新成功':'更新失败';
  39. }
  40. //查询操作
  41. public function select(string $where)
  42. {
  43. $where=empty($where)?$where:'where '.$where;
  44. $sql="select * from `users` {$where}";
  45. $stmt=$this->mysqli->prepare($sql);
  46. $stmt->execute();
  47. return $stmt->get_result();
  48. }
  49. //删除操作
  50. public function delete(string $where)
  51. {
  52. $sql="delete from `users` where {$where}";
  53. $stmt=$this->mysqli->prepare($sql);
  54. $stmt->execute();
  55. return $stmt->affected_rows===1?'删除成功':'删除失败';
  56. }
  57. }

2.3 创建基于接口iCURD的通用类

  1. namespace chapter2;
  2. //通用类
  3. class DB
  4. {
  5. public static function insert(iCURD $db,array $data)
  6. {
  7. return $db->insert($data);
  8. }
  9. //更新操作
  10. public static function update(iCURD $db,array $date,string $where='')
  11. {
  12. return $db->update($date,$where);
  13. }
  14. //查询操作
  15. public static function select(iCURD $db,string $where)
  16. {
  17. return $db->select($where);
  18. }
  19. //删除操作
  20. public static function delete(iCURD $db,string $where)
  21. {
  22. return $db->delete($where);
  23. }
  24. }

2.4 PDO方式实现数据库的操作

  1. namespace chapter2;
  2. //用pdo方式来操作数据库
  3. //载入Db_PDO类
  4. require 'demo8.php';
  5. //载入通用类
  6. require 'demo10.php';
  7. $dsn=iDbParam::TYPE.':host='.iDbParam::HOST.';dbname='.iDbParam::DBNAME.';charset='.iDbParam::CHARSET ;
  8. $link=new Db_PDO($dsn,iDbParam::DB_NAME,iDbParam::DB_PASSWORD);
  9. //增加操作
  10. //echo DB::insert($link,['qi','qi@qq.com',sha1('123456'),time()]);
  11. //更新操作
  12. //echo DB::update($link,['name'=>'芙蓉','email'=>'furong@qq.com'],'id=10');
  13. //查询操作
  14. //foreach (DB::select($link,'id>5') as $value)
  15. //{
  16. // echo "{$value['name']}===={$value['email']}<br>";
  17. //}
  18. //删除操作
  19. echo DB::delete($link,'id=12');

2.5 MYSQLI方式实现数据库的操作

  1. namespace chapter2;
  2. //用mysqli方式来操作数据库
  3. //载入Db_MYSQLI类
  4. require 'demo9.php';
  5. //载入通用类
  6. require 'demo10.php';
  7. $link=new Db_MySQLI(iDbParam::HOST,iDbParam::DB_NAME,iDbParam::DB_PASSWORD,iDbParam::DBNAME);
  8. //增加操作
  9. //echo DB::insert($link,['张小石','xiaoshi@qq.com',sha1('123456'),time()]);
  10. //更新操作
  11. //echo DB::update($link,['name'=>'木子','email'=>'muzi@qq.com'],'id=14');
  12. //查询操作
  13. //foreach (DB::select($link,'id>5') as $value)
  14. //{
  15. // echo "{$value['name']}===={$value['email']}<br>";
  16. //}
  17. //删除操作
  18. echo DB::delete($link,'id=11');

2.5 部分测试运行图



3.mysqli_result方法、属性手写

4.总结

4.1 运行出错,就经常会出在一个小细节上。例如在拼接查询遇见的时候,where关键字与查询条件之间,没有空格导致查询失败。新增查询的占位符,如果和传入的个数不同,会导致新增失败。

4.2 接口实现的多态,操作同一个方法,能够实现不同的解结果。数据库的更新操作,相对于其他操作来说,难点在查询字符串的拼接上。

4.3 在实战的过程中,经常会用到之前学习过得内容,加深了印象。不熟悉的知识,总要花很多时间来消耗。

Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:看十遍, 不如动手写一遍
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