博客列表 >用PDO连接mysql,用预处理语句实现用户登录时防sql注入小结

用PDO连接mysql,用预处理语句实现用户登录时防sql注入小结

cool442
cool442原创
2022年04月03日 20:49:25529浏览

一、用PDO连接mysql

  1. 什么是PDO
    PHP数据对象
    统一了 PHP 访问各种类型数据库的访问方式(mysql、Oracle等)
    MySqli对象只能访问mysql数据库。
  2. PDO连接数据库
    创建PDO对象:
    $PDO=new PDO($dsn, $username, $password);
    2.1 $dsn:数据源,命名惯例为:PDO驱动程序的名称,后面为一个冒号,再后面是可选的驱动程序连接数据库变量信息,如主机名、端口和数据库名,变量信息有:
    — host:服务器名
    — port:数据库端口
    — dbname:数据库名
    — charset:字符集
    例:
    $dsn='mysql:host=localhost,port=3308,dbname=userDB';

2.2 $username:用户名
2.3 $password:密码

例:conn.php

  1. <?php
  2. /*
  3. * PDO连接数据库文件
  4. * 参数:$DB_type 数据库类型名,默认为mysql
  5. * 参数:$host 数据库服务器名,默认为localhost
  6. * 参数:$port 数据库数据库服务器端口,默认为'3308'
  7. * 参数:$username 数据库服务器用户名,默认为'root'
  8. * 参数:$password 数据库服务器密码,默认为''
  9. * 参数:$dbname 数据库名,默认为 'php'
  10. * 参数:$charset 字符集,默认为 ''utf8mb4'
  11. * 以上变量在引入文件处可设置值
  12. * 连接错误请注意检查是否有与参数重名的变量
  13. */
  14. $DB_config = [
  15. 'DB_type' => $DB_type ?? 'mysql', // 连接数据库类型名
  16. 'host' => $host ?? 'localhost', // 数据库服务器名
  17. 'port' => $port ?? '3308', // 数据库数据库服务器端口
  18. 'username' => $username ?? 'root', // 数据库服务器用户名
  19. 'password' => $password ?? '', // 数据库服务器密码
  20. 'dbname' => $dbname ?? 'php', // 数据库名
  21. 'charset' => $charset ?? 'utf8mb4' // 字符集
  22. ];
  23. // 1. 用extract()函数将数组转为变量,即数组索引为变量名
  24. extract($DB_config);
  25. // 2. 连接数据库
  26. // 用sprintf格式化字符串,用占位符代入变量
  27. $dsn = sprintf('%s:host=%s;port=%s;charset=%s;dbname=%s', $DB_type, $host, $port, $charset, $dbname);
  28. // 创建pdo,进行错误识别
  29. try {
  30. $pdo = new PDO($dsn, $username, $password);
  31. var_dump($pdo);
  32. } catch (PDOException $err) {
  33. //PDOException异常类,指定变量$err为异常类型变量;
  34. die('错误:' . $err->getMessage());
  35. }

二、用预处理语句实现用户登录时防sql注入

登录页面login.html

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>登录</title></title>
  8. <style>
  9. .login{
  10. width: 200px;
  11. margin: 10% auto;
  12. }
  13. p{
  14. text-align: center;
  15. }
  16. input{
  17. width: 90%;
  18. text-align: center;
  19. }
  20. </style>
  21. </head>
  22. <body>
  23. <div class="login">
  24. <form id="form">
  25. <p><input type="text" name="user" id="user" placeholder="用户名"></p>
  26. <p><input type="password" name="password" id="password" placeholder="密码"></p>
  27. <p><input type="button" value="登录" class="btn" onclick="login()"></p>
  28. </form>
  29. </div>
  30. <script>
  31. async function login(){
  32. let user=document.forms.form.user.value
  33. let password=document.forms.form.password.value
  34. const response=await fetch('./test_user.php',{
  35. method:'POST',
  36. headers:{
  37. "Content-type":"application/x-www-form-urlencoded;charset=utf-8",
  38. },
  39. body:`user=${user}&password=${password}`,
  40. })
  41. }
  42. </script>
  43. </body>
  44. </html>

验证用户test_user.php

  1. <?php
  2. // 接收前端传来的参数
  3. $user = isset($_POST['user']) ? $_POST['user'] : '';
  4. $pass = isset($_POST['password']) ? sha1($_POST['password']) : '';
  5. // 连接数据库,返回$pdo变量,即PDO对象
  6. require_once __DIR__ . DIRECTORY_SEPARATOR . 'pdo' . DIRECTORY_SEPARATOR . 'conn.php';
  7. // 使用预处理语句可防止sql注入
  8. // 准备一条预处理sql语句,?号为点位符
  9. $sql = 'SELECT * FROM `user` WHERE `name`=? AND `pass`=?';
  10. // 准备Sql语句
  11. $stmt = $pdo->prepare($sql);
  12. // 绑定占位符,指定变量
  13. $stmt->bindParam(1, $user);
  14. $stmt->bindParam(2, $pass);
  15. // 执行准备的sql语句
  16. $stmt->execute();
  17. // 取得查询结果
  18. $res = $stmt->fetchAll(PDO::FETCH_ASSOC);
  19. var_dump($res);
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议