2012-05-07 9 views
1

私のマシンで正常に動作するものは、本稼動サーバー上で失敗しています。なぜbind_resultの後でmysqliが停止するのですか?

次のコードを出力「」と「は、tryブランチを開始します」と、それはそれです。それはそれ以後停止する。

$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; 
    } 
} 

問題は、ここで発生した自分のマシンでは、変数が束縛されていると私はなど$recPhotos->fetch()を使用して行くことができますいくつかの行を出力しようとすると、内部にはという機能があります(期待どおりに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 'Hi''は' echo(' Hi ') 'と同じです。 –

+0

あなたの「働く」スニペットで、あなたは 'store_result'呼び出しを削除し、それが機能していないスニペットのために削除し、動作するかどうか確認してください。たとえそれを使用しないことをお勧めしない場合でも、バッファ全体として結果セットが設定されます。これが大きいとパフォーマンスに影響する可能性があります。 –

+0

あなたのヒントの人に感謝します。 @MikePurcell: 'store_result'を削除しようとしましたが、うまく動作しませんでした。私が言ったように、これは私のローカルマシンにヒッチなしで動作します...私はそれがプロダクションサーバーの設定または何かの何かでなければならないと推測します。私は少し失われています。 – Kerans

答えて

0
接続を使用すると、基本的にあなたがライン上に接続開いている関数GetPhotos()

から復帰した後、開いたままと仮定した場合、あなたは間違って行く私は推測している

$objMySqli = GetDbConnection(); 

関数が戻ると、オブジェクト$ objMySqliが有効範囲外になります。その後、PHPは、そのように感じるたびにオブジェクトを破壊する(接続を閉じる)ことが許可されます。あなたのマシンでは、ちょうどデータの行を取得するのに十分長い時間接続されています。空きメモリが少ないプロダクションマシンでは、ガーベッジコレクタは非常に高速に動作します。

何をすべきことは、次のいずれかです。

1)のstore_resultを()それが出て結果をコピーするだけではなく、データを保持するために、オープンSQL接続を維持するために多くの方が効率的だとして使用されていません。

2)外部関数で接続を開き、パラメータとしてGetPhotos()関数に渡します。

また、PHPのガベージコレクタによって閉じられるようにするのではなく、スクリプトが終了したときに明示的に接続を閉じる必要があります。