MySQL中的预备语句是编写原始SQL代码以执行的替代方法。取而代之的是,在要使用变量的位置使用占位符(?)编写语句,然后将变量附加到这些占位符。
一条准备好的语句基本上是一个模板,可以与不同的变量一起重用。应该考虑准备好的语句的优点和缺点:
优点:
防止SQL注入而无需转义数据
允许您重复同一条语句而无需分析SQL的开销
允许您以数据包的形式发送原始二进制数据
通过将SQL逻辑与数据分离来创建易于阅读的代码
缺点:
一次查询速度较慢,因为它需要来自MySQL服务器的两个请求
仅限SELECT,INSERT,REPLACE,UPDATE,DELETE和CREATE TABLE查询
占位符只能用于值,不能用于表/列名
结论:我说准备好了声明仅凭安全优势而获胜
PHP通过MySQLi_STMT类使用PHP 5中的Mysqli(MySQL改进)扩展来支持MySQL准备的语句。一旦您习惯了与编写原始SQL语句的区别,它们就非常容易使用。本教程将说明如何使用准备好的语句。
插入资料
<?php
//创建Mysqli对象
$db = new mysqli('localhost','username','password','database');
现在,我们使用mysqli ::stmt_init()方法创建一个新的语句对象。
//创建语句对象
$stmt = $db-> stmt_init();
我们使用mysqli_stmt ::prepare()方法来准备一条语句。放一个?值应放在何处。
//创建一个准备好的语句
if($stmt-> prepare(“ INSERT INTO`table`(`name`,`age`,`bio`)VALUES(?,?,?)”)){
现在,这是我们在使用mysqli_stmt ::bind_param()方法选择要替换?的变量。第一个参数是由i(整数),d(双精度),s(字符串)和b(二进制数据)组成的字符串。每个字符对应于同一位置的变量。后面的任何参数都是要使用的变量。在这种情况下,我们使用“ sis”,因为$name是字符串,$age是整数,$bio是字符串。
//绑定变量以替换?s
$stmt-> bind_param('sis',$name,$age,$bio);
//设置变量
$name ='John D.';
$age = 31;
$bio ='未知...';
最后,我们使用变量的当前值执行语句。我们可以execute()循环运行mysqli_stmt ::方法,根据需要更改变量,以运行相同的语句。完成该语句后,请使用mysqli_stmt ::close()方法将其丢弃并释放资源。
//执行查询
$stmt-> execute();
//关闭语句对象
$stmt-> close();
}
取得资料
现在,我们将使用准备好的语句从数据库中获取数据。大部分过程是相同的,因此我只解释它们之间的差异。
//创建语句对象
$stmt = $db-> stmt_init();
//创建一个准备好的语句
if($stmt-> prepare(“ SELECT`name`,`bio` FROM`table` WHERE`age` =?”)){
//绑定变量以替换?
$stmt-> bind_param('i',$age);
//设置变量
$age = 32;
//执行查询
$stmt-> execute();
一旦准备并执行了语句,就需要接收数据。在这里,我们使用mysqli_stmt ::bind_result()方法来指定变量以存储每一列的数据。
//将结果列绑定到变量
$stmt-> bind_result($name,$bio);
现在,我们使用mysqli_stmt ::fetch()方法在while循环中获取每一行,该方法将填充一行结果数据的绑定变量。
//获取查询结果
while($stmt-> fetch()){
echo $name。'–'。$bio; // John Doe – Unknown…
}
//关闭语句对象
$stmt-> close();
}
?>
结论
这只是PHP中准备好的语句的基本概述。如果您有使用PHP的MySQL的经验,那么应该可以用准备好的语句替换常规查询。