在PHP类中重用MySQL预处理语句

时间:2018-03-28 20:13:04

标签: php mysql oop mysqli

我有一个PHP类,它使用MySQLi预处理语句来加载这样的数据:

class MyClass {
    public $a, $bla;
    public load(&$mysqli) {
        $s = $mysqli->prepare('SELECT a FROM x WHERE y = ?');
        $s->bind_param('s', $this->bla);
        $s->bind_result($this->a);

        if($s->execute()) {
            if($s->fetch()) {
                $s->free_result();
            }
        }
    }
}

然而,这意味着对于我调用load()函数的MyClass的每个对象,我将准备一个新的语句,这似乎是低效的。

我重复使用准备好的陈述的想法是做这样的事情:

class MyClass {
    public $a, $bla;
    private static $my_s;

    public load(&$mysqli) {
        if(!self::$my_s) {
            self::$my_s = $mysqli->prepare('SELECT a FROM x WHERE y = ?');
        }

        $s = self::$my_s;
        $s->bind_param('s', $this->bla);
        $s->bind_result($this->a);

        if($s->execute()) {
            if($s->fetch()) {
                $s->free_result();
            }
        }
    }
}

因此将语句保存为静态成员变量。这样,我应该在第一次调用load()时准备语句,之后它将被同一个类的所有对象重用。

这是一种有效的方法吗?还有更好的方法吗?

0 个答案:

没有答案