Повторное использование запросов MYSQL на той же странице - PullRequest
2 голосов
/ 29 апреля 2011

У меня есть header.php и файл footer.php, включенные в одну и ту же страницу, они оба возвращают одну и ту же информацию. В частности, я использую этот запрос в каждом файле.

<?php   
    $q3 = "SELECT page_id, show_id, link_title FROM pages as p WHERE show_id = 1";
    $r3 = @mysqli_query ($dbc, $q3); // Run the Query.
    while ($nav = mysqli_fetch_array($r3, MYSQLI_ASSOC)) {
    echo"<li>{$nav['link_title']}</li>"
    }
?>

Показывает страницы как в верхнем, так и в нижнем колонтитулах.

Однако, ИНОГДА второй запрос в нижнем колонтитуле возвращает «Не удалось получить mysqli», иногда это работает, иногда нет. Я задавался вопросом, должен ли я использовать что-то вроде mysqli_free_result() это было бы лучше практики?

Более того, рекомендуется ли освобождать результат после каждого запроса? Есть ли лучший способ использовать один и тот же результат с разных страниц и тегов <?php // ?>?

Кроме того, время от времени я получаю сообщение об ошибке «слишком много подключений mysql»? Это потому, что я не закрываю соединения после выполнения запросов?

Ответы [ 2 ]

1 голос
/ 29 апреля 2011

Вы можете начать с удаления @ из вашего кода.Подавление ошибок является медленным и вредным занятием.

Если вы входите в ту же область, вы можете просто сохранить значение first в некоторой переменной и проверить через секунду, если переменная была установлена.

содержимое header.php

$storage = '';
$query = "SELECT page_id, show_id, link_title FROM pages as p WHERE show_id = 1";
if ( $result = mysqli_query ($dbc, $query))
{
   while ($nav = mysqli_fetch_array($result, MYSQLI_ASSOC)) 
   {
      $item = "<li>{$nav['link_title']}</li>";
      $storage .= $item;
      echo $item;
   }
}
else
{
   echo 'Query has failed !';
}

содержимое footer.php

if ( isset( $storage ) && count( $storage ))
{
   echo $storage;
}
else
{
   echo 'Query has failed !';
}

Подробнее о include () в прекрасном руководстве.

И, пожалуйста, перестаньте писать, что это процедурное извращение.Узнайте, как сделать ООП и прочитайте о PDO .

1 голос
/ 29 апреля 2011

Запустите запрос только один раз, прежде чем включать верхний и нижний колонтитулы и сохраните результаты в переменной - вы можете использовать их столько раз, сколько захотите.

mysqli_free_result() следует использовать толькоесли у вас действительно большой набор результатов, так как PHP позаботится о том, чтобы освободить его после того, как он больше не нужен, и делать это вручную каждый раз, только создавая дополнительные издержки.

Вы получаете «слишком много соединений»ошибка, потому что вы, вероятно, открываете несколько соединений, как при повторении одного и того же запроса - создайте только одно, прежде чем включать любой другой скрипт, и просто используйте его повторно.Вам следует использовать стандартное расширение mysql с mysql_pconnect() для еще лучшего решения этой проблемы ... в противном случае - да, закройте соединение после того, как оно вам больше не нужно.

...