我熟悉使用PHP来执行mySQL查询。但是,我一直使用reg exps来防止注入攻击。在SO上阅读了几个问题/答案后,我决定选择准备好的陈述。
有两种选择(如果还有更多,请告诉我):
我正在尝试理解链接页面上给出的代码示例。
对于 mysqli ,示例#1:
if ($stmt = $mysqli->prepare("SELECT District FROM City WHERE Name=?")) {
$stmt->bind_param("s", $city);
"s"
参数有什么作用?
如果我需要超过1个参数,我该怎么做?
对于 PDO ,示例#1:
$sth = $dbh->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
此处PDO::ATTR_CURSOR
和PDO::CURSOR_FWDONLY
的目的是什么?
你会推荐哪一个,mysqli或PDO?优点和缺点?
答案 0 :(得分:7)
s
表示$city
应为字符串
PDO::ATTR_CURSOR
部分是您传递给PDO的设置的名称。值PDO::CURSOR_FWDONLY
(这是默认值,因此您无需指定if)表示对PDOStatement::fetch()
进行的每次调用都会给出结果集中的下一行。替代选项是PDO::CURSOR_SCROLL
- 但除非您明确知道需要这个(并且您的数据库支持它),否则应将其保留为默认值。
答案 1 :(得分:2)
问题1
s参数将“:”绑定到$ city所具有的任何值。因此,如果您的sql为“SELECT District FROM City WHERE Name = s
”,则您执行的查询将为“SELECT District FROM City Where Name = $city
”。
要绑定更多参数,只需为每个参数调用bindParam即可。您还可以将数组传递给PDOStatement :: execute。
问题2
由于我使用了一些不同的数据库(mysql和sqllite),我更喜欢使用PDO。有关此主题的更多信息,请参阅mysqli or PDO - what are the pros and cons?。