博客列表 >PDO数据访问抽象层

PDO数据访问抽象层

王佳祥
王佳祥原创
2020年07月17日 12:50:20786浏览

PDO数据访问抽象层

一、对PDO的理解

  • PDO(PHP Data Object)是php数据对象,即实现与不同数据库连接进行各种增删改查操作的工具。其优点是不管哪种数据库都能使用,兼容性稳定,其预处理可以防止sql注入确保数据安全。

二、安装PDO

  • 在php.ini文件中找到extension=php_pdo_mysql.dll去掉前面的分号注释,然后重启Apache


三、定义PDO所需要的常量

  1. <?php
  2. //定义数据库常量
  3. /*--------------------------------------------------------------------*/
  4. //主机名
  5. define('DB_HOST','localhost');
  6. //用户名
  7. define('DB_USER','root');
  8. //密码
  9. define('DB_PWD','wang1111');
  10. //数据库名
  11. define('DB_NAME','tp5');
  12. //端口号
  13. define('DB_PORT','3306');
  14. //数据库类型
  15. define('DB_TYPE','mysql');
  16. //数据库的编码
  17. define('DB_CHARSET','utf8');
  18. //定义PDO的DSN,数据库源名,包括数据库类型、主机名、数据库名称和数据库编码。
  19. define('DB_DSN',DB_TYPE.":host=".DB_HOST.";dbname=".DB_NAME.";charset=".DB_CHARSET);
  20. //PDO驱动程序的名称,后面为一个冒号,再后面是可选的驱动程序连接数据库变量信息,如主机名端口号和数据库名
  21. //$dsn = 'mysql:host=localhost,dbname=tp5';
  22. /*-------------------------------------------------------------------------*/


四、PDO连接数据库

  1. <?php
  2. //使用DPO进行mysql类的数据库连接
  3. require "config.php";
  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. }
  14. //更新数据
  15. $sql = "UPDATE `user` SET `username` = 'Flower' WHERE `age` = 32";
  16. //用exec()执行sql语句,不能执行带有结果集的sql语句,返回受影响的行数
  17. $res = $pdo->exec($sql);
  18. if($res == 0){
  19. //返回一个SQLSTATE码
  20. var_dump($pdo->errorcode());
  21. echo '<br>';
  22. //返回错误信息数组
  23. var_dump($pdo->errorInfo());
  24. }
  25. //查询数据
  26. $sql_S = "SELECT * FROM `user` ";
  27. //执行SQL语句,返回结果集用query()
  28. $stmt = $pdo->query($sql_S);
  29. //遍历集合
  30. foreach($stmt as $key => $value){
  31. echo '<br>';
  32. var_dump($value['username']);
  33. }


五、PDO防SQL注入

1.使用问号参数占位符的SQL预处理语句

  1. //1.使用问号参数占位符的SQL预处理语句
  2. $sql = "SELECT * FROM `user` WHERE `username` = ? AND `password` = ?";
  3. //用prepare()来执行sql语句并返回一个statement对象
  4. $stmt = $pdo->prepare($sql);
  5. //创建变量
  6. $username = "admin";
  7. $password = "123456";
  8. /* $username = "admin";
  9. $password = "123456";
  10. 用bindParam()绑定一个参数到指定的变量
  11. $stmt->bindParam(1,$username);
  12. $stmt->bindParam(2,$password); */
  13. //用bindValue()绑定一个参数到指定的值
  14. $stmt->bindValue(1,'admin');
  15. $stmt->bindValue(2,'123456');
  16. //用execute()执行一条预处理语句
  17. $stmt->execute();
  18. //var_dump($stmt);
  19. //rowCount()返回受上一个sql语句影响的行数
  20. echo $stmt->rowCount();


2.使用命名占位符的SQL预处理语句

  1. //2.使用命名占位符的SQL预处理语句
  2. $sql = "SELECT * FROM `user` WHERE `username` =:username AND `password` =:password";
  3. //用prepare()来执行sql语句并返回一个statement对象
  4. $stmt = $pdo->prepare($sql);
  5. //创建变量
  6. /*$username = "admin";
  7. $password = "123456";
  8. 用bindParam()绑定一个参数到指定的变量
  9. $stmt->bindParam(":username",$username);
  10. $stmt->bindParam(":password",$password);*/
  11. //用bindValue()绑定一个参数到指定的值
  12. $stmt->bindValue(":username",'admin');
  13. $stmt->bindValue(":password",'123456');
  14. //用execute()执行一条预处理语句
  15. $stmt->execute();
  16. //var_dump($stmt);
  17. //rowCount()返回受上一个sql语句影响的行数
  18. echo $stmt->rowCount();


六、bingParam和bingValue的区别

  • 1.bingParm():绑定一个参数到变量;bindValue():绑定一个参数到值;

  • 2.bindParm()绑定的变量可以在execute()执行语句之前用引用传值;bindValue()的值绑定之后就不会在改变

七.用PDO遍历数据

  1. <?php
  2. //引入连接数据库的常量配置
  3. require "config.php";
  4. //连接数据库
  5. try{
  6. $pdo = new PDO(DB_DSN,DB_USER,DB_PWD);
  7. }catch(PDOException $e){
  8. echo $e->getMessage();
  9. }catch(Throwable $e){
  10. echo $e->getMessage();
  11. }
  12. //sql语句
  13. $sql = "SELECT * FROM `user`";
  14. //执行sql语句,用query()来执行,因为返回结果集
  15. $res = $pdo->query($sql);
  16. //把结果用关联数组来输出显示
  17. $res = $res->fetchAll(PDO::FETCH_ASSOC);
  18. ?>
  19. <!DOCTYPE html>
  20. <html lang="en">
  21. <head>
  22. <meta charset="UTF-8">
  23. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  24. <title>PDO遍历数据</title>
  25. <style>
  26. body{
  27. display: flex;
  28. justify-content: center;
  29. }
  30. </style>
  31. </head>
  32. <body>
  33. <table border="1px" cellspacing="0" cellpadding="10px">
  34. <tr>
  35. <td>id</td>
  36. <td>username</td>
  37. <td>password</td>
  38. <td>age</td>
  39. </tr>
  40. <?php foreach($res as $key => $value){ ?>
  41. <tr>
  42. <td><?php echo $value['id'] ?></td>
  43. <td><?php echo $value['username'] ?></td>
  44. <td><?php echo $value['password'] ?></td>
  45. <td><?php echo $value['age'] ?></td>
  46. </tr>
  47. <?php } ?>
  48. </table>
  49. </body>
  50. </html>


八、学习总结

    通过练习,发现PDO和MYSQLi好多知识都是一样的道理,只不过换了一种写法,不过PDO可以兼容更多的数据库类型,非常的强大

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议