Correcting teacher:PHPz
Correction status:qualified
Teacher's comments:
作业内容:1. 请实例演绎pdo在用户登录环节是怎么防sql注入的? 2. 写一个小实战, 实现预处理与会话跟踪?
登录函数代码
function login($username,$password)
{
global $pdo;
$flag=false;
if( !empty($username) && !empty($password))
{
//可以把它看作是想要运行的SQL的一种编译过的模板
//使用问号参数占位符来构成预处理语句
$sql="SELECT `uname`,`pwd` FROM `user` WHERE `uname`=?
AND `pwd`=?";
//PDO::prepare-准备要执行的语句,并返回语句对象
$stmt=$pdo->prepare($sql);
//绑定一个PHP变量到用作预处理的SQL语句中的对应问号占位符
// $stmt->bindParam(1,$username,PDO::PARAM_STR);
//$stmt->bindParam(2,$password,PDO::PARAM_STR);
//执行一条预处理语句 成功时返回true,或者在失败时返回false
$stmt->execute([$username,$password]);
$res = $stmt->fetch();
if($res)
{
$_SESSION['uname'] = $res['uname'];
$flag=true;
}
// foreach($stmt as $v)
// {
// print_r($v);
// }
// die;
return $flag;
}
}
<?php
//公共模型文件
session_start();//开启seesion
require '1-connect.php';
/**
* 检测用户注册用户名是否被占用
* param:用户名
* return : 被占用返回true未被占用返回false
*/
function checkUname($username)
{
global $pdo;
$isOccupied=false;//默认数据库不存在同名用户名
$sql="SELECT `uname` FROM `user` WHERE `uname`='{$username}'";
$res=$pdo->query($sql)->fetch();
//已存在同名昵称
if($res)
{
$isOccupied=true;
}
return $isOccupied;
}
/**
*
* param:用户名注册 用户名 密码 性别 创建时间
* return : 注册成功返回true 失败返回false
*/
function insertData($username, $password, $gender, $create_time)
{
global $pdo;
$flag=false;
if( !empty($username) && !empty($password) && !empty($gender))
{
$sql="INSERT INTO `user` SET `uname`='{$username}',`pwd`='{$password}',
`gender`={$gender},`create_time`={$create_time};";
$res=$pdo->exec($sql);
if($res)
{
$flag=true;
}
}
return $flag;
}
/**
* param:用户登录 用户名 密码
* return:登录成功返回true 失败返回false
*/
function login($username,$password)
{
global $pdo;
$flag=false;
if( !empty($username) && !empty($password))
{
//可以把它看作是想要运行的SQL的一种编译过的模板
//使用问号参数占位符来构成预处理语句
$sql="SELECT `uname`,`pwd` FROM `user` WHERE `uname`=?
AND `pwd`=?";
//PDO::prepare-准备要执行的语句,并返回语句对象
$stmt=$pdo->prepare($sql);
//绑定一个PHP变量到用作预处理的SQL语句中的对应问号占位符
// $stmt->bindParam(1,$username,PDO::PARAM_STR);
//$stmt->bindParam(2,$password,PDO::PARAM_STR);
//执行一条预处理语句 成功时返回true,或者在失败时返回false
$stmt->execute([$username,$password]);
$res = $stmt->fetch();
if($res)
{
$_SESSION['uname'] = $res['uname'];
$flag=true;
}
// foreach($stmt as $v)
// {
// print_r($v);
// }
// die;
return $flag;
}
}
<?session_start()?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=欢迎, initial-scale=1.0">
<title>Document</title>
</head>
<body>
欢迎<?=$_SESSION['uname']?>,来到php中文网后台
</body>
</html>
效果将admin用户名带过去