博客列表 >实例演示常用 的CURD操作,特别是各种常用组合,

实例演示常用 的CURD操作,特别是各种常用组合,

P粉314265155
P粉314265155原创
2022年08月22日 08:29:54310浏览

数据库连接

  1. <?php
  2. namespace pdo_edu;
  3. use PDO;
  4. // 1、读操作 select
  5. //2、 写操作 insert update delete
  6. // DURD 增删改查
  7. // 三步走
  8. // 1、连接数据库
  9. // 2、执行操作 DURD 增删改查
  10. // 3、关闭;连接
  11. // 1、连接数据库
  12. $dsn = 'mysql:host:localhost;dbname=bittel;port:3306;charset=utf8';
  13. $username = 'root';
  14. $password = 'root';
  15. $db = new PDO( $dsn,$username,$password );
  16. // 打印确认是否连接成功
  17. var_dump($db);
  18. // 2、执行操作 DURD 增删改查
  19. // UNSIGINED 无符号 只能正数
  20. // PRIMARY 主键
  21. // CHAR 固定的宽度
  22. // VARCHAR 可变的宽度
  23. // TINYINT 较小的整数
  24. // innoDB支持杭锁 列所 支持全文检索 论坛 强互动的 主流
  25. // MySAM 查询速度超快 文章系统去查询
  26. // CREATE TABLE `bittel`.`staff` ( `id` INT UNSIGNED NOT NULL COMMENT '主键' ,
  27. // `name` VARCHAR(30) NOT NULL COMMENT '姓名' , `sex` TINYINT(1) NOT NULL
  28. // DEFAULT '1' COMMENT '性别1是女 0是男' , `email` VARCHAR(100) NOT NULL COMMENT '邮箱' ) ENGINE = InnoDB;
  29. // 3、关闭;连接(可选,建议写)
  30. // 销毁连接对象
  31. // $db =null; 或
  32. // unset($db)

数据库插入-1

  1. <?php
  2. namespace pdo_edu;
  3. use PDO;
  4. use ValueError;
  5. // 插入
  6. // 三步走
  7. // 1、连接数据库
  8. // 2、执行操作 DURD 增删改查
  9. // 3、关闭;连接
  10. // 1、连接数据库
  11. require __DIR__.'/config/connect.php';
  12. // 打印确认是否连接成功
  13. var_dump($db);
  14. echo '<hr>';
  15. // 2、执行操作 DURD 增删改查
  16. // 新增
  17. // 列表1
  18. // INSERT INFO 表明 ( 字段名1,字段名2,。。。) VALUES ( 值1,值2,值3)
  19. // 简化
  20. // INSERT 表名 ( 字段名1,字段名2,。。。) VALUES ( 值1,值2,值3)
  21. // 如果mysql 且单条 还可以简化 建议
  22. // INSERT 表名 SET 字段名1=值1,字段名2=值2,。。。
  23. // 查询
  24. // SELECT * FROM `staff` WHERE `id`
  25. // 1、SQL 关键字全部大写
  26. // 2、 表名、字段名必须加 反引号 防和关键字冲突
  27. // 主键不能写
  28. // $sql = 'INSERT `staff` SET `id`';
  29. $sql = "INSERT `staff` SET `name`='admin',`sex`=1,`email`='123@qq.com'";
  30. // 创建 sql 语句对象
  31. // 方式一
  32. // new PDOSlatement
  33. // 方式二 推荐 准备阶段
  34. $stmt = $db -> prepare($sql);
  35. // 打印确认
  36. // var_dump( $stmt);
  37. // 执行sql
  38. if ($stmt->execute()){
  39. echo '插入成功';
  40. }
  41. // 3、关闭;连接(可选,建议写)
  42. // 销毁连接对象
  43. // $db =null; 或
  44. // unset($db)

