Correcting teacher:天蓬老师
Correction status:qualified
Teacher's comments:预处理的普及, sql注入已成为历史,除非有内鬼
<?php
// 检测mysqli扩展是否加载成功
// 1.phpinfo();
// 2.var_dump(get_loaded_extensions());
// 3.function_exists('mysqli_connect');
// 1.连接数据库
$ms = new mysqli('localhost', 'root', 'root', 'user');
// 判断是否有错误
// $ms->connect_errno返回最近一次函数调用所产生的的错误代码
// $ms->connect_error返回最近一次错误代码的描述,是字符串类型
if ($ms->connect_errno) {
die("CONNECT_ERRNO:" . $ms->connect_error);
}
// 获取客户端信息
echo $ms->client_info, '<br>';
// 获取服务端信息
echo $ms->server_info;
// 2.$ms->set_charset()设置默认的客户端字符集
$ms->set_charset('utf-8');
// 3.sql查询
// 查询user库中的apple表
$sql = "SELECT * FORM 'apple'";
// 更新数据
$sql1 = "UPDATE apple SET username='小花',sex='女' WHERE username='小明'";
// 执行sql语句
// mysqli_query()成功执行SELECT, SHOW, DECRIBE, EXPLAIN查询会返回一个mysqli_result对象
// 其他查询成功返回true, 失败返回flase
$res1 = $ms->query($sql1);
var_dump($res1);
// 插入数据
$sql2 = "INSERT INTO apple(`username`,`password`,`sex`) VALUES('小美',sha1('333333'),'女')";
$res2= $ms->query($sql2);
var_dump($res2);
// $ms->insert_id获取最近一次执行sql语句所产生的id值
if ($res2) {
echo '恭喜注册成功,您是本站第' . $ms->insert_id . '用户';
}
// 更新数据
$sq3 = "UPDATE apple SET username='小夏',sex='女' WHERE username='小小'";
$res = $ms->query($sql3);
// $ms->affected_rows:返回上次执行sql语句后数据表中受影响的行数
if ($res3) {
echo $ms->affected_rows . '行记录受影响';
}
// 删除数据
$sql4 = "DELETE FROM `apple` WHERE `id`>=6 ";
$res4 = $ms->query($sql4);
// 查看受影响行数
if ($res4) {
echo $ms->affected_rows . '行记录受影响';
}
// 关闭数据库的连接
$ms->close();
<?php
$sql = "SELECT `username`,`password` FROM `apple`";
// 执行SELECT,SHOW,DESCRIBE,EXPLAIN会返回一个mysql_result对象
$res = $ms->query($sql);
// 调用mysql_result对象中的方法获取成员属性
// mysql_result::fetch_all--抓取所有的结果行并以关联数组或索引数组或两者都用返回结果集
// fetch_all()默认返回索引数组,参数(MYSQLI_ASSOC)返回关联数组,参数(MYSQLI_BOTH)返回关联和索引两种并用数组
echo "<pre>" . print_r($res->fetch_all(MYSQLI_ASSOC), true) . "</pre>";
<?php
// mysqli_stmt类的对象可以定义和执行参数化的SQL命令,即sql语句的预处理机制
// 使用'?'参数占位符构成sql语句的预处理机制
$sql = "INSERT INTO `apple` (`username`,`password`,`sex`) VALUES(?,?,?)";
// 使用prepare()执行sql语句后会返回一个statement对象
$stmt = $ms->prepare($sql);
// var_dump($stmt);
// bind_param():绑定变量参数到prepared语句中
// 第一个参数指定要绑定的数据类型s:字符串类型 i:整数类型 d:浮点型
$username = '小黄';
$password = sha1('444444');
$sex = '男';
$stmt->bind_param('sss', $username, $password, $sex);
// 执行prepared预处理语句没有参数,成功返回true失败返回flase
$res = $stmt->execute();
var_dump($res);
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>登录</title>
<link type='text/css' rel='stylesheet' href='/php/0714/0714.css'>
</head>
<body>
<h2>用户登录</h2>
<form action="zhuru.php" method="post">
<div class=item>
<div class=name>
用户名:<input type='text' name='username' placeholder='请输入用户名'></div>
<div class=psd>密   码:<input type='password' name='password' placeholder='请输入密码'></div>
<div class=sub><input type='submit' name='sub'></div>
</div>
</form>
</body>
</html>
<?php
$username = $_POST['username'];
$password = sha1($_POST['password']);
// echo $username . '<br>' . $password;
// die;
// 连接数据库
$ms = new mysqli('localhost', 'root', 'root', 'user');
// 判断是否连接成功
if ($ms->connect_error) {
die("CONNECT_ERROR:" . $ms->connect_errno);
}
// 设置字符集
$ms->set_charset('utf-8');
// 查询数据库
$sql = "SELECT * FROM `apple` WHERE `username`='{$username}' AND `password`='{$password}'";
// 执行sql语句
$res = $ms->query($sql);
print_r($res->fetch_all());
// 不用预处理机制容易sql注入
// 预处理语句
$sql = "SELECT * FROM `apple` WHERE `username`=? AND `password`=?";
// 使用prepare执行sql语句返回statement的对象
$stmt = $ms->prepare($sql);
// 使用statement对象方法绑定变量
$stmt->bind_param('ss', $username, $password);
// 使用execute()再次执行sql语句成功返回true,失败返回flase
$stmt->execute();
$res = $stmt->get_result();
print_r($res->fetch_all());
不用预处理语句(用户名输入’ or 1=1 #就能获取数据库中的内容)
使用预处理语句后可较好的防止sql注入
1.了解MySQLi的连接方法和数据的增,删,查,改
2.result类中的方法和statement类中还有很多方法,需要了解和尝试