PHP:使用预准备语句进行注入保护

我熟悉使用PHP来执行mySQL查询。 但是,我一直在使用reg exps来防止注入攻击。 在阅读了关于SO的几个问题/答案之后,我决定选择准备好的陈述。

有两个选项可用(让我知道如果有更多):

  • mysqli准备好的语句
  • PDO准备staments
  • 问题1

    我想了解链接页面上给出的代码示例。

    对于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_CURSORPDO::CURSOR_FWDONLY的目的是什么?

    问题2

    哪一个,mysqli或PDO,你会推荐? 优点和缺点?


    问题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或PDO - 有哪些优缺点?


    s表明$city预计将是一个字符串

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

    链接地址: http://www.djcxy.com/p/93775.html

    上一篇: PHP: Injection protection using prepared statements

    下一篇: PDO Prepared Statement and SQL LIKE multiple values