1

在我自己的机器上运行良好的东西在生产服务器上失败了。

下面的代码输出“ 24 ”和“ Begin try branch ”,就是这样。之后就停止了。在我自己的机器上,变量是绑定的,我可以继续使用$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;
    }   
}

奇怪的是,如果我尝试在函数内部输出一些行它可以工作(我得到 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) 不要使用 store_result() ,因为将结果复制出来要高效得多,而不是仅仅为了保存数据而保持 SQL 连接打开。

2)在外层函数中打开连接,作为参数传入GetPhotos()函数。

此外,您应该明确地关闭连接,而不是让它被 PHP 垃圾收集器或脚本完成时关闭。

于 2012-07-26T10:57:05.407 回答