数据库插入-2

  1. <?php
  2. // pdo 预处理
  3. // 预处理的本质:sql 语句 中的数据,是动态绑定的
  4. // 动态绑定:只有在执行sql时,才绑定真实的数据
  5. // 静态绑定:数据直接写到sql中
  6. // 1、静态 select * from staff where id >10
  7. // 2、动态(预处理):select * from staff where id >?
  8. // 1、匿名参数 ? +索引数组 [ ]
  9. namespace pdo_edu;
  10. use PDO;
  11. // 连接
  12. $db = new PDO('mysql:dbname=bittel','root','root');
  13. // CURD :INSERT 插入
  14. // $sql ='INSERT `staff` set `name`="admin", `sex`=1,`email`="123@qq.cpom"';
  15. $sql ='INSERT `staff` SET `id`=?,name`=?, `sex`=?,`email`=?;';
  16. // sql 对象语句 ——> sql 语句 模板对象 ——> 预处理对象
  17. // 执行完会产生一个对象 惯例
  18. $stmt =$db->prepare($sql);
  19. // sql 语句中的占位符 ? ,给他绑定真实数据 绑定关系必须是一 一对应
  20. $data = [22,'小狗',0,'123@qq.com'];
  21. // 执行 sql 的方法
  22. $stmt->execute($data);
  23. // echo $stmt;
  24. echo '<hr>';
  25. // print_r($stmt);
  26. //验证:打印的sql预处理命令 调试常用的方法
  27. // $stmt->debugDumpParams();
  28. // 输出
  29. echo '新增成功,id='.$db->lastInsertId().'<hr>';

数据库插入-3

  1. <?php
  2. // pdo: 预处理
  3. // 预处理的本质: sql语句中的数据,是动态绑定
  4. // 动态绑定: 只有在执行sql时,才绑定真实的数据
  5. // 静态绑定: 数据直接写到sql中
  6. // 1. 静态: select * from staff where id > 10
  7. // 2. 动态(预处理): select * from staff where id > ?
  8. // 2、命名参数 + 关联数组
  9. namespace pdo_edu;
  10. use PDO;
  11. // 连接
  12. $db = new PDO('mysql:dbname=bittel', 'root', 'root');
  13. // CURD: INSERT
  14. // 匿名参数: ?
  15. $sql = 'INSERT `staff` SET `name`=:name,`sex`=:sex,`email`=:email;';
  16. // sql语句->sql语句模板对象->预处理对象
  17. $stmt = $db->prepare($sql);
  18. // 关联数组
  19. // $data = [':name'=>'小猫',':sex'=>'0',':email'=>'456@qq.com',];
  20. // 简写 数据来源不写死
  21. $data = ['name'=>'小猫','sex'=>'0','email'=>'456@qq.com',];
  22. // 执行sql
  23. // $stmt->execute($data);
  24. // var_dump( $stmt->execute($data));
  25. if($stmt->execute($data)){
  26. echo '新增成功ID:'.$db->lastInsertId();
  27. }else{
  28. echo '执行失败';
  29. $stmt->debugDumpParams();
  30. print_r($stmt->errorInfo());
  31. }
  32. // 验证: 打印sql预处理命令
  33. // echo '新增成功, id = ' . $db->lastInsertId() . '<br>';
  34. // 用哪个?
  35. // 1. ? : 代码少, 结合上下文才知道语义
  36. // 2. ":name": 语义化,可读性
  37. // 我用第一个: ?
  38. //

