为什么mysqli在bind_result之后会停止?

时间:2012-05-07 03:44:55

标签: php mysqli

在我自己的机器上工作正常的东西在生产服务器上失败了。

以下代码输出“ 24 ”和“开始尝试分支”就是这样。它停止了。在我自己的机器上,变量被绑定,我可以继续使用$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;
    }   
}

任何想法将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:0)

我猜你错在哪里假设从函数返回后连接保持打开状态GetPhotos()

基本上你在线上打开连接:

$objMySqli = GetDbConnection();

当函数返回时,对象$ objMySqli超出范围。之后,只要有感觉,PHP就可以销毁对象(也会关闭连接)。在您的机器上,它恰好保持连接足够长的时间以获取数据行。在生产机器上(可用内存较少),垃圾收集器的运行速度要快得多。

你应该做的是:

1)不使用store_result(),因为复制结果的效率要高得多,而不是仅仅保持SQL连接以保存数据。

2)打开外部函数中的连接,并将其作为参数传递给GetPhotos()函数。

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