我正在使用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版是一场噩梦,大量的注射,获得管理员帐户的访问权等等。
答案 0 :(得分:3)
+1这样的意图。这是一个非常令人尴尬的数字,但是只有千分之一的用户在这里询问有关PDO的问题,他们会想到像辅助函数这样的自然事物。
只是几个笔记。
最后,您的功能应该看起来像
function db_fetchAll($sql, $param = array()) {
global $db;
$stmt = $db->prepare($sql);
$stmt->execute($param);
return $stmt->fetchAll();
}
和总是返回行数组,顾名思义
对于具有不同结果集的其他函数,似乎PDO,如果稍微调整,可以提供完全相同的便利性,而根本没有任何辅助函数。您可以查看PDO wrapper I made to ease the pain of transition from old 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();
等等