博客列表 >第十期PHPMySQLi操作数据库、接口与多态实战(2020-02-11)

第十期PHPMySQLi操作数据库、接口与多态实战(2020-02-11)

齐齐
齐齐原创
2020年02月14日 20:15:32608浏览

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

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