PDO准备语句功能

ICJ*_*ICJ 6 php pdo

我正在使用PDO预处理语句,在处理我当前的项目时,我决定为我需要的每个动作创建几个函数.下面是fetch的示例

function db_fetchAll($sql, $param) {
    global $db;

    $stmt = $db->prepare($sql);

    if (empty($param)) {
        $stmt->execute();
    } else {
        $stmt->execute($param);
    }

    $count = $stmt->rowCount();

    if ($count == 0) {
        $result = "";
    } elseif ($count == 1) {
        $result[] = $stmt->fetch();
    } elseif ($count > 1) {
        $result = $stmt->fetchAll();
    }

    return $result;
}
Run Code Online (Sandbox Code Playgroud)

$database = db_fetchAll("SELECT * FROM database_table WHERE id=:id", array(':id' => $id));
Run Code Online (Sandbox Code Playgroud)

它只会将查询的行从3行压缩为1,但是每个页面所需的信息量值得缩小.

我将通过该项目返回最后一次通过,我只想对此安全性发表第二意见.如果有任何我应该添加的内容,等等.所有user_input都通过此函数传递

function user_input($input) {
    $input = trim($input);  
    $output = strip_tags($input);

    return $output;
}
Run Code Online (Sandbox Code Playgroud)

并且所有输出都使用htmlspecialchars.

简而言之,问题是:这样安全吗?还有什么我可以做的,以防止任何其他形式的注射等?

我完全理解准备好的陈述如何运作,我只是彻底,这个网站的第1版是一场噩梦,大量的注射,获得管理员帐户的访问权限等.

You*_*nse 3

对于这样的意图+1。这是一个相当令人尴尬的数字,但在这里提出有关 PDO 问题的用户中只有千分之一曾经想到过像辅助函数这样自然的东西。

只是一些注释。

  • 首先,您的代码存在一个本质缺陷,即尝试自动检测结果类型。我亲自尝试过,我可以向你保证这只是灾难的根源。代码中的魔力越少,你的头发就越多。因此,不要使用这种不可靠的魔法,只需使用不同的函数返回不同的结果集即可。
  • 其次,你必须为参数设置默认值吗?能够在没有占位符的情况下运行查询。
  • 第三,有些代码是多余的。无需检查 $param 变量。

最后,你的函数应该看起来像

function db_fetchAll($sql, $param = array()) {
    global $db;

    $stmt = $db->prepare($sql);
    $stmt->execute($param);
    return $stmt->fetchAll();
}
Run Code Online (Sandbox Code Playgroud)

始终返回行数组,顾名思义

与具有不同结果集的其他函数一样,PDO 似乎只要稍微调整一下,就可以提供完全相同的便利性,而无需任何辅助函数。你可以看看我制作的 PDO 包装器,以减轻从旧 mysql ext 过渡的痛苦

您的代码将几乎保持不变

$data = DB::query("SELECT * FROM database_table")->fetchAll();
Run Code Online (Sandbox Code Playgroud)

但它可以让您使用 PDO 不同结果集方法的所有功能:

$row = DB::prepare("SELECT * FROM table WHERE id=?")->execute([$id])->fetch();
Run Code Online (Sandbox Code Playgroud)

甚至

$sql  = "SELECT name FROM table WHERE id=?";
$name = DB::prepare($sql)->execute([$id])->fetchColumn();
Run Code Online (Sandbox Code Playgroud)

等等