1

自分のマシンで正常に動作するものが、運用サーバーでは失敗しています。

次のコードは「24」と「Begin try branch」を出力し、それだけです。その後停止します。自分のマシンでは、変数がバインドされているので、$recPhotos->fetch()etcを使い続けることができます。

ここで問題が発生します:

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

奇妙なことに、関数内でいくつかの行を出力しようとすると、うまくいきます予想どおり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;
    }   
}

どんなアイデアでも大歓迎です。ありがとう!

4

1 に答える 1

0

GetPhotos()関数から戻った後、接続が開いたままであると想定しているのは、どこが間違っているのかを推測しています。

基本的に、回線で接続を開いています。

$objMySqli = GetDbConnection();

関数が戻ると、オブジェクト$objMySqliはスコープ外になります。その後、PHPはオブジェクトを破棄することができます(これにより接続も閉じられます)。お使いのマシンでは、データの行を取得するのに十分な時間接続されたままになります。実稼働マシン(空きメモリーが少ない)では、ガベージコレクターの動作がはるかに高速になります。

あなたがすべきことは次のいずれかです:

1)データを保持するためだけにSQL接続を開いたままにするよりも、結果をコピーする方がはるかに効率的であるため、store_result()を使用しないでください。

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

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

于 2012-07-26T10:57:05.407 に答える