2012-05-07 2 views
1

Что-то, что отлично работает на моей машине, не работает на производственном сервере.Почему mysqli останавливается после bind_result?

следующие выходы код «» и «Begin попробовать филиал» и это все. После этого он останавливается. На моей машине, переменные связаны, и я могу продолжать использовать $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; 
    } 
} 

Любые идеи будут высоко оценены. Благодаря!

+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, либо когда скрипт заканчивается.

Смежные вопросы