gpt4 book ai didi

php - PDO 准备语句函数

转载 作者:可可西里 更新时间:2023-11-01 13:26:19 26 4
gpt4 key购买 nike

我正在使用 PDO 准备语句,在处理我当前的项目时,我决定只为我需要的每个操作创建几个函数。下面是获取的例子

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。

所以简而言之,问题是:这样安全吗?我还能做些什么来防止任何其他形式的注入(inject)等吗?

我完全理解准备好的语句是如何工作的,我只是说得很透彻,这个网站的第 1 版是一场噩梦,大量的注入(inject),获得对管理员帐户的访问权限,等等。

最佳答案

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

只是一些注意事项。

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

最后,你的函数应该是这样的

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 的所有 poser 不同的结果集方法:

$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();

等等

关于php - PDO 准备语句函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23957134/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com