2015-06-02 23 views
2

好的,類似的問題已被問及之前回答。不過,我也想計算準備好的查詢。我想我可以使用prepare()函數來增加查詢計數,但是這給我提供了一些可疑的結果。現在,它告訴我正在執行10個查詢......通常我只使用預準備語句,除非數據是靜態的或無法修改。擴展PDO執行()來對頁面上的查詢計數

我從另一個與此相同的問題中找到了此代碼。除了代碼只計算使用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; 
    } 
} 

我只想說,在此先感謝。請,如果你能指出我正確的方向,將非常感謝,謝謝!

回答

1

準備好的查詢不被計數的原因是因爲它返回的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 
+0

我試圖延伸PDOStatement對象(其被提供了作爲一個建議),並且具有在那裏執行用於所製備的查詢。我無法得到它的工作。我如何使這個類中的queryCount參數與上面發佈的類相同? 'class db_statement extends PDOStatement { \t protected $ pdo; \t保護功能__construct($ pdo) \t { \t \t $ this-> pdo = $ pdo; \t} \t \t公共職能執行(的$ args = NULL) \t { \t \t //增加計數器。 ++ $ this-> queryCount; \t \t \t \t如果(is_array($參數)!){ \t \t \t的$ args = func_get_args(); \t \t} \t \t return parent :: execute($ args); \t} }' 或者這不起作用? – Tyler

+0

你將不得不做很多課程重寫,我上面的答案完全不需要重寫課程。你無法使用上面提供的代碼嗎? – Augwa

+0

是的,謝謝。我撤回了所有的班級覆蓋,並回到這個。這樣做似乎更清潔,更容易......再次感謝您! – Tyler