2012-08-29 121 views
0

我幾乎肯定我的查詢正在被緩存。這是一個SELECT語句。PDO/MySQL/PHP - 問題與我的查詢結果被緩存

以下是一個示例情況。目前有2個掛單。我有一個腳本,在主頁上顯示掛單通知,通知倉庫是否有新訂單。我下了一個命令來測試「2」是否更新爲「3」,但沒有。我想我的查詢被緩存,因爲當我從phpMyAdmin運行查詢時,它顯示「3」,但是當通過PHP運行時,它只顯示「2」。任何想法如何解決這個問題或禁用特定查詢的緩存?

這裏是我的原代碼

<?php 
if(protectThis("1, 2")) : 
$pending = $conn->query("SELECT count(*) FROM orders WHERE `status` =0"); 
$pending2 = $pending->fetch(); 
$pendingcount = count($pending2); 
if ($pendingcount > 0) { 
?> 
<div class="orange warning"> 
    <p> 
     <strong>Pending Order Notification</strong> 
     <br />There are currently <strong><?php echo $pendingcount; ?></strong> pending orders. 
     <br /><a style="color:white;margin-top:10px;" class="btn btn-inverse" href="orders_pending.php"><i>Click here to view them.</i></a> 
    </p> 
    <div class="shadow-out"></div> 
</div> 
<?php 
} 
endif; 

我試着想禁用特定的查詢緩存讀了之後改變了查詢,並嘗試了以下

SELECT SQL_NO_CACHE count(*) FROM orders WHERE `status` =0 

顯然沒有奏效無論是。

我不知道該怎麼做。 :\

任何幫助,非常感謝。


「編輯1」

$pending = $conn->query("SELECT count(*) FROM orders WHERE `status` =0"); 
// $pending2 = $pending->fetch(); 
// $pendingcount = count($pending2); 
$pendingcount = $pending->rowCount(); 
if ($pendingcount > 0) { 

回答

3

我想你指望着走錯了路。嘗試var_dump($pending2)。我猜你會得到這樣的輸出:

array(2) { 
    [0]=> 
    int(3) 
    ["COUNT(*)"]=> 
    int(3) 
} 

$pending2是包含查詢返回的唯一行的一個數組,由兩列名和0索引列號索引的唯一列。任何單排結果集將如下所示,如果你是count它,它總是會輸出2

因此,不是這樣的:

$pendingcount = count($pending2); 

你應該使用這樣的:

$pendingcount = $pending2[0]; 
+0

太棒了。這工作。現在,有什麼辦法可以設置特定的查詢不被緩存?因爲我有另一個頁面顯示註冊用戶列表,並且我添加了一個用戶,直到1-2小時後他才從列表中出現,並且無數頁面刷新。 –

+0

['SQL_NO_CACHE'](http://dev.mysql.com/doc/refman/5.0/en/query-cache-in-select.html)應該像你使用的那樣工作。如果您仍然看到過時的數據,則可能是其他情況。也許一些PHP框架,或者你的瀏覽器? – bfavaretto

+0

由於某種原因,var_dump是一個字符串,而不是整數 –

2

如果你只是想的計數值,可以使用PDO::fetchColumn方法。

$pendingcount = $conn->query("SELECT count(*) FROM orders WHERE `status` =0") 
        ->fetchColumn();