PHP:使用准备好的语句的注入保护

PHP:使用准备好的语句的注入保护,php,pdo,mysqli,prepared-statement,Php,Pdo,Mysqli,Prepared Statement,我熟悉使用PHP执行mySQL查询。然而,我一直在使用reg EXP作为防止注入攻击的保护。在阅读了这里的几个问题/答案之后,我决定选择准备好的陈述 有两种选择,如果有更多,请告诉我: 问题1 我试图理解链接页面上给出的代码示例 对于mysqli,示例1: if ($stmt = $mysqli->prepare("SELECT District FROM City WHERE Name=?")) { $stmt->bind_param("s", $city); $sth

我熟悉使用PHP执行mySQL查询。然而,我一直在使用reg EXP作为防止注入攻击的保护。在阅读了这里的几个问题/答案之后,我决定选择准备好的陈述

有两种选择,如果有更多,请告诉我:

问题1 我试图理解链接页面上给出的代码示例

对于mysqli,示例1:

if ($stmt = $mysqli->prepare("SELECT District FROM City WHERE Name=?")) {
    $stmt->bind_param("s", $city);
$sth = $dbh->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
s参数的作用是什么? 如果我需要一个以上的参数,我该怎么做

对于PDO,示例1:

if ($stmt = $mysqli->prepare("SELECT District FROM City WHERE Name=?")) {
    $stmt->bind_param("s", $city);
$sth = $dbh->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
PDO::ATTR_CURSOR和PDO::CURSOR_FWDONLY的用途是什么

问题2 你会推荐哪一个,mysqli还是PDO?利弊?

问题1

s参数绑定到$city的任何值。因此,如果sql是SELECT District FROM City WHERE Name=s,则执行的查询将是SELECT District FROM City WHERE Name=$City

要绑定更多参数,只需调用每个参数。您还可以将数组传递给PDOStatement::execute

问题2

因为我使用一些不同的数据库mysql和sqllite,所以我更喜欢使用PDO。有关此主题的更多信息,请参阅问题1

s参数绑定到$city的任何值。因此,如果sql是SELECT District FROM City WHERE Name=s,则执行的查询将是SELECT District FROM City WHERE Name=$City

要绑定更多参数,只需调用每个参数。您还可以将数组传递给PDOStatement::execute

问题2

因为我使用一些不同的数据库mysql和sqllite,所以我更喜欢使用PDO。有关此主题的更多信息,请参阅。

s表示$city应为字符串

PDO::ATTR_游标部分是传递给PDO的设置的名称。值PDO::CURSOR_FWDONLY是默认值,因此您不需要指定这是否意味着您对PDOStatement::fetch所做的每个调用都将获得结果集中的下一行。另一个选项是PDO::CURSOR_SCROLL,但除非您明确知道您需要它并且您的数据库支持它,否则您应该将其保留为默认值。

s表示$city应该是一个字符串

PDO::ATTR_游标部分是传递给PDO的设置的名称。值PDO::CURSOR_FWDONLY是默认值,因此您不需要指定这是否意味着您对PDOStatement::fetch所做的每个调用都将获得结果集中的下一行。另一种选择是PDO::CURSOR_SCROLL,但除非您明确知道您需要它并且您的数据库支持它,否则您应该将其保留为默认值