PHP 预处理语句怎么用

很多做网站开发的人都听过“SQL注入”这个词,它就像网站的隐形漏洞——有人在网站的输入框里填了特殊字符,就能绕过程序验证,直接改你数据库里的内容,甚至把数据全部偷走。而解决这个问题最简单好用的工具,就是PHP的预处理语句。

什么是PHP预处理语句?

咱们先不说专业定义,举个生活化的例子:你去奶茶店点单,固定流程是“报口味+选冰度+选糖度”,而不是每次都重新写一份点单规则。预处理语句就像提前把点单流程定好,把要填的内容(比如口味)留空,等用户来的时候再填具体的内容——这个“留空的位置”就是占位符,填进去的内容会被程序自动“包裹”成安全格式,不会被当成可执行的代码,从根源上避开注入漏洞。

PHP 预处理语句怎么用

简单说,预处理就是把“操作规则”和“要填的数据”分开处理,规则提前编好,数据后续填,既高效又安全。

怎么用PHP预处理语句?用实例说清楚

我们用最常见的用户登录场景举例,比如要查询数据库里有没有对应的用户名和密码,原来的写法可能是拼接字符串:

`php

// 错误写法!容易被注入

$username = $_POST['username'];

$password = $_POST['password'];

$sql = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";

$result = mysqli_query($conn, $sql);

`

如果有人把用户名填成' OR 1=1 --,这句SQL就会变成SELECT * FROM users WHERE username = '' OR 1=1 --' AND password = 'xxx'——因为1=1永远成立,后面的内容被--注释掉,不管密码是什么,都能直接登录,这就是典型的注入漏洞。

用预处理的话,分三步就能搞定:

第一步,创建预处理规则,用?当占位符留空要填的数据:

`php

// 1. 准备预处理语句,?是占位符

$stmt = mysqli_prepare($conn, "SELECT * FROM users WHERE username = ? AND password = ?");

`

第二步,把用户输入的数据绑定到占位符上,程序会自动转义成安全内容:

`php

// 2. 绑定参数,第一个是数据类型(s=字符串,i=整数,d=小数,b=二进制),后面是对应变量

mysqli_stmt_bind_param($stmt, "ss", $username, $password);

`

第三步,执行预处理语句,拿结果:

`php

// 3. 执行并获取结果

mysqli_stmt_execute($stmt);

$result = mysqli_stmt_get_result($stmt);

`

这样就算有人填恶意用户名,' OR 1=1 --会被当成普通字符串,和数据库里的用户名完全匹配不上,从根源上阻止了注入。

预处理的额外好处

除了安全,预处理还能提升效率。比如你要批量插入100条用户数据,不用每次都重新写一遍SQL语句,只要提前准备好带占位符的规则,循环绑定不同的用户名和密码就行——相当于提前印好100份空白订单,每次填内容就能用,比重新写100份订单快很多。

很多新手容易忽略预处理,总觉得自己的网站没什么数据不会被攻击,但小网站也可能成为测试漏洞的目标。哪怕是简单的用户注册、留言提交,用预处理都能少很多安全隐患。只要记住“规则和数据分开”这个核心,用PHP的预处理就不会出错,比自己瞎琢磨的“防注入方法”靠谱多了。

上一篇 TypeScript ts-ignore 怎么用