#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. Спасибо за столь необходимые разъяснения!