博客列表 >PDO操作数据库及PDOStatement预处理防sql注入

PDO操作数据库及PDOStatement预处理防sql注入

嘬一口啊
嘬一口啊原创
2020年07月20日 17:18:161072浏览

PDO连接数据库步骤

  • 1.创建数据库连接配置文件
  1. define('DB_HOST','localhost'); //主机名
  2. define('DB_USER', 'root'); //连接数据库的用户名
  3. define('DB_PWD','******'); //连接数据库密码
  4. define('DB_NAME', 'test'); //数据库名称
  5. define('DB_PORT', '3306'); //数据库端口号
  6. define('DB_TYPE', 'mysql'); //数据库的型号
  7. define('DB_CHARSET', 'utf8'); //数据库的编码方式
  8. define('DB_DSN', DB_TYPE.":host=".DB_HOST.";dbname=".DB_NAME.";charset=".DB_CHARSET);//定义PDO的DSN,数据源名,包括主机名,端口号和数据库名称。
  9. //PDO驱动程序的名称,后面为一个冒号,再后面是可选的驱动程序连接数据库变量信息,如主机名、端口和数据库名。
  10. $dsn='mysql:host=localhost;dbname=apple';
  • 2.连接数据库设置字符集并抛出异常
  1. // 引入mysqli配置文件
  2. require "config.php";
  3. //
  4. try {
  5. // 数据库连接,得到一个PDO对象
  6. $pdo = new PDO(DB_DSN,DB_USER,DB_PWD);
  7. //捕捉特定于数据库信息的PDOEXCEPTION 异常
  8. } catch(PDOException $e) {
  9. echo $e->getMessage();
  10. //捕捉拥有Throwable接口的错误或者其他异常
  11. } catch (Throwable $e) {
  12. echo $e->getMessage();
  13. }
  • 3.定义sql语句
  1. 例:
  2. $sql = "select * from stu";
  • 4.执行sql语句
  1. // query() — 执行 SQL 语句,以 PDOStatement 对象形式返回结果集
  2. 例:
  3. $stmt = $pdo->query($sql);
  4. // 遍历输出结果集
  5. foreach ($stmt as $v) {
  6. echo $v['name'],'<br>';
  7. }
  8. exec()执行一条 UPDATE,DELETE,INSERT SQL 语句,并返回受影响的行数
  9. 例:
  10. $stmt = $pdo->exec($sql);
  • PDO常用方法及其应用
  1. errorInfo() 获取上一次句柄上一次操作的错误信息数组
  2. errorCode() 获取跟数据库句柄上一次操作相关的 SQLSTATE
  3. PDO::lastInsertId() 返回最后插入行的ID或序列值
  4. PDOStatement::fetch() 是用来获取一条记录
  5. PDOStatement::fetchAll() 是获取所有记录集到一个中

PDOStatement对象/预处理

  • 引入配置文件,连接数据库,设置字符集,并抛出异常
  1. // 引入mysqli配置文件
  2. require "config.php";
  3. // 连接数据库
  4. try {
  5. ////数据库连接,得到一个PDO对象
  6. $pdo = new PDO(DB_DSN,DB_USER,DB_PWD);
  7. // var_dump($pdo);
  8. //捕捉特定于数据库信息的PDOEXCEPTION 异常
  9. } catch(PDOException $e) {
  10. echo $e->getMessage();
  11. //捕捉拥有Throwable接口的错误或者其他异常
  12. } catch (Throwable $e) {
  13. echo $e->getMessage();
  14. }
  • 定义sql语句使用命名参数占位符定义预处理sql语句
  1. // 使用命名参数占位符定义预处理sql语句
  2. $sql = "select * from stu where age=:age";

