扩展PDO Execute()来计算页面上的查询


Extend PDO Execute() to Count Queries on Page

好吧,类似的问题以前也有人问过,也有人回答过。但是,我也想计算准备好的查询。我认为我可以只使用prepare()函数来增加查询计数,但这为我提供了一些可疑的结果。现在,它告诉我正在执行10个查询…通常我只使用准备好的语句,除非数据是静态的或者无论如何都不能修改。

我从另一个问题中找到了与此相同的代码。只不过代码只对使用query()和exec()函数执行的查询进行计数。我试图修改它,但正如我之前所说的,它不计算任何准备好的查询,但查询仍然执行并返回结果…

class PDOEx extends PDO
{
    private $queryCount = 0;
    public function query($query)
    {
        ++$this->queryCount;
        return parent::query($query);
    }
    public function exec($statement)
    {
        ++$this->queryCount;
        return parent::exec($statement);
    }
    public function execute($args = null)
    {
        ++$this->queryCount;
        if (!is_array($args)) {
            $args = func_get_args();
        }
        return parent::execute($args);
    }
    public function GetCount()
    {
        return $this->queryCount;
    }
}

我只想提前说声谢谢。请,如果你能指出我在正确的方向,这将是非常感激,谢谢!

不计算准备好的查询的原因是它返回一个PDOStatement,这与PDO不同。您可以只询问数据库在给定会话上运行了多少查询,因此只要您不创建新的'PDO对象,那么结果将是正确的。请记住,即使查询也被视为查询,所以如果您想要排除它,则从值中减去1。

代码
$db = new 'PDO('mysql:host=127.0.0.1;dbname=sandbox', 'localuser', 'password');
$db->query('SELECT * FROM user WHERE id = 5');
$db->query('UPDATE user SET name = 'Demo' WHERE id = 5');
$db->query('DELETE FROM user WHERE id = 5');
echo $db->query('SHOW SESSION STATUS LIKE "Questions"')->fetchColumn(1);

输出
4