批改状态:合格
老师批语:
PDO正常情况下是分三个文件,举例子而已,并不是三个(当然只是举例子,你可以分2个,或者1个,10个 ,二十个,但是只要对数据库操作,都将使用pdo)
1.数据库配置文件
2.PDO链接文件(既PDO的配置文件)
3.程序员后台处理MySQL数据的文件(一般是多个文件)
数据库配置文件就是用户配置的数据库链接的具体配置
代码示例:
<?php// $dsn = 'mysql:host=127.0.0.1;port=3306;dbname=phpxx';return [// 配置文件返回给使用文件一个数组// 三元运算符的简写法,类似判断,当前的意思是$name 用户没有填写的时候,就填写默认的root"username" => $username ?? 'root',"password" => $password ?? '123456',"host" => $host ?? '127.0.0.1',"tyle" => $tyle ?? 'mysql',"port" => $port ?? '3306',"dbname" => $dbname ?? 'phpxx',"charset" => $charset ?? 'utf8'];
上面是直接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());}异常消息的捕捉处理输出
示例代码:
try {$pdo = new PDO($dsn, $username, $password);// PDOException异常错误捕捉} catch (PDOException $e) {// getMessage()返回值:异常对象的消息字符串// echo $e->getMessage();// 也就是当try中的pdo出现问题的时候,用PDOException异常捕获,通过$e来访问getMessage()这个函数,返回的异常消息字符串// 用die来输出结果//把上面的echo换成die来输出操作内容,这个函数的意思就是输出函数内的内容后不再往后操作die('Connection error : ' . $e->getMessage());}
全部代码部分代码示例:
<?php// 引入配置文件 使用require引入$res = require __DIR__ . DIRECTORY_SEPARATOR . '1122database.php';// 当前与之前的递归函数不一样,返回的不是路径,因为我在文件中return了一个数组返回,索引返回的将是一个数组//数据库操作的增删改查操作//首先要链接数据库// 数据库的连接配置// 用户名$username = 'root';//密码$password = '123456';//端口// $port = '3306';// //数据库类型// $tyle = 'mysql';//上方已移动到1122database.php文件中// PDO操作// 使用pdo连接数据库需要先new一个PDO类//dsn 全称data source name 数据源名称 包括pdo驱动名称,主机名,端口号,数据库的名称,// 感觉$dsn的内容就是系统自带的常量 + 数据库名// $dsn = 'mysql:host=127.0.0.1;port=3306;dbname=phpxx';// 简化操作// $dsn = 'mysql:host=127.0.0.1;port=3306;dbname=phpxx';// new的PDO使用()并非使用[]或者{}来包裹// $pdo = new PDO($dsn, $username, $password);// var_dump($pdo);// 有时候内容需要捕捉他的错误操作,就放到try里面///////////////下面进行dsn拼接操作,通过上面进入的配置文件,重新配置dsn// sprintf()占位符的替换// $dsn = sprintf('%s:host=%s;port=%s;dbname=%s', $res['tyle'], $res['host'], $res['port'], $res['dbname']);// 第二次简化// 使用extract()// PHP extract() 函数从数组中把变量导入到当前的符号表中。// 对于数组中的每个元素,键名用于变量名,键值用于变量值。// 第二个参数 type 用于指定当某个变量已经存在,而数组中又有同名元素时,extract() 函数如何对待这样的冲突。// 简易上的意思就是,把值赋给了键名extract($res);$dsn = sprintf('%s:host=%s;port=%s;dbname=%s', $tyle, $host, $port, $dbname);try {$pdo = new PDO($dsn, $username, $password);// PDOException异常错误捕捉} catch (PDOException $e) {// getMessage()返回值:异常对象的消息字符串// echo $e->getMessage();// 也就是当try中的pdo出现问题的时候,用PDOException异常捕获,通过$e来访问getMessage()这个函数,返回的异常消息字符串// 用die来输出结果//把上面的echo换成die来输出操作内容,这个函数的意思就是输出函数内的内容后不再往后操作die('Connection error : ' . $e->getMessage());}// 上面是pdo的配置// 下面是PDO数据的增删改查// $read = $pdo->query('SELECT * FROM `user` LIMIT 0,3 ');// foreach ($read as $key => $value) {// echo $value['user'] . '<br>';// echo $value['id'] . '<br>';// echo $value['password'] . '<br>';// }// // 下面是对数据库存在的数据进行插入和更新// $readw = $pdo->query("SELECT * FROM user WHERE `user`='老王'");// // $a = $readw->fetch();// // var_dump($a);// // fetch返回一条数据// // fetchAll返回全部数据// if ($a = $readw->fetch()) {// echo "老王存在了,不要再插入了";// $time = date('Y-m-d H:i:s', time());// $pdo->exec("UPDATE user SET `time`='" . $time . "' WHERE `id`=" . $a['id']);// echo "<br>已帮您把老王的时间更新为当前时间咯";// } else {// $md = md5(123456);// $time = date('Y-m-d H:i:s', time());// $exec = $pdo->exec("INSERT INTO user (`user`,`password`,`time`) VALUES ('老王','$md','$time')");// var_dump($exec);// }
从上面第56行开始,是数组的增删改查操作,当数据库有这个用户时,更新用户的时间,当此用户不存在时,插入用户的信息
实例截图:
第三部分通过pdo对数据前后端进行处理
这里是举例子用户登录时的处理
通过前端发送过来的数据,连接PDO进行对数据的处理,确认用户的账号/密码非空验证正常,以及pdo的预处理防止恶意注入MySQL代码,
分为以下几步:
1.接收前端数据
2.变量定义一条mysql语句
3.使用$pdo->prepare(数据库语句)来预处理数据库语句并赋值给一个变量
4.通过$变量->bindParam(占位符位置,替换的变量)拿到变量来访问对象中的占位符,替换掉定义的mysql语句中的占位符,拿到预处理的语句进行对预处理的语句内占位符进行绑定。
5.通过$语句变量->execute()执行这条语句
6.用fetch或者fetchAll来接收一段数据或一组数据。
代码示例:
<?php//后端接收前端传过来的参数// 使用isset判断接收的数据存不存在,如果存在将$_POST['username']的值赋给变量$username$userName = isset($_POST['username']) ? $_POST['username'] : null;$passWord = isset($_POST['password']) ? $_POST['password'] : null;// var_dump($userName, $passWord);// 1.链接数据库// 使用require链接数据库require_once '1122shujukupdo.php';// var_dump($pdo);// 查询数据库表有没有这个用户// $stmt = $pdo->query("SELECT * FROM `user` WHERE `user`='{$userName}'");// 上面拿到了一条语句// $usern = $stmt->fetch();// var_dump($usern['password']);// $usern = $stmt->fetch();// echo "输出:{$usern['name']}";// die;$passw = md5($passWord);// var_dump($passw);// $login = $pdo->query("SELECT * FROM `user` WHERE `user`='{$userName}' AND `password`='{$passw}'");// 预处理语句 $pod->prepare();// die;$sql = "SELECT * FROM `user` WHERE `user`= ? AND `password`= ? ";// 准备一条mysql语句 用于prepare()预处理 准备要执行的语句,并返回语句对象// 使用$pod->prepare()来预处理一条语句$login = $pdo->prepare($sql);// PDOStatement::bindParam — 绑定一个参数到指定的变量名// 在php.net中示例都是进行与prepare()预处理语句同时使用// 下面对$pdo执行的语句$ycl绑定变量$login->bindParam(1, $userName); //1代表MySQL语句中的第一个?问号$login->bindParam(2, $passw); //2代表MySQL语句里面的第二个?问号// 执行这条语句//执行的预处理的那一段$login->execute();// 获取到表内所有的内容// 返回了一组数据$ress = $login->fetchAll(PDO::FETCH_ASSOC);// PDO::FETCH_ASSOC 将获取的结果集中每一行作为一个由列名索引的数组返回,如果结果集中包含多个名称相同的列,则 PDO::FETCH_ASSOC每个列名返回包含一个值的数组var_dump($ress);
最终的实例截图:
用户访问不成功:
用户访问成功:
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号