欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

PDO数据库的链接,PDO防mysql数据库预处理机制。以及使用pdo对数据库的增删改查操作

程序员文章站 2022-04-05 12:59:42
...

PDO正常情况下是分三个文件,举例子而已,并不是三个(当然只是举例子,你可以分2个,或者1个,10个 ,二十个,但是只要对数据库操作,都将使用pdo)
1.数据库配置文件
2.PDO链接文件(既PDO的配置文件)
3.程序员后台处理MySQL数据的文件(一般是多个文件)
数据库配置文件就是用户配置的数据库链接的具体配置
代码示例:

  1. <?php
  2. // $dsn = 'mysql:host=127.0.0.1;port=3306;dbname=phpxx';
  3. return [
  4. // 配置文件返回给使用文件一个数组
  5. // 三元运算符的简写法,类似判断,当前的意思是$name 用户没有填写的时候,就填写默认的root
  6. "username" => $username ?? 'root',
  7. "password" => $password ?? '123456',
  8. "host" => $host ?? '127.0.0.1',
  9. "tyle" => $tyle ?? 'mysql',
  10. "port" => $port ?? '3306',
  11. "dbname" => $dbname ?? 'phpxx',
  12. "charset" => $charset ?? 'utf8'
  13. ];

上面是直接return一个数组出去,当有人访问这个文件时,直接return一个数组出去,让访问者接收
第二部分配置pdo:
下面是PDO的配置连接数据库文件
代码有点乱,有两行没注释,其实可以注释,因为已经引入了配置文件,并使用配置文件里面的username
在最下方做了一个增删改查的操作,判断有无此用户,有此用户,就更新用户的时间,没此用户,就添加此用户,
其中导入配置文件使用require '配置的文件'
extract(接收的数组赋值化); 就是数组的值就赋值给了数组的键,这时的键名就是变量名,。具体看下面的第70行代码,
在没有用extract()函数之前是使用的sprintf()占位符进行对接收的数组值替换到占位符中,来格式化dsn的操作,使用了extract()之后,直接使用数组返回过来的键,因为这时的键已经是一个赋值后的变量,并不是一个键。
数据库用pdo对象来查询数据库中的数据时,拿到的是一条数据,或者是一组数据,这时数据是打印不出来的,要么使用forech来遍历这个数据数组,要么用fetch()来接收这个数组,以数组的方式来访问这个或组数据,具体看下面的第64-80行代码。注意,你如果打印fetch()他的值,要么是ture要么是fales访问的方式只有forech数组形式遍历方式访问,或者让fetch()/fetchAll()以数组的方式访问。
其中配置文件中还用到了try{pdo连接处理}catch(PDOException $e){echo $e->getMessage();die('Connection error : ' . $e->getMessage());}异常消息的捕捉处理输出
示例代码:

  1. try {
  2. $pdo = new PDO($dsn, $username, $password);
  3. // PDOException异常错误捕捉
  4. } catch (PDOException $e) {
  5. // getMessage()返回值:异常对象的消息字符串
  6. // echo $e->getMessage();
  7. // 也就是当try中的pdo出现问题的时候,用PDOException异常捕获,通过$e来访问getMessage()这个函数,返回的异常消息字符串
  8. // 用die来输出结果
  9. //把上面的echo换成die来输出操作内容,这个函数的意思就是输出函数内的内容后不再往后操作
  10. die('Connection error : ' . $e->getMessage());
  11. }

全部代码部分代码示例:

  1. <?php
  2. // 引入配置文件 使用require引入
  3. $res = require __DIR__ . DIRECTORY_SEPARATOR . '1122database.php';
  4. // 当前与之前的递归函数不一样,返回的不是路径,因为我在文件中return了一个数组返回,索引返回的将是一个数组
  5. //数据库操作的增删改查操作
  6. //首先要链接数据库
  7. // 数据库的连接配置
  8. // 用户名
  9. $username = 'root';
  10. //密码
  11. $password = '123456';
  12. //端口
  13. // $port = '3306';
  14. // //数据库类型
  15. // $tyle = 'mysql';
  16. //上方已移动到1122database.php文件中
  17. // PDO操作
  18. // 使用pdo连接数据库需要先new一个PDO类
  19. //dsn 全称data source name 数据源名称 包括pdo驱动名称,主机名,端口号,数据库的名称,
  20. // 感觉$dsn的内容就是系统自带的常量 + 数据库名
  21. // $dsn = 'mysql:host=127.0.0.1;port=3306;dbname=phpxx';
  22. // 简化操作
  23. // $dsn = 'mysql:host=127.0.0.1;port=3306;dbname=phpxx';
  24. // new的PDO使用()并非使用[]或者{}来包裹
  25. // $pdo = new PDO($dsn, $username, $password);
  26. // var_dump($pdo);
  27. // 有时候内容需要捕捉他的错误操作,就放到try里面
  28. ///////////////下面进行dsn拼接操作,通过上面进入的配置文件,重新配置dsn
  29. // sprintf()占位符的替换
  30. // $dsn = sprintf('%s:host=%s;port=%s;dbname=%s', $res['tyle'], $res['host'], $res['port'], $res['dbname']);
  31. // 第二次简化
  32. // 使用extract()
  33. // PHP extract() 函数从数组中把变量导入到当前的符号表中。
  34. // 对于数组中的每个元素,键名用于变量名,键值用于变量值。
  35. // 第二个参数 type 用于指定当某个变量已经存在,而数组中又有同名元素时,extract() 函数如何对待这样的冲突。
  36. // 简易上的意思就是,把值赋给了键名
  37. extract($res);
  38. $dsn = sprintf('%s:host=%s;port=%s;dbname=%s', $tyle, $host, $port, $dbname);
  39. try {
  40. $pdo = new PDO($dsn, $username, $password);
  41. // PDOException异常错误捕捉
  42. } catch (PDOException $e) {
  43. // getMessage()返回值:异常对象的消息字符串
  44. // echo $e->getMessage();
  45. // 也就是当try中的pdo出现问题的时候,用PDOException异常捕获,通过$e来访问getMessage()这个函数,返回的异常消息字符串
  46. // 用die来输出结果
  47. //把上面的echo换成die来输出操作内容,这个函数的意思就是输出函数内的内容后不再往后操作
  48. die('Connection error : ' . $e->getMessage());
  49. }
  50. // 上面是pdo的配置
  51. // 下面是PDO数据的增删改查
  52. // $read = $pdo->query('SELECT * FROM `user` LIMIT 0,3 ');
  53. // foreach ($read as $key => $value) {
  54. // echo $value['user'] . '<br>';
  55. // echo $value['id'] . '<br>';
  56. // echo $value['password'] . '<br>';
  57. // }
  58. // // 下面是对数据库存在的数据进行插入和更新
  59. // $readw = $pdo->query("SELECT * FROM user WHERE `user`='老王'");
  60. // // $a = $readw->fetch();
  61. // // var_dump($a);
  62. // // fetch返回一条数据
  63. // // fetchAll返回全部数据
  64. // if ($a = $readw->fetch()) {
  65. // echo "老王存在了,不要再插入了";
  66. // $time = date('Y-m-d H:i:s', time());
  67. // $pdo->exec("UPDATE user SET `time`='" . $time . "' WHERE `id`=" . $a['id']);
  68. // echo "<br>已帮您把老王的时间更新为当前时间咯";
  69. // } else {
  70. // $md = md5(123456);
  71. // $time = date('Y-m-d H:i:s', time());
  72. // $exec = $pdo->exec("INSERT INTO user (`user`,`password`,`time`) VALUES ('老王','$md','$time')");
  73. // var_dump($exec);
  74. // }