参数绑定-值绑定

  1. <?php
  2. // 3 参数绑定: 值绑定 bindValue()
  3. /**
  4. * 为什么要单独设置参数,而不是在execute()时传参?
  5. * 1. execute()默认参数都是字符类型
  6. * 2. 通常数字型字符写入数据表时,会转换成正确类型,并不会有问题
  7. * 3. 但是在分页操作时,会导致错误
  8. * 4. 所在,在参数绑定时, 强制类型限制,就很有必要
  9. */
  10. namespace pdo_edu;
  11. use PDO ;
  12. // 连接
  13. $db = new PDO( 'mysql:dbname=bittel','root','root');
  14. // $sql = 'INSERT `staff` SET `name`=?,`sex`=?,`email`=?;';
  15. // $stmt = $db->prepare($sql);
  16. // 太长的语法 用 heredoc 语法
  17. // CURD: INSERT
  18. // $sql = 'INSERT `staff` SET `name`= ?,`sex`= ?,`email`= ?;';
  19. $sql = <<< SQL
  20. INSERT `staff`
  21. SET `name`= ?,`sex`= ?,`email`= ?;
  22. SQL;
  23. // $stmt = $db->prepare($sql);
  24. $stmt = $db->prepare($sql);
  25. // bindValue( ) 值绑定,静态绑定,所以参数必须要 有一个确定的值
  26. // bindValue(key,value,type(默认字符串),size): 匿名占位符 ,索引是从1开始的
  27. // $stmt->bindValue(1, '悟空', PDO::PARAM_STR);
  28. // $stmt->bindValue(2, 1, PDO::PARAM_INT);
  29. // $stmt->bindValue(3, 'wukong@qq.com', PDO::PARAM_STR);
  30. // 一 一 绑定 // 达不到 给出不数据自动更新
  31. // list($name,$sex,$email)=['小牛',0,'901@qq.com'];
  32. // $stmt->bindValue(1, $name, PDO::PARAM_STR);
  33. // $stmt->bindValue(2, $sex, PDO::PARAM_INT);
  34. // $stmt->bindValue(3, $email, PDO::PARAM_STR);
  35. // list($name,$sex,$email)=['小龙',0,'901@qq.com'];
  36. // $stmt->bindValue(1, $name, PDO::PARAM_STR);
  37. // $stmt->bindValue(2, $sex, PDO::PARAM_INT);
  38. // $stmt->bindValue(3, $email, PDO::PARAM_STR);
  39. // 执行sql
  40. $stmt->execute();
  41. echo '新增成功, id = ' . $db->lastInsertId() . '<br>';
  42. // print_r($stmt->execute());
  43. // if($stmt->execute()){
  44. // echo '新增成功,id='.$db->lastInsertId();
  45. // }else{echo'执行失败';}

参数绑定-引用绑定

  1. <?php
  2. // 3 参数绑定: 引用绑定 -动态绑定 绑定的别名 bindValue()
  3. /**
  4. * 为什么要单独设置参数,而不是在execute()时传参?
  5. * 1. execute()默认参数都是字符类型
  6. * 2. 通常数字型字符写入数据表时,会转换成正确类型,并不会有问题
  7. * 3. 但是在分页操作时,会导致错误
  8. * 4. 所在,在参数绑定时, 强制类型限制,就很有必要
  9. */
  10. namespace pdo_edu;
  11. use PDO ;
  12. // 连接
  13. $db = new PDO( 'mysql:dbname=bittel','root','root');
  14. $sql = <<< SQL
  15. INSERT `staff`
  16. SET `name`= ?,`sex`= ?,`email`= ?;
  17. SQL;
  18. // $sql = 'INSERT `staff` SET `name`=?,`sex`=?,`email`=?;';
  19. $stmt = $db->prepare($sql);
  20. // print_r($stmt);
  21. // 引用绑定: 动态绑定,绑定的不是数据本身,而它的地址/引用/别名
  22. $stmt->bindParam(1,$name,PDO::PARAM_STR);
  23. $stmt->bindParam(2,$sex,PDO::PARAM_INT);
  24. $stmt->bindParam(3,$email,PDO::PARAM_STR);
  25. list($name,$sex,$email) = ['小马',0,'123@qqq.com'];
  26. // 新增一条 覆盖上面一条 模板更新 $stmt->bindParam(1,$name,PDO::PARAM_STR);
  27. list($name,$sex,$email) = ['小猴',0,'123@qqq.com'];
  28. // 执行sql
  29. if ($stmt->execute()) {
  30. echo '新增成功, id = ' . $db->lastInsertId() . '<br>';
  31. }else{echo '执行失败';}
  32. // 引用绑定 ,优势大、用途,sql模板对象 只需要编译一遍,
  33. // 以后只要传入不同数据,就可以执行不同的操作了、
  34. // 以后建议只用 引用绑定

