批改状态:合格
老师批语:// 2、执行操作 DURD 增删改查 几处地方改一下
<?phpnamespace pdo_edu;use PDO;// 1、读操作 select//2、 写操作 insert update delete// DURD 增删改查// 三步走// 1、连接数据库// 2、执行操作 DURD 增删改查// 3、关闭;连接// 1、连接数据库$dsn = 'mysql:host:localhost;dbname=bittel;port:3306;charset=utf8';$username = 'root';$password = 'root';$db = new PDO( $dsn,$username,$password );// 打印确认是否连接成功var_dump($db);// 2、执行操作 DURD 增删改查// UNSIGINED 无符号 只能正数// PRIMARY 主键// CHAR 固定的宽度// VARCHAR 可变的宽度// TINYINT 较小的整数// innoDB支持杭锁 列所 支持全文检索 论坛 强互动的 主流// MySAM 查询速度超快 文章系统去查询// CREATE TABLE `bittel`.`staff` ( `id` INT UNSIGNED NOT NULL COMMENT '主键' ,// `name` VARCHAR(30) NOT NULL COMMENT '姓名' , `sex` TINYINT(1) NOT NULL// DEFAULT '1' COMMENT '性别1是女 0是男' , `email` VARCHAR(100) NOT NULL COMMENT '邮箱' ) ENGINE = InnoDB;// 3、关闭;连接(可选,建议写)// 销毁连接对象// $db =null; 或// unset($db)
<?phpnamespace pdo_edu;use PDO;use ValueError;// 插入// 三步走// 1、连接数据库// 2、执行操作 DURD 增删改查// 3、关闭;连接// 1、连接数据库require __DIR__.'/config/connect.php';// 打印确认是否连接成功var_dump($db);echo '<hr>';// 2、执行操作 DURD 增删改查// 新增// 列表1// INSERT INFO 表明 ( 字段名1,字段名2,。。。) VALUES ( 值1,值2,值3)// 简化// INSERT 表名 ( 字段名1,字段名2,。。。) VALUES ( 值1,值2,值3)// 如果mysql 且单条 还可以简化 建议// INSERT 表名 SET 字段名1=值1,字段名2=值2,。。。// 查询// SELECT * FROM `staff` WHERE `id`// 1、SQL 关键字全部大写// 2、 表名、字段名必须加 反引号 防和关键字冲突// 主键不能写// $sql = 'INSERT `staff` SET `id`';$sql = "INSERT `staff` SET `name`='admin',`sex`=1,`email`='123@qq.com'";// 创建 sql 语句对象// 方式一// new PDOSlatement// 方式二 推荐 准备阶段$stmt = $db -> prepare($sql);// 打印确认// var_dump( $stmt);// 执行sqlif ($stmt->execute()){echo '插入成功';}// 3、关闭;连接(可选,建议写)// 销毁连接对象// $db =null; 或// unset($db)
<?php// pdo 预处理// 预处理的本质:sql 语句 中的数据,是动态绑定的// 动态绑定:只有在执行sql时,才绑定真实的数据// 静态绑定:数据直接写到sql中// 1、静态 select * from staff where id >10// 2、动态(预处理):select * from staff where id >?// 1、匿名参数 ? +索引数组 [ ]namespace pdo_edu;use PDO;// 连接$db = new PDO('mysql:dbname=bittel','root','root');// CURD :INSERT 插入// $sql ='INSERT `staff` set `name`="admin", `sex`=1,`email`="123@qq.cpom"';$sql ='INSERT `staff` SET `id`=?,name`=?, `sex`=?,`email`=?;';// sql 对象语句 ——> sql 语句 模板对象 ——> 预处理对象// 执行完会产生一个对象 惯例$stmt =$db->prepare($sql);// sql 语句中的占位符 ? ,给他绑定真实数据 绑定关系必须是一 一对应$data = [22,'小狗',0,'123@qq.com'];// 执行 sql 的方法$stmt->execute($data);// echo $stmt;echo '<hr>';// print_r($stmt);//验证:打印的sql预处理命令 调试常用的方法// $stmt->debugDumpParams();// 输出echo '新增成功,id='.$db->lastInsertId().'<hr>';
<?php// pdo: 预处理// 预处理的本质: sql语句中的数据,是动态绑定// 动态绑定: 只有在执行sql时,才绑定真实的数据// 静态绑定: 数据直接写到sql中// 1. 静态: select * from staff where id > 10// 2. 动态(预处理): select * from staff where id > ?// 2、命名参数 + 关联数组namespace pdo_edu;use PDO;// 连接$db = new PDO('mysql:dbname=bittel', 'root', 'root');// CURD: INSERT// 匿名参数: ?$sql = 'INSERT `staff` SET `name`=:name,`sex`=:sex,`email`=:email;';// sql语句->sql语句模板对象->预处理对象$stmt = $db->prepare($sql);// 关联数组// $data = [':name'=>'小猫',':sex'=>'0',':email'=>'456@qq.com',];// 简写 数据来源不写死$data = ['name'=>'小猫','sex'=>'0','email'=>'456@qq.com',];// 执行sql// $stmt->execute($data);// var_dump( $stmt->execute($data));if($stmt->execute($data)){echo '新增成功ID:'.$db->lastInsertId();}else{echo '执行失败';$stmt->debugDumpParams();print_r($stmt->errorInfo());}// 验证: 打印sql预处理命令// echo '新增成功, id = ' . $db->lastInsertId() . '<br>';// 用哪个?// 1. ? : 代码少, 结合上下文才知道语义// 2. ":name": 语义化,可读性// 我用第一个: ?//
<?php// 3 参数绑定: 值绑定 bindValue()/*** 为什么要单独设置参数,而不是在execute()时传参?* 1. execute()默认参数都是字符类型* 2. 通常数字型字符写入数据表时,会转换成正确类型,并不会有问题* 3. 但是在分页操作时,会导致错误* 4. 所在,在参数绑定时, 强制类型限制,就很有必要*/namespace pdo_edu;use PDO ;// 连接$db = new PDO( 'mysql:dbname=bittel','root','root');// $sql = 'INSERT `staff` SET `name`=?,`sex`=?,`email`=?;';// $stmt = $db->prepare($sql);// 太长的语法 用 heredoc 语法// CURD: INSERT// $sql = 'INSERT `staff` SET `name`= ?,`sex`= ?,`email`= ?;';$sql = <<< SQLINSERT `staff`SET `name`= ?,`sex`= ?,`email`= ?;SQL;// $stmt = $db->prepare($sql);$stmt = $db->prepare($sql);// bindValue( ) 值绑定,静态绑定,所以参数必须要 有一个确定的值// bindValue(key,value,type(默认字符串),size): 匿名占位符 ,索引是从1开始的// $stmt->bindValue(1, '悟空', PDO::PARAM_STR);// $stmt->bindValue(2, 1, PDO::PARAM_INT);// $stmt->bindValue(3, 'wukong@qq.com', PDO::PARAM_STR);// 一 一 绑定 // 达不到 给出不数据自动更新// list($name,$sex,$email)=['小牛',0,'901@qq.com'];// $stmt->bindValue(1, $name, PDO::PARAM_STR);// $stmt->bindValue(2, $sex, PDO::PARAM_INT);// $stmt->bindValue(3, $email, PDO::PARAM_STR);// list($name,$sex,$email)=['小龙',0,'901@qq.com'];// $stmt->bindValue(1, $name, PDO::PARAM_STR);// $stmt->bindValue(2, $sex, PDO::PARAM_INT);// $stmt->bindValue(3, $email, PDO::PARAM_STR);// 执行sql$stmt->execute();echo '新增成功, id = ' . $db->lastInsertId() . '<br>';// print_r($stmt->execute());// if($stmt->execute()){// echo '新增成功,id='.$db->lastInsertId();// }else{echo'执行失败';}
<?php// 3 参数绑定: 引用绑定 -动态绑定 绑定的别名 bindValue()/*** 为什么要单独设置参数,而不是在execute()时传参?* 1. execute()默认参数都是字符类型* 2. 通常数字型字符写入数据表时,会转换成正确类型,并不会有问题* 3. 但是在分页操作时,会导致错误* 4. 所在,在参数绑定时, 强制类型限制,就很有必要*/namespace pdo_edu;use PDO ;// 连接$db = new PDO( 'mysql:dbname=bittel','root','root');$sql = <<< SQLINSERT `staff`SET `name`= ?,`sex`= ?,`email`= ?;SQL;// $sql = 'INSERT `staff` SET `name`=?,`sex`=?,`email`=?;';$stmt = $db->prepare($sql);// print_r($stmt);// 引用绑定: 动态绑定,绑定的不是数据本身,而它的地址/引用/别名$stmt->bindParam(1,$name,PDO::PARAM_STR);$stmt->bindParam(2,$sex,PDO::PARAM_INT);$stmt->bindParam(3,$email,PDO::PARAM_STR);list($name,$sex,$email) = ['小马',0,'123@qqq.com'];// 新增一条 覆盖上面一条 模板更新 $stmt->bindParam(1,$name,PDO::PARAM_STR);list($name,$sex,$email) = ['小猴',0,'123@qqq.com'];// 执行sqlif ($stmt->execute()) {echo '新增成功, id = ' . $db->lastInsertId() . '<br>';}else{echo '执行失败';}// 引用绑定 ,优势大、用途,sql模板对象 只需要编译一遍,// 以后只要传入不同数据,就可以执行不同的操作了、// 以后建议只用 引用绑定
<?php// 3 参数绑定: 引用绑定 -动态绑定 绑定的别名 bindValue()// 同时插入多条数据 zuoye6 每次直插入一条数据/*** 为什么要单独设置参数,而不是在execute()时传参?* 1. execute()默认参数都是字符类型* 2. 通常数字型字符写入数据表时,会转换成正确类型,并不会有问题* 3. 但是在分页操作时,会导致错误* 4. 所在,在参数绑定时, 强制类型限制,就很有必要*/namespace pdo_edu;use PDO ;// 连接$db = new PDO( 'mysql:dbname=bittel','root','root');$sql = <<< SQLINSERT `staff`SET `name`= ?,`sex`= ?,`email`= ?;SQL;// $sql = 'INSERT `staff` SET `name`=?,`sex`=?,`email`=?;';$stmt = $db->prepare($sql);// print_r($stmt);// 引用绑定: 动态绑定,绑定的不是数据本身,而它的地址/引用/别名$stmt->bindParam(1,$name,PDO::PARAM_STR);$stmt->bindParam(2,$sex,PDO::PARAM_INT);$stmt->bindParam(3,$email,PDO::PARAM_STR);// 准备多条数据 使用二维数组来模拟$data = [['小蛇',1,'123@qq.com'],['小龙',0,'456@qq.com'],['小黑',1,'789@qq.com'],];// 使用 foreach 循环 来获取每组数据 ,然后使用 list() 进行解构获取每组数据的值foreach($data as list($name,$sex,$email) ){// 然后每组数据进行执行 数据库插入操作// 执行sql$stmt->execute();echo '新增成功, id = ' . $db->lastInsertId() . '<br>';}// 执行sql// if ($stmt->execute()) {// echo '新增成功, id = ' . $db->lastInsertId() . '<br>';// }else{echo '执行失败';}// 引用绑定 ,优势大、用途,sql模板对象 只需要编译一遍,// 以后只要传入不同数据,就可以执行不同的操作了、// 以后建议只用 引用绑定
<?php// 3 参数绑定: 引用绑定 -动态绑定 绑定的别名 bindValue()// 同时插入多条数据 zuoye6 每次直插入一条数据// 检测数据是否插入成功、/*** 为什么要单独设置参数,而不是在execute()时传参?* 1. execute()默认参数都是字符类型* 2. 通常数字型字符写入数据表时,会转换成正确类型,并不会有问题* 3. 但是在分页操作时,会导致错误* 4. 所在,在参数绑定时, 强制类型限制,就很有必要*/namespace pdo_edu;use PDO ;// 连接$db = new PDO( 'mysql:dbname=bittel','root','root');$sql = <<< SQLINSERT `staff`SET `name`= ?,`sex`= ?,`email`= ?;SQL;// $sql = 'INSERT `staff` SET `name`=?,`sex`=?,`email`=?;';$stmt = $db->prepare($sql);$data = ['小鸡',1,'123@qq.com'];// 然后每组数据进行执行 数据库插入操作// 读:select// 写 :insert updata delete 成功后 会返回 表中受影响的记录数据量// rowCount()返回受影响的记录数量 判断是否新增成功// 执行sql// $stmt->execute($data)? true :false;if ($stmt->execute($data)) {if($stmt->rowCount() >0){echo '新增成功, id = ' . $db->lastInsertId() . '<br>';}else{echo '新增失败';}}else{echo 'sql执行失败';print_r( $stmt->errorInfo());}// 引用绑定 ,优势大、用途,sql模板对象 只需要编译一遍,// 以后只要传入不同数据,就可以执行不同的操作了、// 以后建议只用 引用绑定/**背下来* tips:* 1. else : 应该用于开发调试阶段, 生产环境中应该将错误信息集中写到日志文件中* 2. sql执行失败很常见,通常是语法错误,例如字段name写成了name1* 3. 新增失败通常是权限不足,如没有插入权限或当前表被锁定只读等,也可能是磁盘空间满了*/
<?php// 更新操作namespace pdo_edu;use PDO ;// 连接$db = new PDO( 'mysql:dbname=bittel','root','root');// 更新操作 UPDATA -- 更新条件 必写$sql = <<< SQLUPDATE `staff`SET `name`= ?,`sex`= ?,`email`= ?WHERE `id`=?;SQL;// 绝对禁止无条件更新,不然所有数据都会更新 必须要检测 sql语句是否存在where子句// strpos ,stripos 忽略大小写if(false ===stripos($sql,'where')){// 执行结束当前脚本 不会越过此条语句exit('禁止无条件更新');}// $sql = 'INSERT `staff` SET `name`=?,`sex`=?,`email`=?;';$stmt = $db->prepare($sql);$data = ['小红',1,'090@qq.com',33];if($stmt->execute($data)){if($stmt->rowCount()>0){echo '更新成功记录,数量:'.$stmt->rowCount();}else{// 主要用于检测是否重复执行 再次执行时就会执行到这儿echo '更新失败';print_r($stmt->errorInfo());}}else{echo 'sql执行失败';print_r($stmt->errorInfo());}
<?php// 删除操作namespace pdo_edu;use PDO ;// 连接$db = new PDO( 'mysql:dbname=bittel','root','root');// 删除操作 DELETE FROM -- 更新条件 必写// $sql = 'DELETE FROM `staff` WHERE `id`=?;';$sql = 'DELETE FROM `staff` WHERE `id` = ?;';// 绝对禁止无条件更新,不然所有数据都会更新 必须要检测 sql语句是否存在where子句// strpos ,stripos 忽略大小写if(false ===stripos($sql,'where')){// 执行结束当前脚本 不会越过此条语句exit('禁止无条件删除');}// $sql = 'INSERT `staff` SET `name`=?,`sex`=?,`email`=?;';$stmt = $db->prepare($sql);$data = [34];if($stmt->execute($data)){if($stmt->rowCount()>0){echo '删除成功记录,数量:'.$stmt->rowCount();}else{// 主要用于检测是否重复执行 再次执行时就会执行到这儿echo '删除失败';print_r($stmt->errorInfo());}}else{echo 'sql执行失败';print_r($stmt->errorInfo());}
<?php// 查询操作 fetch() + while()namespace pdo_edu;use PDO ;// 连接$db = new PDO( 'mysql:dbname=bittel','root','root');// 查询 select$sql = 'SELECT `id`,`name`,`email` FROM `staff` LIMIT ?;';$stmt = $db->prepare($sql);// 执行sqL// if($stmt->execute(5)){ 不能直接写数据 因为写数字就变成了 字符串,无法执行应该是个数值// 因此需要变更下数据类型// $num =5;// $stmt->bindParam(1,$num,PDO::PARAM_INT);// 简化 因为查询条件是一个 所以值绑定合适$stmt->bindValue(1,5,PDO::PARAM_INT);if($stmt->execute()){echo '查询成功记录,数量:';$stmt->debugDumpParams();// 使用 fetch()逐条 获取,指针自动后移指向下一条// 获取模式的过滤器: PDO::FETCH_ASSOC 只返回关联部分数组// $staff = $stmt->fetch();// 第一个// $staff = $stmt->fetch(PDO::FETCH_ASSOC);// if($staff){// printf('<pre>%s<pre>',print_r( $staff,true));// }else{// echo '没有了';// }// 第二个 依次查询,可以使用while 循环// $staff = $stmt->fetch(PDO::FETCH_ASSOC);// if($staff){// printf('<pre>%s<pre>',print_r( $staff,true));// }else{// echo '没有了';// }while( $staff = $stmt->fetch(PDO::FETCH_ASSOC)){printf('<pre>%s<pre>',print_r( $staff,true));}}else{echo 'sql执行失败';print_r($stmt->errorInfo());}
<?php// 查询操作 fetchALL() + foreach()namespace pdo_edu;use PDO ;// 连接$db = new PDO( 'mysql:dbname=bittel','root','root');// 查询 select$sql = 'SELECT `id`,`name`,`email` FROM `staff` LIMIT ?;';$stmt = $db->prepare($sql);// 执行sqL// if($stmt->execute(5)){ 不能直接写数据 因为写数字就变成了 字符串,无法执行应该是个数值// 因此需要变更下数据类型// $num =5;// $stmt->bindParam(1,$num,PDO::PARAM_INT);// 简化 因为查询条件是一个 所以值绑定合适$stmt->bindValue(1,5,PDO::PARAM_INT);if($stmt->execute()){$staffs =$stmt->fetchAll(PDO::FETCH_ASSOC);// 二维数组打印print_r($staffs).'<br>';echo '<hr>';foreach($staffs as $staff){printf('<pre>%s</pre>',print_r($staff,true));}}else{echo 'sql执行失败';print_r($stmt->errorInfo());}
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号