【发布时间】:2014-11-20 01:03:56
【问题描述】:
我有一个处理数据并将其存储在 MySQL 数据库中的 PHP 类。出于安全原因,我在保存数据时通过 PDO 使用准备好的语句,但由于类很大,这些准备好的语句是在对象生命周期内被调用数千次的不同函数中创建的(从一分钟到三十分钟)。
我想知道是否有任何原因我无法在类构造函数中准备语句并将句柄保存在成员变量中以避免语句被多次准备。
这有什么不可行的原因吗?我不明白为什么不这样做,但我以前从未见过这样做,这让我怀疑这样做是否出于某种原因是一种不好的做法。
I.E.像这样:
Class MyClass {
private stmt1;
function __construct($dbh) {
$this->stmt1 = $dbh->prepare('SELECT foo FROM bar WHERE foobar = :foobar');
}
private function doFoo() {
$this->stmt1->execute(...)
...
}
}
【问题讨论】:
-
$stmt1 = $dbh->prepare()不应该是$this->stmt1 = $dbh->prepare()吗?可能是准备好的语句不可用的原因。 -
@tradyblix 谢谢,错字!
-
啊,我以为就是这样!你有没有尝试添加一些
try-catch看看它说了什么?这个想法应该可行。只要处理程序存在并且函数能够访问保存处理程序的成员变量。 -
@tradyblix 我刚刚发布了该代码作为示例。我不是在寻求帮助以使其正常工作,而是想弄清楚我的建议是否出于某种原因是一种不好的做法(我以前从未见过这样做过)。
-
当然您可以将
stmt存储在一个类中,坏事可能是您将它们初始化在__construct中,并且在实例生命周期内您可能不需要stmt。所以对 stmts 使用延迟加载。