一、用PDO连接mysql
- 什么是PDO
PHP数据对象
统一了 PHP 访问各种类型数据库的访问方式(mysql、Oracle等)
MySqli对象只能访问mysql数据库。 - 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
<?php
/*
* PDO连接数据库文件
* 参数:$DB_type 数据库类型名,默认为mysql
* 参数:$host 数据库服务器名,默认为localhost
* 参数:$port 数据库数据库服务器端口,默认为'3308'
* 参数:$username 数据库服务器用户名,默认为'root'
* 参数:$password 数据库服务器密码,默认为''
* 参数:$dbname 数据库名,默认为 'php'
* 参数:$charset 字符集,默认为 ''utf8mb4'
* 以上变量在引入文件处可设置值
* 连接错误请注意检查是否有与参数重名的变量
*/
$DB_config = [
'DB_type' => $DB_type ?? 'mysql', // 连接数据库类型名
'host' => $host ?? 'localhost', // 数据库服务器名
'port' => $port ?? '3308', // 数据库数据库服务器端口
'username' => $username ?? 'root', // 数据库服务器用户名
'password' => $password ?? '', // 数据库服务器密码
'dbname' => $dbname ?? 'php', // 数据库名
'charset' => $charset ?? 'utf8mb4' // 字符集
];
// 1. 用extract()函数将数组转为变量,即数组索引为变量名
extract($DB_config);
// 2. 连接数据库
// 用sprintf格式化字符串,用占位符代入变量
$dsn = sprintf('%s:host=%s;port=%s;charset=%s;dbname=%s', $DB_type, $host, $port, $charset, $dbname);
// 创建pdo,进行错误识别
try {
$pdo = new PDO($dsn, $username, $password);
var_dump($pdo);
} catch (PDOException $err) {
//PDOException异常类,指定变量$err为异常类型变量;
die('错误:' . $err->getMessage());
}
二、用预处理语句实现用户登录时防sql注入
登录页面login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>登录</title></title>
<style>
.login{
width: 200px;
margin: 10% auto;
}
p{
text-align: center;
}
input{
width: 90%;
text-align: center;
}
</style>
</head>
<body>
<div class="login">
<form id="form">
<p><input type="text" name="user" id="user" placeholder="用户名"></p>
<p><input type="password" name="password" id="password" placeholder="密码"></p>
<p><input type="button" value="登录" class="btn" onclick="login()"></p>
</form>
</div>
<script>
async function login(){
let user=document.forms.form.user.value
let password=document.forms.form.password.value
const response=await fetch('./test_user.php',{
method:'POST',
headers:{
"Content-type":"application/x-www-form-urlencoded;charset=utf-8",
},
body:`user=${user}&password=${password}`,
})
}
</script>
</body>
</html>
验证用户test_user.php
<?php
// 接收前端传来的参数
$user = isset($_POST['user']) ? $_POST['user'] : '';
$pass = isset($_POST['password']) ? sha1($_POST['password']) : '';
// 连接数据库,返回$pdo变量,即PDO对象
require_once __DIR__ . DIRECTORY_SEPARATOR . 'pdo' . DIRECTORY_SEPARATOR . 'conn.php';
// 使用预处理语句可防止sql注入
// 准备一条预处理sql语句,?号为点位符
$sql = 'SELECT * FROM `user` WHERE `name`=? AND `pass`=?';
// 准备Sql语句
$stmt = $pdo->prepare($sql);
// 绑定占位符,指定变量
$stmt->bindParam(1, $user);
$stmt->bindParam(2, $pass);
// 执行准备的sql语句
$stmt->execute();
// 取得查询结果
$res = $stmt->fetchAll(PDO::FETCH_ASSOC);
var_dump($res);