参数绑定-引用绑定-别名绑定

  1. <?php
  2. // 3 参数绑定: 引用绑定 -动态绑定 绑定的别名 bindValue()
  3. // 同时插入多条数据 zuoye6 每次直插入一条数据
  4. /**
  5. * 为什么要单独设置参数,而不是在execute()时传参?
  6. * 1. execute()默认参数都是字符类型
  7. * 2. 通常数字型字符写入数据表时,会转换成正确类型,并不会有问题
  8. * 3. 但是在分页操作时,会导致错误
  9. * 4. 所在,在参数绑定时, 强制类型限制,就很有必要
  10. */
  11. namespace pdo_edu;
  12. use PDO ;
  13. // 连接
  14. $db = new PDO( 'mysql:dbname=bittel','root','root');
  15. $sql = <<< SQL
  16. INSERT `staff`
  17. SET `name`= ?,`sex`= ?,`email`= ?;
  18. SQL;
  19. // $sql = 'INSERT `staff` SET `name`=?,`sex`=?,`email`=?;';
  20. $stmt = $db->prepare($sql);
  21. // print_r($stmt);
  22. // 引用绑定: 动态绑定,绑定的不是数据本身,而它的地址/引用/别名
  23. $stmt->bindParam(1,$name,PDO::PARAM_STR);
  24. $stmt->bindParam(2,$sex,PDO::PARAM_INT);
  25. $stmt->bindParam(3,$email,PDO::PARAM_STR);
  26. // 准备多条数据 使用二维数组来模拟
  27. $data = [
  28. ['小蛇',1,'123@qq.com'],
  29. ['小龙',0,'456@qq.com'],
  30. ['小黑',1,'789@qq.com'],
  31. ];
  32. // 使用 foreach 循环 来获取每组数据 ,然后使用 list() 进行解构获取每组数据的值
  33. foreach($data as list($name,$sex,$email) ){
  34. // 然后每组数据进行执行 数据库插入操作
  35. // 执行sql
  36. $stmt->execute();
  37. echo '新增成功, id = ' . $db->lastInsertId() . '<br>';
  38. }
  39. // 执行sql
  40. // if ($stmt->execute()) {
  41. // echo '新增成功, id = ' . $db->lastInsertId() . '<br>';
  42. // }else{echo '执行失败';}
  43. // 引用绑定 ,优势大、用途,sql模板对象 只需要编译一遍,
  44. // 以后只要传入不同数据,就可以执行不同的操作了、
  45. // 以后建议只用 引用绑定

