Correction status:qualified
Teacher's comments:
PDO连接数据库:
<?php /医院 * PDO连接数据库 */ //1.配置参数 /* * 数据源:DSN * 基本格式:数据库的类型:属性=值... * mysql:host=127.0.0.1;dbname=php;charset=utf-8;port=3306 */ $pdo=new PDO('mysql:dbname=php','root','root');
点击 "运行实例" 按钮查看在线实例
PDO预处理添加操作:
<?php header("Content-type: text/html; charset=utf-8"); /医院 * PDO预处理添加操作 * PDO的预处理使用的是PDOStatement对象 * $pdo->prepare()创建stmt对象 * sql语句中的占位符全部采用:命名占位符,不用? */ //1.连接数据库 require 'pdo_connect.php'; //2.sql语句 INSERT user SET name =:name,email=:email,password=sha1(:password) $sql="INSERT `user` SET `user_name`=:user_name,`email`=:email,`password`=sha1(:password)"; //3.创建PDO预处理对象stmt $stmt=$pdo->prepare($sql); //4.要插入到数据库里的数据 data数组中的参数对应$sql命名占位符 $data=['user_name'=>'张飞','email'=>'zf@qq.com','password'=>'333']; /* * 4.1绑定变量到预处理对象:SQL语句对象 * $stmt->bindParam(参数,变量,类型) */ //$stmt->bindParam(':name',$data['user_name'],PDO::PARAM_STR); //$stmt->bindParam(':email',$data['email'],PDO::PARAM_STR); //$stmt->bindParam(':password',$data['password'],PDO::PARAM_STR); //5.执行新增操作 if($stmt->execute($data)) { //成功会返回受影响的记录数:新增的记录数量 echo '<h3>成功添加了'.$stmt->rowCount().'条记录</h3>'; }else{ echo '<h3>添加失败</h3>'; print_r($stmt->errorInfo()); die(); }
点击 "运行实例" 按钮查看在线实例
PDO预处理更新操作:
<?php header("Content-type: text/html; charset=utf-8"); /医院 * PDO预处理更新操作 * PDO的预处理使用的是PDOStatement对象 * $pdo->prepare()创建stmt对象 * sql语句中的占位符全部采用:命名占位符,不用? */ //1.连接数据库 require 'pdo_connect.php'; //2.sql语句 UPDATE user SET name =:name,email=:email,password=sha1(:password) $sql="UPDATE `user` SET `user_name`=:user_name,`email`=:email,`password`=sha1(:password) WHERE `user_id`=:user_id"; //3.创建PDO预处理对象stmt $stmt=$pdo->prepare($sql); //4.要更新的数据 $data=['user_name'=>'孔明','email'=>'km@qq.com','password'=>'333','user_id'=>1]; /* * 4.1绑定变量到预处理对象:SQL语句对象 * $stmt->bindParam(参数,变量,类型) */ //$stmt->bindParam(':name',$data['user_name'],PDO::PARAM_STR); //$stmt->bindParam(':email',$data['email'],PDO::PARAM_STR); //$stmt->bindParam(':password',$data['password'],PDO::PARAM_STR); //5.执行操作 if($stmt->execute($data)) { //成功会返回受影响的记录数 echo '<h3>更新了'.$stmt->rowCount().'条记录</h3>'; }else{ echo '<h3>更新失败</h3>'; print_r($stmt->errorInfo()); die(); }
点击 "运行实例" 按钮查看在线实例
总结:
在生成网页时,许多PHP脚本通常都会执行除参数之外,其他部分完全相同的查询语句,针对这种重复执行一个查询,每次迭代使用不同的参数情况,PDO提供了一种名为预处理语句(prepared statement)的机制。它可以将整个SQL命令向数据库服务器发送一次,以后只有参数发生变化,数据库服务器只需对命令的结构做一次分析就够了,即编译一次,可以多次执行。会在服务器上缓存查询的语句和执行过程,而只在服务器和客户端之间传输有变化的列值,以此来消除这些额外的开销。这不仅大大减少了需要传输的数据量,还提高了命令的处理效率。可以有效防止SQL注入,在执行单个查询时快于直接使用query()或exec()的方法,速度快且安全
PDO对预处理语句的支持需要使用PDOStatement类对象,但该类的对象并不是通过NEW关键字实例化出来的,而是通过执行PDO对象的prepare()方法,在数据库服务器中准备好一个预处理的SQL语句后直接返回的。如果通过之前执行PDO对象的query()方法返回的PDOStatement类对象,只代表的是一个结果集对象。而如果通过执行PDO对象中的prepare()方法产生的PDOStatement类对象,则为一个查询对象,能定义和执行参数化的SQL命令
运行效果图: