2012-05-07 55 views
1

在我自己的機器上正常工作的東西在生產服務器上失敗。爲什麼mysqli在bind_result之後停止?

以下代碼輸出「」和「開始嘗試分支」就是這樣。之後停止。在我自己的機器,該變量的約束,我可以繼續使用$recPhotos->fetch()

問題發生在這裏:

$recPhotos = GetPhotos($_SESSION['album_uid'], $getVipImages, $arrPaginationParams["currentPage"], $arrPaginationParams["photosPerPage"]); 
try 
{ 
    echo($recPhotos->affected_rows); // Outputs '24' 
    echo("Begin try branch"); 
    $recPhotos->bind_result($file_name, $is_vip); 
    echo("End try branch"); 
} 
catch (Exception $e) 
{ 
    echo 'Exception caught: ', $e->getMessage(), "\n"; 
} 
echo("Continue"); 

被調用的功能如下:

// Get photos from database 
function GetPhotos($album_uid, $getVipImages,$page, $rows) 
{ 
    $objMySqli = GetDbConnection(); 
    $page = ($page - 1) * 24; 

    if ($objMySqliQuery = $objMySqli->prepare("SELECT file_name, is_vip from album_pic where album_uid = ? AND is_vip = ? OR is_vip = 'N' order by is_vip DESC, file_name ASC LIMIT ?,? ;")) 
    { 
     $objMySqliQuery->bind_param('ssss', $album_uid, $getVipImages, $page, $rows); 
     $objMySqliQuery->execute(); 
     $objMySqliQuery->store_result();  
     return $objMySqliQuery; 
    } 
    else 
    { 
     // Error 
     printf("Prepared Statement Error: %s\n", $objMySqli->error); 
     return false; 
    } 
} 

奇怪的是,如果我試圖輸出一些行INSIDE的功能,它的工作原理(我得到24行,如預期)

// Get photos from database 
function GetPhotos($album_uid, $getVipImages,$page, $rows) 
{ 
    $objMySqli = GetDbConnection(); 
    $page = ($page - 1) * 24; 

    if ($objMySqliQuery = $objMySqli->prepare("SELECT file_name, is_vip from album_pic where album_uid = ? AND is_vip = ? OR is_vip = 'N' order by is_vip DESC, file_name ASC LIMIT ?,? ;")) 
    { 
     $objMySqliQuery->bind_param('ssss', $album_uid, $getVipImages, $page, $rows); 
     $objMySqliQuery->execute(); 

     $objMySqliQuery->bind_result($col1, $col2); 
     while ($objMySqliQuery->fetch()) 
     { 
      printf("%s %s\n", $col1, $col2); // This will be executed 24 times 
     }    
    } 
    else 
    { 
     // Error 
     printf("Prepared Statement Error: %s\n", $objMySqli->error); 
     return false; 
    } 
} 

任何想法將不勝感激。謝謝!

+0

提示:echo不是函數。你不需要使用括號。例如'echo'Hi''與'echo('Hi')'相同。 –

+0

在您的'工作'片段中,您移除了'store_result'調用,請嘗試將其移除以用於非工作片段,並查看它是否有效。即使它不,我建議不要使用它,作爲緩衝區整個結果集,如果很大,可能會影響性能。 –

+0

感謝您的提示球員。 @MikePurcell:我試圖刪除'store_result',但沒有奏效。正如我所說,這可以在我的本地機器上順利運行......所以我推斷它必須是生產服務器設置中的某些東西。我有點失落。 – Kerans

回答

0

我猜你去錯了地方的假設連接保持打開你從功能GetPhotos()

基本上要打開就行了連接後返回:

$objMySqli = GetDbConnection(); 

當該函數返回,$ objMySqli對象超出範圍。之後,只要感覺像PHP一樣,PHP允許銷燬對象(它也會關閉連接)。在你的機器上它恰好保持連接足夠長的時間以獲得數據行。在生產機器上(可用內存較少),垃圾收集器的運行速度要快得多。

你應該做的是兩種:

1)不使用store_result(),因爲它是一個很多更有效地複製出來的結果,而不是保留SQL連接打開剛纔保存的數據。

2)在外部函數中打開連接並將其作爲參數傳遞給GetPhotos()函數。

此外,您應該明確地關閉連接,而不是讓它被PHP垃圾收集器或腳本完成時關閉。