参数绑定-引用绑定-

  1. <?php
  2. // 3 参数绑定: 引用绑定 -动态绑定 绑定的别名 bindValue()
  3. // 同时插入多条数据 zuoye6 每次直插入一条数据
  4. // 检测数据是否插入成功、
  5. /**
  6. * 为什么要单独设置参数,而不是在execute()时传参?
  7. * 1. execute()默认参数都是字符类型
  8. * 2. 通常数字型字符写入数据表时,会转换成正确类型,并不会有问题
  9. * 3. 但是在分页操作时,会导致错误
  10. * 4. 所在,在参数绑定时, 强制类型限制,就很有必要
  11. */
  12. namespace pdo_edu;
  13. use PDO ;
  14. // 连接
  15. $db = new PDO( 'mysql:dbname=bittel','root','root');
  16. $sql = <<< SQL
  17. INSERT `staff`
  18. SET `name`= ?,`sex`= ?,`email`= ?;
  19. SQL;
  20. // $sql = 'INSERT `staff` SET `name`=?,`sex`=?,`email`=?;';
  21. $stmt = $db->prepare($sql);
  22. $data = ['小鸡',1,'123@qq.com'];
  23. // 然后每组数据进行执行 数据库插入操作
  24. // 读:select
  25. // 写 :insert updata delete 成功后 会返回 表中受影响的记录数据量
  26. // rowCount()返回受影响的记录数量 判断是否新增成功
  27. // 执行sql
  28. // $stmt->execute($data)? true :false;
  29. if ($stmt->execute($data)) {
  30. if($stmt->rowCount() >0){
  31. echo '新增成功, id = ' . $db->lastInsertId() . '<br>';
  32. }else{
  33. echo '新增失败';
  34. }
  35. }else{
  36. echo 'sql执行失败';
  37. print_r( $stmt->errorInfo());
  38. }
  39. // 引用绑定 ,优势大、用途,sql模板对象 只需要编译一遍,
  40. // 以后只要传入不同数据,就可以执行不同的操作了、
  41. // 以后建议只用 引用绑定
  42. /**背下来
  43. * tips:
  44. * 1. else : 应该用于开发调试阶段, 生产环境中应该将错误信息集中写到日志文件中
  45. * 2. sql执行失败很常见,通常是语法错误,例如字段name写成了name1
  46. * 3. 新增失败通常是权限不足,如没有插入权限或当前表被锁定只读等,也可能是磁盘空间满了
  47. */

数据库更新

  1. <?php
  2. // 更新操作
  3. namespace pdo_edu;
  4. use PDO ;
  5. // 连接
  6. $db = new PDO( 'mysql:dbname=bittel','root','root');
  7. // 更新操作 UPDATA -- 更新条件 必写
  8. $sql = <<< SQL
  9. UPDATE `staff`
  10. SET `name`= ?,`sex`= ?,`email`= ?
  11. WHERE `id`=?;
  12. SQL;
  13. // 绝对禁止无条件更新,不然所有数据都会更新 必须要检测 sql语句是否存在where子句
  14. // strpos ,stripos 忽略大小写
  15. if(false ===stripos($sql,'where')){
  16. // 执行结束当前脚本 不会越过此条语句
  17. exit('禁止无条件更新');
  18. }
  19. // $sql = 'INSERT `staff` SET `name`=?,`sex`=?,`email`=?;';
  20. $stmt = $db->prepare($sql);
  21. $data = ['小红',1,'090@qq.com',33];
  22. if($stmt->execute($data)){
  23. if($stmt->rowCount()>0){
  24. echo '更新成功记录,数量:'.$stmt->rowCount();
  25. }else{
  26. // 主要用于检测是否重复执行 再次执行时就会执行到这儿
  27. echo '更新失败';
  28. print_r($stmt->errorInfo());
  29. }
  30. }else{
  31. echo 'sql执行失败';
  32. print_r($stmt->errorInfo());
  33. }

数据库删除操作

  1. <?php
  2. // 删除操作
  3. namespace pdo_edu;
  4. use PDO ;
  5. // 连接
  6. $db = new PDO( 'mysql:dbname=bittel','root','root');
  7. // 删除操作 DELETE FROM -- 更新条件 必写
  8. // $sql = 'DELETE FROM `staff` WHERE `id`=?;';
  9. $sql = 'DELETE FROM `staff` WHERE `id` = ?;';
  10. // 绝对禁止无条件更新,不然所有数据都会更新 必须要检测 sql语句是否存在where子句
  11. // strpos ,stripos 忽略大小写
  12. if(false ===stripos($sql,'where')){
  13. // 执行结束当前脚本 不会越过此条语句
  14. exit('禁止无条件删除');
  15. }
  16. // $sql = 'INSERT `staff` SET `name`=?,`sex`=?,`email`=?;';
  17. $stmt = $db->prepare($sql);
  18. $data = [34];
  19. if($stmt->execute($data)){
  20. if($stmt->rowCount()>0){
  21. echo '删除成功记录,数量:'.$stmt->rowCount();
  22. }else{
  23. // 主要用于检测是否重复执行 再次执行时就会执行到这儿
  24. echo '删除失败';
  25. print_r($stmt->errorInfo());
  26. }
  27. }else{
  28. echo 'sql执行失败';
  29. print_r($stmt->errorInfo());
  30. }