从上面第56行开始,是数组的增删改查操作,当数据库有这个用户时,更新用户的时间,当此用户不存在时,插入用户的信息
实例截图:

PDO数据库的链接,PDO防mysql数据库预处理机制。以及使用pdo对数据库的增删改查操作

第三部分通过pdo对数据前后端进行处理
这里是举例子用户登录时的处理
通过前端发送过来的数据,连接PDO进行对数据的处理,确认用户的账号/密码非空验证正常,以及pdo的预处理防止恶意注入MySQL代码,
分为以下几步:
1.接收前端数据
2.变量定义一条mysql语句
3.使用$pdo->prepare(数据库语句)来预处理数据库语句并赋值给一个变量
4.通过$变量->bindParam(占位符位置,替换的变量)拿到变量来访问对象中的占位符,替换掉定义的mysql语句中的占位符,拿到预处理的语句进行对预处理的语句内占位符进行绑定。
5.通过$语句变量->execute()执行这条语句
6.用fetch或者fetchAll来接收一段数据或一组数据。
代码示例:

  1. <?php
  2. //后端接收前端传过来的参数
  3. // 使用isset判断接收的数据存不存在,如果存在将$_POST['username']的值赋给变量$username
  4. $userName = isset($_POST['username']) ? $_POST['username'] : null;
  5. $passWord = isset($_POST['password']) ? $_POST['password'] : null;
  6. // var_dump($userName, $passWord);
  7. // 1.链接数据库
  8. // 使用require链接数据库
  9. require_once '1122shujukupdo.php';
  10. // var_dump($pdo);
  11. // 查询数据库表有没有这个用户
  12. // $stmt = $pdo->query("SELECT * FROM `user` WHERE `user`='{$userName}'");
  13. // 上面拿到了一条语句
  14. // $usern = $stmt->fetch();
  15. // var_dump($usern['password']);
  16. // $usern = $stmt->fetch();
  17. // echo "输出:{$usern['name']}";
  18. // die;
  19. $passw = md5($passWord);
  20. // var_dump($passw);
  21. // $login = $pdo->query("SELECT * FROM `user` WHERE `user`='{$userName}' AND `password`='{$passw}'");
  22. // 预处理语句 $pod->prepare();
  23. // die;
  24. $sql = "SELECT * FROM `user` WHERE `user`= ? AND `password`= ? ";
  25. // 准备一条mysql语句 用于prepare()预处理 准备要执行的语句,并返回语句对象
  26. // 使用$pod->prepare()来预处理一条语句
  27. $login = $pdo->prepare($sql);
  28. // PDOStatement::bindParam — 绑定一个参数到指定的变量名
  29. // 在php.net中示例都是进行与prepare()预处理语句同时使用
  30. // 下面对$pdo执行的语句$ycl绑定变量
  31. $login->bindParam(1, $userName); //1代表MySQL语句中的第一个?问号
  32. $login->bindParam(2, $passw); //2代表MySQL语句里面的第二个?问号
  33. // 执行这条语句//执行的预处理的那一段
  34. $login->execute();
  35. // 获取到表内所有的内容
  36. // 返回了一组数据
  37. $ress = $login->fetchAll(PDO::FETCH_ASSOC);
  38. // PDO::FETCH_ASSOC 将获取的结果集中每一行作为一个由列名索引的数组返回,如果结果集中包含多个名称相同的列,则 PDO::FETCH_ASSOC每个列名返回包含一个值的数组
  39. var_dump($ress);

最终的实例截图:
用户访问不成功:

PDO数据库的链接,PDO防mysql数据库预处理机制。以及使用pdo对数据库的增删改查操作
用户访问成功:
PDO数据库的链接,PDO防mysql数据库预处理机制。以及使用pdo对数据库的增删改查操作