当前位置: 首页> 最新文章列表> 零基础入门:如何通过 mysqli_stmt::__construct 创建预处理语句

零基础入门:如何通过 mysqli_stmt::__construct 创建预处理语句

gitbox 2025-09-16

1. 什么是预处理语句?

预处理语句是一种 SQL 查询的执行方式。它将 SQL 查询分为两个部分:

  • 预处理阶段:发送 SQL 语句的模板给数据库,数据库解析并编译这个 SQL 语句,但不执行查询。这时,查询中的变量部分(例如用户输入的内容)不会立即插入到 SQL 中,而是以占位符(通常是 ?)表示。

  • 执行阶段:在执行时,通过绑定实际的参数值来替代占位符,再由数据库执行该语句。

这种方法的好处在于,数据库能够预先准备查询,并且对每个查询的参数进行安全的验证,从而避免了 SQL 注入的风险。


2. 使用 mysqli_stmt::__construct 创建预处理语句

在 PHP 中,我们通过 mysqli 扩展来操作 MySQL 数据库,而 mysqli_stmt::__constructmysqli_stmt 类的一个构造函数,用于创建一个预处理语句。

步骤概述:

  1. 建立数据库连接:首先需要使用 mysqli_connectnew mysqli() 创建数据库连接。

  2. 准备 SQL 语句:定义带有占位符的 SQL 语句。

  3. 初始化预处理语句:使用 mysqli_preparemysqli_stmt::__construct 创建预处理语句。

  4. 绑定参数:使用 bind_param 方法将变量值绑定到预处理语句中的占位符。

  5. 执行语句:使用 execute 方法执行预处理语句。


3. 示例代码

假设我们要向一个用户表插入用户数据,包含姓名、电子邮件和年龄,我们使用 mysqli_stmt::__construct 来创建一个预处理语句。以下是具体的代码示例:

<span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-comment">// 1. 创建数据库连接</span></span><span>
</span><span><span class="hljs-variable">$servername</span></span><span> = </span><span><span class="hljs-string">"localhost"</span></span><span>;
</span><span><span class="hljs-variable">$username</span></span><span> = </span><span><span class="hljs-string">"root"</span></span><span>;
</span><span><span class="hljs-variable">$password</span></span><span> = </span><span><span class="hljs-string">""</span></span><span>;
</span><span><span class="hljs-variable">$dbname</span></span><span> = </span><span><span class="hljs-string">"test"</span></span><span>;

</span><span><span class="hljs-variable">$conn</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">mysqli</span></span><span>(</span><span><span class="hljs-variable">$servername</span></span><span>, </span><span><span class="hljs-variable">$username</span></span><span>, </span><span><span class="hljs-variable">$password</span></span><span>, </span><span><span class="hljs-variable">$dbname</span></span><span>);

</span><span><span class="hljs-comment">// 检查连接</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$conn</span></span><span>-&gt;connect_error) {
    </span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"Connection failed: "</span></span><span> . </span><span><span class="hljs-variable">$conn</span></span><span>-&gt;connect_error);
}

</span><span><span class="hljs-comment">// 2. 定义带占位符的 SQL 语句</span></span><span>
</span><span><span class="hljs-variable">$sql</span></span><span> = </span><span><span class="hljs-string">"INSERT INTO users (name, email, age) VALUES (?, ?, ?)"</span></span><span>;

</span><span><span class="hljs-comment">// 3. 创建预处理语句</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$conn</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-variable">$sql</span></span><span>);

</span><span><span class="hljs-comment">// 检查预处理是否成功</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$stmt</span></span><span> === </span><span><span class="hljs-literal">false</span></span><span>) {
    </span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">'Error preparing statement: '</span></span><span> . </span><span><span class="hljs-variable">$conn</span></span><span>-&gt;error);
}

</span><span><span class="hljs-comment">// 4. 绑定参数</span></span><span>
</span><span><span class="hljs-variable">$name</span></span><span> = </span><span><span class="hljs-string">"John Doe"</span></span><span>;
</span><span><span class="hljs-variable">$email</span></span><span> = </span><span><span class="hljs-string">"[email protected]"</span></span><span>;
</span><span><span class="hljs-variable">$age</span></span><span> = </span><span><span class="hljs-number">25</span></span><span>;

</span><span><span class="hljs-comment">// "sss" 表示绑定的变量类型,分别对应字符串、字符串、整数</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">bind_param</span></span><span>(</span><span><span class="hljs-string">"ssi"</span></span><span>, </span><span><span class="hljs-variable">$name</span></span><span>, </span><span><span class="hljs-variable">$email</span></span><span>, </span><span><span class="hljs-variable">$age</span></span><span>);

</span><span><span class="hljs-comment">// 5. 执行预处理语句</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">execute</span></span><span>()) {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"New record created successfully"</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Error: "</span></span><span> . </span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;error;
}

</span><span><span class="hljs-comment">// 关闭语句和连接</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">close</span></span><span>();
</span><span><span class="hljs-variable">$conn</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">close</span></span><span>();
</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>

4. 解析代码

  • 创建数据库连接:使用 new mysqli() 方法连接数据库,如果连接失败,程序会停止并显示错误信息。

  • SQL 语句:定义一个带有占位符的 SQL 语句 INSERT INTO users (name, email, age) VALUES (?, ?, ?)。这里的 ? 是占位符,表示我们将通过后续步骤动态插入数据。

  • 准备语句:通过 $conn->prepare($sql) 方法创建一个预处理语句。如果创建失败,会输出错误信息。

  • 绑定参数$stmt->bind_param("ssi", $name, $email, $age) 方法将变量 $name$email$age 绑定到 SQL 语句中的 ? 占位符。"ssi" 表示参数的数据类型,s 是字符串(string),i 是整数(integer)。

  • 执行语句:通过 $stmt->execute() 执行预处理语句。如果执行成功,会返回成功信息,否则输出错误。

  • 关闭资源:执行完毕后,需要关闭预处理语句和数据库连接,释放资源。


5. 预处理语句的优势

  • 防止 SQL 注入:通过使用占位符而非直接拼接 SQL 语句,能够有效防止恶意用户通过输入特殊字符进行 SQL 注入攻击。

  • 提高性能:如果你要多次执行相同的查询(例如批量插入数据),使用预处理语句比每次都重新解析 SQL 语句要高效得多。

  • 代码更清晰:使用预处理语句可以使代码结构更清晰,尤其是在涉及用户输入和多次查询时,能够减少 SQL 拼接错误的机会。