Повторное использование запросов MYSQL на той же странице

#php #syntax #reusability

#php #синтаксис #возможность повторного использования

Вопрос:

У меня есть header.php и a 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»? Это потому, что я не закрываю соединения после выполнения запросов?

Комментарии:

1. Если набор записей не слишком большой (то есть менее примерно 50 записей), вы могли бы сохранить результат в переменной массива $_SESSION. Смотрите PHP.net руководство по использованию $_SESSION.

Ответ №1:

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

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

содержимое 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 ) amp;amp; count( $storage ))
{
   echo $storage;
}
else
{
   echo 'Query has failed !';
}
  

Прочитайте о include() в руководстве fine.

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

Комментарии:

1. Спасибо, кажется, я получаю больше ошибок из этих двух скриптов. Я новичок в php и кодировании в целом, но спасибо за ваше терпение, ваш полный ответ и полезные ресурсы, я прочитаю!

2. Тогда я могу порекомендовать вам это руководство . И когда вы закончите, возьмите книгу под названием: Начало PHP 5 и MySQL , а когда вы закончите с ней, вы можете найти либо книгу «Объектно-ориентированные решения PHP», либо «PHP в действиях» , обе из которых действительно хорошие книги для продвинутого php.

3. ОГО! К сожалению, я не вижу в вашем списке книг, которые я заказал 2 дня назад, «PHP Cookbook» и «Advanced PHP Programming» O_O. Хотя, надеюсь, они будут хорошо охватывать ООП. Еще раз спасибо, что указали путь.

4. «Расширенное программирование на PHP» кажется нормальным, но кулинарная книга древняя .. 2002 год.

Ответ №2:

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

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

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

Комментарии:

1. Спасибо за столь необходимые разъяснения!