批改状态:合格
老师批语:预处理的普及, 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类中还有很多方法,需要了解和尝试
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号