【问题标题】:prepared parameterized query with PDO使用 PDO 准备参数化查询
【发布时间】:2010-11-20 21:57:16
【问题描述】:

这种在 PHP 和 MySql 驱动的基于 Web 的应用程序中处理 SQL 的新安全方式的新方法,以保护代码免受 SQL 注入。我打算开始使用带有 PDO 的 mysqli。任何人都可以请概述我应该如何开始和继续。

对任何文章的任何引用也会有所帮助。

提前致谢。

【问题讨论】:

    标签: php pdo mysqli


    【解决方案1】:

    创建连接

    try {
        $db = new PDO("mysql:dbname=".DB_NAME.";host=".DB_HOST,DB_USER,DB_PWD);
    } catch (PDOException $e) {
        die("Database Connection Failed: " . $e->getMessage());
    }
    

    然后准备一份声明

    $prep = $db->prepare("SELECT * FROM `users` WHERE userid = ':id'");
    

    如您所见,您可以通过在任何字符串前面加上“:”来标记您想要的每个参数。然后你所做的就是在执行时传递一个数组,将参数 (:id) 映射到值。

    if (!$prep->execute(array(":id" => $userinput))) {
       $error = $prep->errorInfo();
       echo "Error: {$error[2]}"; // element 2 has the string text of the error
    } else {
       while ($row = $prep->fetch(PDO::FETCH_ASSOC)) { // check the documentation for the other options here
            // do stuff, $row is an associative array, the keys are the field names
       }
    }
    

    除了具有“获取”功能的 PDO::FETCH_ASSOC 之外,还有其他各种获取数据的方法。您可以使用 fetchAll 一次获取所有结果的数组,而不是逐行获取。或者您可以将信息数组作为 0 索引数组获取,或者您甚至可以将结果直接获取到类实例中(如果字段名称与类的属性对齐。)

    所有 PDO 的文档都可以在这里找到:PHP.net PDO Manual

    【讨论】:

    • 我相信你不需要引号包围占位符:"SELECT * FROM `users` WHERE userid = :id"
    猜你喜欢
    • 2012-06-02
    • 2015-12-08
    • 2012-10-13
    • 1970-01-01
    • 2017-11-28
    • 2013-06-15
    • 1970-01-01
    • 2010-12-19
    • 1970-01-01
    相关资源
    最近更新 更多