首页博客网络编程
更快地执行任务的方法之一是使用 PHP 准备语句。它们是用于发送查询或将数据上传到 SQL 数据库的模板。我们将讨论这些预准备语句以及 PHP 数据对象 (PHP PDO),它们提供了一个轻量级接口,专为访问数据库而设计。
使用 PDO 或 MySQLi,预准备语句提供了额外的安全层,因为值与查询分开发送到服务器。因此,组合的两个部分不会同时受到影响。
PHP 预准备语句对 SQL 注入非常有用,并减少了解析时间。
预设参数通过仅发送特定值而不是整个查询来减少所需的带宽。
PHP PDO和MySQLi都支持预准备语句。
PHP 预准备语句分两个明确的阶段工作:
准备:创建SQL语句模板并发送到数据库服务器进行解析。服务器完成此过程后,将检查语法、执行查询优化并存储语句。
执行:稍后,您将参数值发送到服务器,服务器将获取它存储的模板。然后,服务器使用它收到的值创建一个语句。之后,执行该语句。
当使用PHP准备语句时,无论你选择通过MySQLi扩展还是PHP PDO连接到数据库都不会有太大的区别。这两种连接类型都支持预准备语句,尽管编写脚本的方式存在一些差异。
请看下面的例子。请注意,它使用绑定参数和 PHP 准备语句向 MySQLi 发送查询:
例复制
<?php $host = 'host'; $user = 'user'; $pass = 'pass'; $db = 'db'; // Create connection $conn = new mysqli($host, $user, $pass, $db); // Check connection if ($conn->connect_error) { die("Failed to connect: " . $conn->connect_error); } // bind and prepare $stmt = $conn->prepare("INSERT INTO users (name, surname, email) VALUES (?, ?, ?)"); $stmt->bind_param("sss", $name, $surname, $email); // set parameters and execute $name = "John"; $surname = "Doe"; $email = "john@example.com"; $stmt->execute(); $name = "Mary"; $surname = "Moe"; $email = "mary@example.com"; $stmt->execute(); $name = "Julie"; $surname = "Dooley"; $email = "julie@example.com"; $stmt->execute(); echo "Uploaded."; $stmt->close(); $conn->close();?>
让我们仔细看看上面示例中的这一特定行:
"INSERT INTO users (name, surname, email) VALUES (?, ?, ?)"
此语句中的问号 () 表示我们要上传的变量。?
接下来,让我们看看函数:bind_param()
$stmt->bind_param("sss", $name, $surname, $email);
上面的函数将我们要使用的参数绑定到我们要发送的查询中,并通知数据库有关它们的信息。
该部件指定可以分配给参数的数据类型。sss
s
旨在定义特定参数只不过是一个字符串。
有四种可能的参数类型,每种都可以用一个特定的字母表示:
整数 (i)
双 (d)
字符串 (s)
斑点 (b)
为每个参数指定参数,因为确定数据库应预期的数据类型可将 SQL 注入的风险降至最低。
注意:如果我们想插入来自外部来源的任何数据(如用户输入),那么对数据进行清理和验证至关重要。
下面的示例显示了如何为 PHP PDO 准备语句编写脚本:
例复制
<?php $host = 'host'; $user = 'user'; $pass = 'pass'; $db = 'db'; try { $conn = new PDO("mysql:host=$host;dbname=$db", $user, $pass); // set error mode to exception $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); //bind parameters and prepare sql $stmt = $conn->prepare("INSERT INTO users (name, surname, email) VALUES (:name, :surname, :email)"); $stmt->bindParam(':name', $name); $stmt->bindParam(':surname', $surname); $stmt->bindParam(':email', $email); // insert a row $name = "John"; $surname = "Doe"; $email = "john@example.com"; $stmt->execute(); // insert another row $name = "Mary"; $surname = "Moe"; $email = "mary@example.com"; $stmt->execute(); // insert another row $name = "Julie"; $surname = "Dooley"; $email = "julie@example.com"; $stmt->execute(); echo "New records created successfully"; } catch(PDOException $e) { echo "Error: " . $e->getMessage(); } $conn = null; ?>
MySQLi 扩展和 PDO 都支持预处理语句。
此功能可降低应用程序对 SQL 注入的敏感度,并加快分析速度。
提前设置参数时,使用的带宽更少:您无需发送整个查询(剩下的就是指定值)。
声明提示:若要转载请务必保留原文链接,申明来源,谢谢合作!
广告位
广告位