Blogger Information
Blog 77
fans 0
comment 0
visits 55217
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
PDO预处理对数据的操作(增删查改)
Jet的博客
Original
273 people have browsed it

一、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);
Correcting teacher:PHPzPHPz

Correction status:qualified

Teacher's comments:
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post