PDO预处理对数据的操作(增删查改)

编辑: admin 分类: 电脑知识 发布时间: 2023-06-14 来源:互联网
一、PDO预处理对数据的操作(增删查改)什么是预处理
  1. PDO预处理语句(prepared statement)机制,是将一条SQL命令向数据库服务器发送一次(此时发送的参数不是实参,是占位符),以后参数发生变化,数据库服务器只需对命令的结构做一次分析就够了。
  2. 对于复杂的查询,此过程要花费较长的时间,如果需要以不同参数多次重复相同的查询,那么该过程将大大降低应用程序的速度。通过使用预处理语句,可以避免重复分析/编译/优化周期。简言之,预处理语句占用更少的资源,因而运行得更快
  3. // 预处理机制,sql中的数据使用占位符
  4. // 命名参数占位符,文号参数占位符
  5. 预处理能防止SQL注入
传统处理php文件
  1. // 数据库的操作
  2. require __DIR__ . '/config/connect.php';
  3. $user = json_decode(file_get_contents('php://input'), true);
  4. $uname = $user['username'];
  5. $pwd = sha1($user['password']);
  6. $sql = "select * from user where uname = '{$uname}' and pwd = '{$pwd};";
  7. //echo $sql;
  8. print_r($db->query($sql)->fetchAll());


从以上截图可以得知,用户在前端可以通过输入相关编译码,获取到不可思议的数据。


预处理php文件
  1. // 预处理机制,sql中的数据使用占位符
  2. // 命名参数占位符,文号参数占位符
  3. // 预处理sql语句
  4. // $sql = 'INSERT user VALUES(null, :uname, :pwd, :status);';
  5. $sql = 'SELECT * FROM user WHERE uname=? AND pwd=?';
  6. // 预处理要执行的语句,并返回语句对象 (PDOStatement)
  7. $stmt = $db->prepare($sql);
  8. // 将具体的值绑定到占位符参数上
  9. $stmt->bindValue(1,$uname);
  10. $stmt->bindValue(2, $pwd);
  11. if ($stmt->execute())
  12. {
  13. $users = $stmt->fetchAll();
  14. echo json_encode($users);
  15. } else {
  16. die('查询失败:' . $stmt->errorInfo());
  17. }


通过pdo预处理,应用程序只使用预处理语句,可以防止发生SQL注入。


1、INSERT:新增
  1. // ! 新增数据
  2. // 预处理机制,sql中的数据使用占位符
  3. // 命名参数占位符,文号参数占位符
  4. // 预处理sql语句
  5. $sql = 'INSERT user VALUES(null, :uname, :pwd, :status);';
  6. // 预处理要执行的语句,并返回语句对象 (PDOStatement)
  7. $stmt = $db->prepare($sql);
  8. // 将具体的值绑定到占位符参数上
  9. $stmt->bindValue(':uname','隔壁老李11');
  10. $stmt->bindValue(':pwd', sha1('123'));
  11. $stmt->bindValue(':status',1);
  12. if ($stmt->execute())
  13. {
  14. // 打印一条sql预处理命令
  15. // $stmt->debugDumpParams();
  16. echo '新增成功,新记录的主键id=' . $db->lastInsertId();
  17. } else {
  18. $stmt->errorInfo();
  19. }


2、SELECT:查询
  1. $sql = 'SELECT id,uname FROM user WHERE id > ?';
  2. // 预处理要执行的语句,并返回语句对象 (PDOStatement)
  3. $stmt = $db->prepare($sql);
  4. // 将具体的值绑定到占位符参数上
  5. $stmt->bindValue(1, 10);
  6. if ($stmt->execute())
  7. {
  8. // 返回受上一个SQL语句影响的行数
  9. // 1. 逐条 fetch + while
  10. // 2. 多条 fetchAll + foreach
  11. $users = $stmt->fetchAll();
  12. foreach($users as $user)
  13. {
  14. extract($user);
  15. vprintf("%d: %s\n", [$id,$uname]);
  16. }
  17. } else {
  18. die('查询失败:' . $stmt->errorInfo());
  19. }


3、DELETE:删除
  1. // ! 删除数据
  2. $sql = 'delete from user where id = ? ';
  3. if(!stristr($sql, 'where')){
  4. die('禁止无条件删除');
  5. }
  6. // 预处理要执行的语句,并返回语句对象 (PDOStatement)
  7. $stmt = $db->prepare($sql);
  8. $stmt->bindValue(1,5);
  9. if ($stmt->execute())
  10. {
  11. if($stmt->rowCount()>0){
  12. echo '删除成功';
  13. } else {
  14. echo '没有记录被删除';
  15. }
  16. } else {
  17. die('删除失败:' . $stmt->errorInfo());
  18. }


4、UPDATE:更新
  1. // ! 更新数据
  2. $sql = 'UPDATE user SET status = ? WHERE uname = ? ;';
  3. // 预处理要执行的语句,并返回语句对象 (PDOStatement)
  4. $stmt = $db->prepare($sql);
  5. $stmt->bindValue(1, 2);
  6. $stmt->bindValue(2,'隔壁老李1');
  7. if ($stmt->execute())
  8. {
  9. if($stmt->rowCount()>0){
  10. echo '更新成功' . $stmt->rowCount() . '条数据';
  11. }else {
  12. echo '没有更新数据';
  13. }
  14. }


占位符使用方法:
  • 方法1:将具体的值绑定到占位符上
  1. $sql = 'INSERT user VALUES(null, :uname, :pwd, :status);';
  2. // 将具体的值绑定到占位符参数上
  3. $stmt->bindValue(':uname','隔壁老李11');
  4. $stmt->bindValue(':pwd', sha1('123'));
  5. $stmt->bindValue(':status',1);
  • 方法2:按顺序绑定到占位符上
  1. $sql = 'SELECT * FROM user WHERE uname=? AND pwd=?';
  2. $stmt->bindValue(1, $uname);
  3. $stmt->bindValue(2, $pwd);
【文章出处:香港cn2服务器 http://www.558idc.com/st.html 复制请保留原URL】