正如评论中所要求的,这里是使用 PDO 的参数化查询的示例。
$sql=new PDO("mysql:host=127.0.0.1;dbname=name","user","password");
$query="Select * from Northwind where Id=:ID";
$stmt=$sql->prepare($query);
$stmt->bindParam(':ID',$random_Id);
$stmt->execute();
$dr=$stmt->fetch();
$sql=null;
让我们逐行回顾一下。
$sql=new PDO("mysql:host=127.0.0.1;dbname=name","user","password");
$sql 成为一个新的 PDO 对象(pdo 可以支持多种类型的数据库(在本例中我们使用 MYSQL)。
$query="Select * from Northwind where Id=:ID;
请注意,我们不是提供 Northwind 表中的实际 ID,而是提供“:ID”。
$stmt=$sql->prepare($query);
有趣的部分来了。准备语句将我们的查询字符串发送到 SQL Server。此时,服务器知道我们将运行的 sql 命令,但还不知道变量的值。
$stmt->bindParam(':ID',$random_Id);
然后,bindParam 发送 $random_Id 的值来替换 ':ID'。
$stmt->execute();
$dr=$stmt->fetch();
然后执行我们的查询,并将结果放入 $dr 中。您可以像哈希表一样从 $dr 中获取数据。假设 Northwind 表如下所示:
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| Id | int | NO | PRI | NULL | |
| Name | varchar(10) | NO | UNI | NULL | |
| Passwd | varchar(50) | NO | | NULL | |
| Salt | varchar(50) | NO | UNI | NULL | |
+--------+-------------+------+-----+---------+-------+
我们想要“Name”的值。我们会输入这样的内容:
$userName=$dr['Name'];
$sql=null;
该行破坏 PDO 对象,将其从内存中释放并关闭数据库连接。
以这种方式执行 SQL 有两个优点。首先是速度。如果您需要运行上面的查询,我不知道使用 6 个不同的 ID 运行 6 次,您可以在准备语句之后执行类似的操作:
for($i=0;$i<=6;$i++)
{
$stmt->bindParam(':ID',$i);
$stmt->execute;
}
服务器已经有了主查询,所以我们只需向其发送更改的内容。如果我们这样做来插入许多记录,它会比将整个查询放入循环中要快得多。
第二个好处是它使 SQL 注入变得不可能(这是我使用它的主要原因)。