我已经完成了我的研究,并决定在我的查询中使用准备好的语句,我只是问是否有任何我应该知道的事情,关于切换到正常的mysqli查询以准备好语句的好坏。在正常的mysqli语句中使用预处理语句的优点?
此外,我不明白如何不需要转义坏字符的需要?
我已经完成了我的研究,并决定在我的查询中使用准备好的语句,我只是问是否有任何我应该知道的事情,关于切换到正常的mysqli查询以准备好语句的好坏。在正常的mysqli语句中使用预处理语句的优点?
此外,我不明白如何不需要转义坏字符的需要?
转义坏字符仍然需要,但是库会自动为您绑定的所有参数自动执行。它只是稍微方便一些,并且可以防止程序员忘记清理值。
但是,请注意,此自动功能仅限于参数!
下面的查询是安全的,因为bind_param()
采取逃避的护理:
$code = $_GET["code"];
$name= $_GET["name"];
$percentage= $_GET["percentage"];
$stmt = $mysqli->prepare("INSERT INTO items VALUES (?, ?, ?)");
$stmt->bind_param('iss', code, $name, $percentage);
$stmt->execute();
下面的查询是不安全,因为什么,你直接放到查询将不会自动转义:
$tablename = $_GET["prefix"]."_items";
$code = $_GET["code"];
$name= $_GET["name"];
$percentage= $_GET["percentage"];
---- UNSAFE! ----
$stmt = $mysqli->prepare("INSERT INTO `$tablename` VALUES (?, ?, ?)");
$stmt->bind_param('iss', $code, $name, $percentage);
$stmt->execute();
表示,不应该使用如本例中所示的动态表名称。但是问题是:即使参数化查询也要小心!
我能想到的唯一不足就是你不能再看到最后的查询来进行调试(因为它只在服务器端进行组装)。
至少有两个优点:
我总是有问题要问你的第二点 - >准备一次,多次执行的PHP文件相同的执行被限制或也适用于未来的执行 – 2016-03-30 05:49:42
?
未命名,或:name
命名)插入的值自动引用。大多数人会混淆准备好的语句和占位符。
使用占位符的一般想法非常棒,而预准备语句只是功能有限的占位符的子集。
占位符是伟大的,因为:
至于大家都在谈论的性能问题,大部分时间准备语句比普通查询慢。然而,在这两种情况下,这种差异都是不明显的。
按说逃逸仍然需要人品不好,我假定你的意思任何不会自动执行的字符? – Basic 2011-04-14 11:21:28
@基本否,对于作为参数添加的常规数据,不需要任何额外的转义。图书馆将照顾一切。什么参数化查询*不能*处理是动态表和列名,但人们通常不应该使用那些摆在首位 – 2011-04-14 11:23:45
@Pekka웃是能够制备表名? – 2014-03-19 21:13:07