数据库查询操作 fetch+while·

  1. <?php
  2. // 查询操作 fetch() + while()
  3. namespace pdo_edu;
  4. use PDO ;
  5. // 连接
  6. $db = new PDO( 'mysql:dbname=bittel','root','root');
  7. // 查询 select
  8. $sql = 'SELECT `id`,`name`,`email` FROM `staff` LIMIT ?;';
  9. $stmt = $db->prepare($sql);
  10. // 执行sqL
  11. // if($stmt->execute(5)){ 不能直接写数据 因为写数字就变成了 字符串,无法执行应该是个数值
  12. // 因此需要变更下数据类型
  13. // $num =5;
  14. // $stmt->bindParam(1,$num,PDO::PARAM_INT);
  15. // 简化 因为查询条件是一个 所以值绑定合适
  16. $stmt->bindValue(1,5,PDO::PARAM_INT);
  17. if($stmt->execute()){
  18. echo '查询成功记录,数量:';
  19. $stmt->debugDumpParams();
  20. // 使用 fetch()逐条 获取,指针自动后移指向下一条
  21. // 获取模式的过滤器: PDO::FETCH_ASSOC 只返回关联部分数组
  22. // $staff = $stmt->fetch();
  23. // 第一个
  24. // $staff = $stmt->fetch(PDO::FETCH_ASSOC);
  25. // if($staff){
  26. // printf('<pre>%s<pre>',print_r( $staff,true));
  27. // }else{
  28. // echo '没有了';
  29. // }
  30. // 第二个 依次查询,可以使用while 循环
  31. // $staff = $stmt->fetch(PDO::FETCH_ASSOC);
  32. // if($staff){
  33. // printf('<pre>%s<pre>',print_r( $staff,true));
  34. // }else{
  35. // echo '没有了';
  36. // }
  37. while( $staff = $stmt->fetch(PDO::FETCH_ASSOC)){
  38. printf('<pre>%s<pre>',print_r( $staff,true));
  39. }
  40. }else{
  41. echo 'sql执行失败';
  42. print_r($stmt->errorInfo());
  43. }

数据库查询操作 fetchALL() + foreach()

  1. <?php
  2. // 查询操作 fetchALL() + foreach()
  3. namespace pdo_edu;
  4. use PDO ;
  5. // 连接
  6. $db = new PDO( 'mysql:dbname=bittel','root','root');
  7. // 查询 select
  8. $sql = 'SELECT `id`,`name`,`email` FROM `staff` LIMIT ?;';
  9. $stmt = $db->prepare($sql);
  10. // 执行sqL
  11. // if($stmt->execute(5)){ 不能直接写数据 因为写数字就变成了 字符串,无法执行应该是个数值
  12. // 因此需要变更下数据类型
  13. // $num =5;
  14. // $stmt->bindParam(1,$num,PDO::PARAM_INT);
  15. // 简化 因为查询条件是一个 所以值绑定合适
  16. $stmt->bindValue(1,5,PDO::PARAM_INT);
  17. if($stmt->execute()){
  18. $staffs =$stmt->fetchAll(PDO::FETCH_ASSOC);
  19. // 二维数组打印
  20. print_r($staffs).'<br>';
  21. echo '<hr>';
  22. foreach($staffs as $staff){
  23. printf('<pre>%s</pre>',print_r($staff,true));
  24. }
  25. }else{
  26. echo 'sql执行失败';
  27. print_r($stmt->errorInfo());
  28. }
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议