我有一个用于数据库管理的类,我的一个子类(定义查询的那个)是这样定义的(只是一个示例,实际上为了测试目的而剥离了许多其他功能):
namespace Tests\SQL\Arguments {
// SQL query
class Query {
public $attributes;
// constructor for this object
public function __construct() {
if ($arguments = func_get_args()) {
$this->attributes["query"] = current($arguments);
if (sizeof($arguments) > 1) {
$this->attributes["parameters"] = array_slice($arguments, 1, sizeof($arguments));
}
return $this;
}
}
}
$query = new Query("INSERT INTO `clients/history` (`date`,`client`,`ammount`,`status`) VALUES (?,?,?,?);", date("Y-m-d H:i:s"), 57, 17852.25, "A");
print_r($query);
}
如您所见,我自动获取函数参数,因此我可以在构建时轻松地将查询与其参数分开。除了批量INSERT/UPDATE/DELETE
操作之外,我还想提供一些安全性,比如防止 SQL 注入和其他事情。
我的问题是......给定这个结构,当我传递这个结构时(只是一个简单的例子,它将以不同的方式运行,但这个暂时有效):
$this->queries["clients/history"]->execute($this->attributes["query"], $this->attributes["parameters"]);
(:date,:client,:ammount,:status)
使用像这样的命名参数或使用像问号这样的参数会有什么不同(?,?,?,?)
吗?
编辑 - 更好的解释
对于我的问题提出的(明显的)晦涩难懂,我深表歉意。我的意图是有一个类似于 sprintf 的机制,但是,我不是存储包含所有参数的字符串,而是以单独的方式存储查询和参数。
这只是 Query 类。还有 QueryGroup 类(用于将查询存储在组中)、Manager 类(存储和管理所有数据库连接)和 Connection 类(负责将给定数据库连接的所有查询和查询组放在一起。
关于命名参数,我认为我使用的方法没有问题,就像我说的那样,就像sprintf
函数一样。我将在查询字符串中提供问号或参数名称。
我想进行分离以提供额外的过滤功能,例如转义或引用参数,以防止对给定数据库进行某些形式的注入或破坏。
execute()
我公开的方法只是 PDOexecute()
方法的纸质副本。我试图确定的是使用命名参数或问号参数是否同样“安全”(或者可能存在一些我没有看到的差异)。
任何提示将不胜感激:)