-定义sql语句使用?占位符定义预处理sql语句

  1. // 使用?占位符定义预处理sql语句
  2. $sql = "select * from stu where age=?";
  • prepare() — 准备要执行的语句,并返回语句对象
  1. 例:
  2. $stmt = $pdo->prepare($sql);
  • 绑定参数方法 1[PDOStatement::bindParam — 绑定一个参数到指定的变量名]
  1. 例:
  2. // 使用PDOStatement::bindParam给一个使用?占位符的sql语句绑定值
  3. $sql = "SELECT * FROM `STU` WHERE AGE=?";
  4. $age = 12;
  5. $stmt->bindParam(1,$age);
  6. // 使用PDOStatement::bindParam给一个使用命名参数占位符的sql语句绑定值
  7. $sql = "SELECT * FROM `STU` WHERE AGE=:age";
  8. $age = 12;
  9. $stmt->bindParam(":age",$age);
  • 绑定参数方法 2[PDOStatement::bindValue — 把一个值绑定到一个参数]
  1. // 使用PDOStatement::bindValue给一个使用?占位符的sql语句绑定值
  2. 例:
  3. $age = 12;
  4. 4naem = '张三';
  5. $stmt->bindValue(1,$age);
  6. $stmt->bindValue(2,$name);
  7. // 使用PDOStatement::bindValue给一个使用命名参数占位符的sql语句绑定值
  8. 例:
  9. $sql = "SELECT * FROM `STU` WHERE `AGE`=:age AND `NAME`=:name";
  10. $age = 12;
  11. 4naem = '张三';
  12. $stmt->bindValue(":age",$age);
  13. $stmt->bindValue(":name",$name);
  • 执行预处理sql语句[PDOStatement::execute — 执行一条预处理语句]
  1. 例:
  2. $stmt->execute();
  • 绑定参数 bindParam()与bindValue();的区别
  1. 区别1: PDOStatement::bindValue 把一个值绑定到一个参数,PDOStatement::bindParam 绑定一个参数到指定的变量名
  2. 区别2: PDOStatement::bindParam()的第二个参数是按引用传递,所以只能提供变量作为参数,只有PDOStatement::execute()被执行的时候才取其值。
  3. PDOStatement::bindValue()为占位符参数绑定值,只要绑定成功,就不会再变了。
  • PDO预处理中常用的方法
  1. // PDOStatement::errorCode — 获取跟上一次语句句柄操作相关的 SQLSTATE
  2. // PDOStatement::errorInfo — 获取跟上一次语句句柄操作相关的扩展错误信息
  3. // PDOStatement::fetch — 从结果集中获取下一行
  4. // PDOStatement::fetchAll — 返回一个包含结果集中所有行的数组
  5. // PDOStatement::rowCount — 返回受上一个 SQL 语句影响的行数

使用PDO操作数据库遍历出数据表中的数据

  • 数据库配置文件
  1. <?php
  2. // 定义连接数据库的常量
  3. define('DB_HOST','localhost'); // 主机名
  4. define('DB_USER','root'); // 用户名
  5. define('DB_PWD', 'root'); // 密码
  6. define('DB_NAME', 'test'); // 数据库名
  7. define('DB_PORT', '3306'); //端口号
  8. define('DB_TYPE', 'mysql'); // 数据库类型
  9. define('DB_CHARSET', 'utf8'); // 字符集
  10. define('DB_DSN',DB_TYPE.":host=".DB_HOST.";dbname=".DB_NAME.";charset=".DB_CHARSET);
  11. // 得二种源数据方式
  12. // $dsn = 'mysql:host=localhost;dbname=test';
  13. // echo $dsn;
  14. ?>
  • PDO操作数据遍历数据文件
  1. <?php
  2. // 使用pdo遍历数据表中的数据
  3. // 引入数据库配置文件
  4. require "./config.php";
  5. // 连接数据库
  6. try {
  7. $pdo = new PDO(DB_DSN,DB_USER,DB_PWD);
  8. // 抛出pdo连接数据库的错误
  9. } catch (PDOException $e) {
  10. $e->getMessage();
  11. //捕捉拥有Throwable接口的错误或者其他异常
  12. } catch (Throwable $e) {
  13. echo $e->getMessage();
  14. }
  15. // 使用命名参数方法定义预处理sql语句
  16. $sql = "SELECT * FROM `stu` WHERE id>:id";
  17. // 准备sql语句
  18. $stmt = $pdo->prepare($sql);
  19. // 使用PDOStatement::bindParam绑定参数
  20. $id = 1;
  21. $stmt->bindParam(":id",$id);
  22. // 执行预处理sql语句判断是否成功
  23. if ($stmt->execute()) {
  24. echo "<table border='1' width='300px' align='center' >";
  25. echo "<tr align='center'>";
  26. echo "<td>ID</td>";
  27. echo "<td>姓名</td>";
  28. echo "<td>年龄</td>";
  29. echo "</tr>";
  30. // 循环数据
  31. foreach ($stmt->fetchall() as $v) {
  32. echo "<tr align='center'>";
  33. echo "<td>{$v['id']}</td>";
  34. echo "<td>{$v['name']}</td>";
  35. echo "<td>{$v['age']}</td>";
  36. echo "</tr>";
  37. }
  38. echo "</table>";
  39. }
  40. ?>
  • 遍历输出结果

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议
灭绝师太2020-07-20 17:42:301楼
总结的很好,可以结合上周学习的内容,做个小实战项目。