PDO预处理语句函数


PDO Prepared Statement Function

我正在使用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;
}

例子
$database = db_fetchAll("SELECT * FROM database_table WHERE id=:id", array(':id' => $id));

它只将查询行从3行压缩到1行,但由于每页所需的信息量,它值得压缩。

我正在对这个项目进行最后一次检查,我只是想要一个关于这个安全性的第二意见。如果有什么需要补充的,等等。所有user_input都通过这个函数

传递
function user_input($input) {
    $input = trim($input);  
    $output = strip_tags($input);
    return $output;
}

和所有输出使用htmlspecialchars。

所以这个问题简单来说就是:这安全吗?我还能做些什么来防止其他形式的注射等?

我完全理解准备好的语句是如何工作的,我只是彻底,这个网站的版本1是一个噩梦,大量的注射,获得访问管理帐户等

+1表示此意图。这是一个相当尴尬的数字,但在这里,只有千分之一的用户在询问有关PDO的问题时,会想到像辅助函数这样自然的东西。

只是一些注释。

  • 首先,你的代码有一个本质缺陷,它试图自动检测结果类型。我自己也试过,我可以向你保证,这只是灾难的根源。代码中的魔力越少,你头上的头发就越多。因此,与其使用这种不可靠的魔法,不如使用不同的函数来返回不同的结果集。
  • 其次,您必须为参数设置默认值?可以运行不带占位符的查询。
  • 第三,有些代码是多余的。没有必要检查$param变量
最后,你的函数应该看起来像
function db_fetchAll($sql, $param = array()) {
    global $db;
    $stmt = $db->prepare($sql);
    $stmt->execute($param);
    return $stmt->fetchAll();
}

总是返回行数组,正如其名

对于具有不同结果集的其他函数,如果稍微调整一下,PDO似乎可以提供完全相同的便利,而根本不需要任何辅助函数。你可以看看我做的PDO包装器,以减轻从旧mysql ext

转换的痛苦。

你的代码将保持几乎相同的

$data = DB::query("SELECT * FROM database_table")->fetchAll();

,但它会让你使用PDO不同的结果集方法的所有功能:

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

甚至

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

等等