Php 为什么在bind_结果之后mysqli会停止?

Php 为什么在bind_结果之后mysqli会停止?,php,mysqli,Php,Mysqli,在我自己的机器上正常工作的东西在生产服务器上出现故障 下面的代码输出24并开始try分支,就这样。之后就停止了。在我自己的机器上,变量是绑定的,我可以继续使用$recPhotos->fetch等 问题出现在这里: $recPhotos = GetPhotos($_SESSION['album_uid'], $getVipImages, $arrPaginationParams["currentPage"], $arrPaginationParams["photosPerPage"]); try

在我自己的机器上正常工作的东西在生产服务器上出现故障

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

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

我猜你哪里出了问题,那就是假设从函数GetPhotos返回后,连接保持打开状态

基本上,您是在线路上打开连接:

$objMySqli = GetDbConnection();
当函数返回时,对象$objMySqli超出范围。在此之后,PHP被允许销毁该对象,只要它愿意,该对象也会关闭连接。在您的机器上,它只是碰巧保持连接足够长的时间以获取数据行。在空闲内存较少的生产机器上,垃圾收集器的动作要快得多

您应该做的是:

1不要使用store_result,因为复制结果比保持SQL连接打开以保存数据要高效得多

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


此外,还应该显式关闭连接,而不是让PHP垃圾收集器或脚本完成后关闭连接。

Tip:echo不是一个函数。你不需要在上面用括号。e、 g.echo“Hi”与echo“Hi”相同。在“工作”代码段中,您删除了store_结果调用,请尝试删除非工作代码段的结果调用,然后查看它是否有效。即使没有,我也建议不要使用它,因为它会缓冲整个结果集,如果结果集很大,可能会影响性能。谢谢大家的提示@MikePurcell:我试图删除store_结果,但没有成功。正如我所说的,这在我的本地机器上没有故障。。。因此,我推断它一定是生产服务器设置中的某个内容。我有点迷路了。你在错误日志中有什么错误吗?也许生产机器没有编译mysqli模块。@MikePurcell:我昨天也有同样的想法。我不是PHP大师,但phpinfo给了我一大堆关于mysqli的信息,所以我猜它已经安装好了。此外,如果mysqli不存在,它会更快地失败,不是吗?感谢您的持续投入。