准备好的语句句柄可以存储在成员变量中吗?

Nat*_*ate 4 php mysql pdo

我有一个PHP类来处理数据并将其存储在MySQL数据库中.我在保存数据时出于安全原因通过PDO使用预准备语句,但由于类很大,这些预处理语句是在对象生命周期内被调用数千次的不同函数内创建的(从1分钟到30分钟).

我想知道的是,如果有任何原因我无法在类构造函数中准备语句并将句柄保存在成员变量中以避免语句被多次准备.

有什么理由不行吗?我不明白为什么不这样做,但我以前从未见过它,这让我想知道出于某种原因这样做是不是很糟糕.


IE是这样的:

Class MyClass {

    private stmt1;

    function __construct($dbh) {
        $this->stmt1 = $dbh->prepare('SELECT foo FROM bar WHERE foobar = :foobar');
    }

    private function doFoo() {
        $this->stmt1->execute(...)
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

Lev*_*son 8

我在保存数据时出于安全原因通过PDO使用预准备语句,但由于类很大,这些预处理语句是在对象生命周期内被调用数千次的不同函数内创建的(从1分钟到30分钟).

每当我看到赏金问题时,我总会问自己,"他们甚至在解决正确的问题吗?" 在这个对象的生命周期中,用不同的参数执行相同的查询数千次真的是最好的方法吗?

  • 如果您正在执行多个SELECTs,那么可能更好的查询一次获取更多信息会更好.
  • 如果您正在进行多次操作,INSERT那么批量插入可能会更好地为您服务.

如果在评估上述选项之后,您决定在对象的生命周期内仍需要数千次调用这些语句,那么可以缓存预准备语句的结果:

  1. 测量当前性能.
  2. 关闭模拟准备.
  3. 衡量绩效影响.
  4. 使用称为memoization延迟加载的技术来缓存准备但仅在实际使用时准备查询.
  5. 再次测量性能影响.

这样您就可以看到您更改的每件作品的影响.我怀疑,如果你真的称呼这些查询数千次,那么这些变化中的部分或全部将对你有帮助,但你必须在测量之前和之后进行测量才能知道.