2013-12-21 123 views
-1

我想將下面的代碼存儲到一個會話中的獲取數據數組,但是當我嘗試執行它時,執行時間超過30秒,並且失敗。 我似乎無法發現錯誤,所以我希望能有所幫助。執行時間超過

public function stat_query($user_id = null) 
{ 
$query = $this->core->conn->query("SELECT user_stats.value as value, stats.shortname as shortname FROM user_stats INNER JOIN stats ON user_stats.stat_id = stats.id WHERE user_stats.user_id = ".$this->get_user($user_id)); 
$value = $query->fetch(PDO::FETCH_ASSOC); 
return $value; 
} 

public function init_stat_array($user_id = null){ 
    while($query = $this->stat_query($this->get_user($user_id))) { 
     $this->temp_array[$query['shortname']] = $query['value']; 
    } 
} 

public function store_session($user_id = null) { 
    $this->init_stat_array($this->get_user($user_id)); 
    $_SESSION['stats'] = $this->temp_array; 
} 

注意:get_user函數按預期工作,它只是返回在構造函數中綁定的用戶或輸入的用戶。

+1

如果你的數據庫中存在的用戶ID這將是一個inifinite循環 –

+2

'而($查詢= $這個 - > stat_query($這個 - > GET_USER($ USER_ID)) ){'這看起來像是循環中無限循環地執行的查詢。只要一行被返回,循環就會一直持續下去。當呼叫完成時,'$ query'中包含了什麼? –

+1

你的意思是'foreach($ this-> stat_query(...)as $ row)'而不是當我猜 –

回答

1

while循環不以這種方式工作。使用fetch_assoc,如,因爲fetch方法旨在以這種方式工作。將fetch方法的返回值分配給變量(或方法返回值)後,在其上運行while()將無法​​在提取方法上運行while(),但在您的方法上運行while()。因此,如果該方法在向其傳遞$值時返回非錯誤值,則while($this->yourMethod($value))始終爲真。

如果一個方法返回一個數組,那麼雖然是一個矯枉過正的問題,因爲您需要使用key()和其他一些函數來與數組進行交互。在你如果您需要foreach()

public function init_stat_array($user_id = null){ 
    foreach($this->stat_query($this->get_user($user_id)) as $row) { 
     $this->temp_array[$row['shortname']] = $row['value']; 
    } 
} 
1

stat_query啓動查詢並提取第一行。它將無限期運行,因爲它應該返回一個帶有$this->get_user($user_id)參數的真實結果,並且該參數不會更改。解決這個問題的最簡單方法就是去掉while,因爲該查詢應該只返回一行(我假設user_id是規範的)。

您也可以從該方法返回結果集($query)並用另一種方法遍歷它。您只需從外部撥打fetch即可。

我認爲你可能想循環的是init_stat_array,因爲對於user_id數組運行stat_query是有意義的。