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);
最终的实例截图:
用户访问不成功:
用户访问成功: