<!--- 预处理(预编译) ---> <?php/* 防止 sql 注入的两种方式: 1. 人为提高代码的逻辑性,使其变得更严谨,滴水不漏。 比如说 增加判断条件,增加输入过滤等,但是智者千虑必有一失。(不推荐) 2. sql 语句的预处理*/ // 预处理: 就是在程序正式编译之前,事先处理,因为有些功能实现是一样的,只是发生了一些简单的值替换 /* ********** 预处理的原理: ********* insert into register_info values(?,?,?,?); 01. 创建 sql语句模板,并发送到数据库。预留的值使用参数 ? 标记 02. 数据库对模板解析,编译,对sql 语句模板执行查询优化,并存储结果不输出 03. 最多将绑定的参数传给之前 ? 标记的地方,模板执行语句。如果传的参数不一样,模板就可以多次使用。但是对模板的解析只需要做一次 ********** 预处理的优点 *********** 01. 预处理语句大大减少了分析时间,只做了一次增删改查(至于值被多次赋予,已经不需要数据库来操作) 02. 绑定参数减少了服务器带宽,你只需要发送查询或者增加的参数,而不是整个 sql 语句 03. 预处理语句能很好的防止 sql注入,因为参数的发送不会影响一开始对模板的解析,编译,模版又是自己定义的,根本不会有漏洞 */ // 面向对象 // 1. 连接数据库服务器,选择数据库 register$mysqli = new mysqli(‘localhost‘,‘root‘,‘‘,‘register‘); if ($mysqli){ echo ‘<h2><i>连接数据库成功</i></h2>‘; // 2. 设置字符集 $mysqli->set_charset(‘utf8‘); // 3. 预处理的核心代码(这部分代码数据库只执行一次) // a. 写sql语句模板 (register_info是已有的表) $sql = "insert into register_info(id,username,password,email,tel)VALUES (?,?,?,?,?)"; // b. prepare() 方法,预处理阶段 $stmt = $mysqli->prepare($sql); /*------------- 以下代码都是重复执行的,都是由 $stmt 对象操作 --------------*/ // a. 绑定参数 bind_param() // 给预留的 ? 赋值,要求类型和顺序要和 ? 所表示的一致 /* 格式占位符,格式列表: i ---> int 整型 s ---> string 字符串 d ---> double 双精度浮点型 b ---> blob(binary large object) 二进制大对象 */ $id = 2; $username = ‘王二‘; $password = ‘1237890‘; $email = ‘[email protected]‘; $tel = ‘12345678987‘; $stmt->bind_param(‘issss‘,$id,$username,$password,$email,$tel); // b. 开始插入 if ($stmt->execute()){ echo ‘<h2><i>插入成功</i></h2>‘; }else{ echo ‘<h2><i>插入失败</i></h2>‘; } // 4. 关闭预处理 $stmt->close(); // 5. 关闭数据库 $mysqli->close(); }else{ die(‘连接数据库失败!‘);}
时间: 2024-10-24 20:59:26