@olga_0630 Смотрите у вас id во втором скрыншоте не должно содержать int(1) измените на int(11) так же и в первом скрыншоте измените на int(11)
Доброе время суток, исправила на int(11) - без изменения, выводятся все статьи. 1. Скорее всего проблема в том, что нет выборки из таблицы log_categories Например в 1 коде : PHP: <?php $res_categories = mysqli_query($connect,"SELECT * FROM log_categories"); // вывод всех категорий $num_categories = mysqli_fetch_array($res_categories); if (mysqli_num_rows ($res_categories) > 0) { $num_categories = mysqli_fetch_array($res_categories); do { printf ("<p><a href='log.php?cat=%s'>%s</a></p>", $num_categories["id"], $num_categories["title"]); } while ($num_categories = mysqli_fetch_array($res_categories)); } else {echo "<p>В базе нет записей !</p>"; exit;} // вывод статей $res = mysqli_query($connect,"SELECT * FROM log WHERE WHERE cat='$cat' ORDER BY id desc"); // вывод статей согласно номеру категории $number = mysqli_num_rows($res); for ($n=1; $n<=$number; $n++) { $comments=mysqli_fetch_array($res); // Оформление и вывод echo '<h3>'.$comments['title'].'</h3>'; echo '<div>'.$comments['article'].'</div>'; } ?> видно, что есть запрос из таблицы с категориями (log_categories) и далее вывод статей из таблицы log. Цикл do while формирует ссылку с id. В этом коде при клике на любую ссылку с id, выбираются из таблицы log статьи где cat='$cat', ранее создавала отдельно страницу article.php, а на странице log.php было page='index' так как выбирались все статьи. Во 2 коде : PHP: $categories = array('all','1','2','3','4'); //список существующих категорий if($_GET['cat']) { //если указан get-параметр 'cat' if(!in_array($_GET['cat'], $categories)) { //если такой категории не существует header('location: /log.php'); } else { //если существует $cat = ($_GET['cat'] != 'all') ? "WHERE cat=".(int)$_GET['cat'] : ''; //если 'cat' не равен 'all' указываем название категории, иначе выбираем все статьи из базы $articles = mysqli_query($connect,"SELECT * FROM log $cat ORDER BY id desc"); } } foreach($categories as $value) { //вывод меню $title = ($value != 'all') ? "Категория $value" : "Все статьи"; //название пункта меню $class = ($value == $_GET['cat']) ? "active" : "notactive"; //проверяем активный ли это пункт меню echo '<a class="'.$class.'" href="/log.php?cat='.$value.'">'.$title.'</a>'; //выводим пункт меню на страницу } if($articles) { //если есть статьи выводим их на экран while ($row = mysqli_fetch_array($articles)) { //вывод статей } } $res = mysqli_query($connect,"SELECT * FROM log WHERE page='index' ORDER BY id desc"); $number = mysqli_num_rows($res); for ($n=1; $n<=$number; $n++) { $comments=mysqli_fetch_array($res); // Оформление и вывод echo '<h3>'.$comments['title'].'</h3>'; echo '<div>'.$comments['article'].'</div>'; } в этом коде нет запроса к таблице log_categories, как в 1 коде. Ошибка кроется здесь ? Спасибо за терпение, Ольга.
Здравствуйте, в сообщении 27 во 2 коде делала изменения, но не работает. Будет время гляньте, может из сообщения 27 при сравнении 2 кодов вы сможете увидеть ошибку, у меня пока не получается. Заранее благодарна, Ольга.
Сергей, здравствуйте. Простите, что докучаю, но было бы хорошо, если бы получилось данный момент реализовать с выводом категорий на странице. 1. Я сделала структуру таблицы (сообщение 25) 2. Предоставила код, (сообщение 27), 1код -подключала 2 файла - log и article.php. Проблема была в том, что при клике на http://site.ru/article.php?cat=1 должны были из базы все статьи извлекаться. 2 код - ваш код, который так и не получилось прикрутить на страницу article.php, категории выводятся. но загружаются все статьи. В любом случае, спасибо.
Ох... В первом посте вы упомянули вроде бы верный способ. Для каждого пункта в списке категорий вы сравниваете id категории тек. страницы с id категории соотв. пункта. У страницы без фильтрации по категории лучше указать id=0, чтобы не вносить лишнюю путаницу и уже по этому значению было понятно, что это за страница. Плюс сразу понятно, что на этой странице подсветки пунктов не будет, т.к. у страниц с включенной фильтрацией id будут ненулевые. Это один из самых простых признаков, по которому можно различать наличие/отсутствие фильтрации. Про страницы отдельных статей не понял, нужно ли там отображать список категорий. Но даже если нужно, принцип тот же самый. Берете id категории тек. страницы из данных статьи или данных тек. категории, если категория отражена в адресе статьи (например /cat_id/art_id). log, как я понял, это что-то вроде страницы ошибки. Редирект тут обычно не делают, а выводят общую для всего сайта страницу ошибки (со статусом 404), на которой естественно ничего подсвечивать не нужно.
Здравствуйте, спасибо за ответ. Код : PHP: <?php // категории $res = mysqli_query($connect,"SELECT * FROM log WHERE cat='$cat'"); //выборка статей $res_categories = mysqli_query($connect,"SELECT * FROM log_categories"); $num_categories = mysqli_fetch_array($res_categories); if (mysqli_num_rows ($res_categories) > 0) { $num_categories = mysqli_fetch_array($res_categories); do { $class = ($_GET['cat'] == $num_categories["id"]) ? 'active' : 'notactive'; printf ("<p><a class='%s' href='article.php?cat=%s'>%s</a></p>", $class, $num_categories["id"], $num_categories["title"]); } while ($num_categories = mysqli_fetch_array($res_categories)); } // в переменную $num_comm помещается массив title,meta_d,meta_k,message else {echo "<p>Нет записей !</p>"; exit;} echo "</div>"; ?> Код отлично работает, статьи и категории выводит, ссылка становится активной и сейчас у меня на странице 5 категорий. При клике на ссылку, например, http://site.ru/log.php?cat=2 из таблицы log вытаскиваются все статьи, где cat='$cat', что правильно и для 2,3,4 и 5 категории - выбираются конкретные статьи для отображения. Но при клике на http://site.ru/log.php?cat=1 нужно, чтобы выбирались не только статьи, которые в этой категории, а все, чтобы пользователь мог вернуться к просмотру всех статей. Не знаю, как правильно прописать условие, что при клике на 1 категорию, где cat=1 на страницу выводились все статьи. (не хочется создавать отдельную кнопку для перехода на страницу, где отображаются все статьи) Это основная проблема, которую мне пока не удаётся реализовать и буду признательна за помощь всем откликнувшимся.
Вот так должно работать: PHP: <?php $cat_query = mysqli_query($connect, "SELECT * FROM `log_categories`"); //список существующих категорий while($cat = mysqli_fetch_array($cat_query)) { $cat_num[] = $cat['id']; //список существующих категорий $cat_title[] = $cat['title']; //названия категорий } if($_GET['cat']) { //если указан get-параметр 'cat' if(!in_array($_GET['cat'], $cat_num) && $_GET['cat'] != 'all') { //если такой категории не существует header('location: /articles.php'); //переадресуем на articles.php } else { //если существует $cat = ($_GET['cat'] != 'all') ? 'WHERE cat='.$_GET["cat"] : ''; //если 'cat' не равен 'all' указываем название категории, иначе выбираем все статьи из базы $art_query = mysqli_query($connect,"SELECT * FROM log $cat"); //запрос к базе } } for($i=-1; $i<sizeof($cat_num); $i++) { //вывод меню if($i == -1) { $title = 'Все категории'; //название пункта меню $class = ($_GET['cat'] == 'all') ? "active" : "notactive"; //проверяем активный ли это пункт меню $href = 'all'; //ссылка } else { $title = 'Категория '.$cat_title[$i]; //название пункта меню $class = ($_GET['cat'] == $cat_num[$i]) ? "active" : "notactive"; //проверяем активный ли это пункт меню $href = $cat_num[$i]; //ссылка } echo '<a class="'.$class.'" href="/articles.php?cat='.$href.'">'.$title.'</a>'; //выводим пункт меню на страницу } if($art_query) { //если есть статьи выводим их на экран while ($art = mysqli_fetch_array($art_query)) { $articles[$art['cat']][] = array('title' => $art['title'], 'text' => $art['article'], 'page' => $art['page']); } if($articles) { foreach ($articles as $key => $value) { echo '<h1>Статьи из категории: '.$key.'</h1>'; foreach ($value as $art) { echo'<h3>'.$art['title'].'</h3><p>'.$art['text'].'</p>'; } } } else { echo 'Статей не найдено!'; } } ?>
@olga_0630, вам нужно сделать простейший вариант «конструктора запросов». Это когда в зависимости от условия включенной или отключенной фильтрации по категории вы добавляете или не добавляете в запрос кусок WHERE `cat`={$cat} (либо AND `cat`={$cat}, если в запросе уже присутствует какое-то условие, используемое в том числе и при отключенной фильтрации). И обратите, пожалуйста, внимание на мое замечание по поводу нулевого значения id категории для страницы с отк. фильтрацией. Про цикл do-while вам вроде бы уже выше писали. Замените это уродство на while (объедините команду присваивания перед циклом и в условии цикла). Для детекта отсутствия записей в списке обычно используется не mysqli_num_rows, а значение, получаемое из БД отдельным запросом (гляньте мою статью http://gency.ru/pagination и мой последний на данный момент коммент к ней). --- Добавлено --- ...вы прямо в шаблоне пишете: PHP: <?php if ($count): ?> тут выводим список <?php else: ?> тут – сообщение, что элементов нет <?php endif; ?> Если у страницы списка есть контент и помимо самого списка, то ветку else можно попробовать убрать.
Сергей, здравствуйте. Во-первых, огромное спасибо, что потратили своё время и решили помочь. У меня ещё к вам есть вопросы, 1. Сейчас имеется 1 страница article.php, где имеется код + постраничная навигация. В данный момент при клике на любую из категорий, кроме 1 выбираются конкретные статьи, а при клике на 1 категорию выбираются все статьи. Всё правильно. 2. Когда захожу на страницу article.php, должны также загружаться все статьи, но у меня получается 2 разных запроса и как правильно сделать, пока не получается. 1 запрос - вытаскивает все статьи, когда попадаю на страницу по ссылке http://site.ru/article.php (запрос + постраничная навигация) и статьи разбиваются на страницы (1, 2 и т.д.), когда кликаю по ссылке с категорией отличной от cat=1 загружаются конкретные статьи, но когда кликаю по ссылке http://site.ru/article.php?cat=all, то на странице article.php дублируются статьи, так как имеются 2 запроса и как их "подружить" пока не получается. Код (Text): $res = mysqli_query($connect,"SELECT * FROM dpn_log"); $count_list=floor((mysqli_num_rows($res)-1)/7)+1; и Код (Text): $art_query = mysqli_query($connect,"SELECT * FROM dpn_log $cat"); Весь код : PHP: <?php // постраничная навигация $res = mysqli_query($connect,"SELECT * FROM dpn_log"); $count_list=floor((mysqli_num_rows($res)-1)/7)+1; if (is_numeric($_GET[video_list]) and $_GET[video_list]>0) { if ($_GET[video_list]>$count_list) $video_list=$count_list; else $video_list=$_GET[video_list]; } else $video_list=1; if ($video_list==0) $video_list=1; // категории echo "<div style='text-align: center;'>"; $cat_query = mysqli_query($connect, "SELECT * FROM `dpn_log_categories`"); //список существующих категорий while($cat = mysqli_fetch_array($cat_query)) { $cat_num[] = $cat['id']; //список существующих категорий $cat_title[] = $cat['title']; //названия категорий } if($_GET['cat']) { //если указан get-параметр 'cat' if(!in_array($_GET['cat'], $cat_num) && $_GET['cat'] != 'all') { //если такой категории не существует header('location: /article.php'); //переадресуем на articles.php } else { //если существует $cat = ($_GET['cat'] != 'all') ? 'WHERE cat='.$_GET["cat"] : ''; //если 'cat' не равен 'all' указываем название категории, иначе выбираем все статьи из базы $art_query = mysqli_query($connect,"SELECT * FROM dpn_log $cat"); //запрос к базе } } for($i=-1; $i<sizeof($cat_num); $i++) { //вывод меню if($i == -1) { $title = 'Все статьи'; //название пункта меню $class = ($_GET['cat'] == 'all') ? "active" : "notactive"; //проверяем активный ли это пункт меню $href = 'all'; //ссылка } else { $title = ''.$cat_title[$i]; //название пункта меню $class = ($_GET['cat'] == $cat_num[$i]) ? "active" : "notactive"; //проверяем активный ли это пункт меню $href = $cat_num[$i]; //ссылка } echo '<p style="display: inline-block;"><a class="'.$class.' cat_link push" title="Подробнее" href="/lesson.php?cat='.$href.'">'.$title.'</a></p>'; //выводим пункт меню на страницу } if($art_query) { //если есть статьи выводим их на экран while ($art = mysqli_fetch_array($art_query)) { $articles[$art['cat']][] = array('title' => $art['title'], 'text' => $art['text'], 'page' => $art['page']); } if($articles) { foreach ($articles as $key => $value) { //echo '<h1>Статьи из категории: '.$cat_title[$key].'</h1>'; //echo '<h1>Статьи из категории: '.$key.'</h1>'; foreach ($value as $art) { echo'<h3 class="lesson"><span class="gradient">'.$art['title'].'</span></h3><div>'.$art['text'].'</div>'; } } } else { echo 'Статей не найдено!'; } } echo "</div>"; // постраничная навигация $res = mysqli_query($connect,"SELECT * FROM dpn_video ORDER BY id desc LIMIT ".($video_list*7-7).",7"); $number = mysqli_num_rows($res); for ($n=1; $n<=$number; $n++) { $comments=mysqli_fetch_array($res); // Оформление и вывод echo '<h3 class="lesson"><span class="gradient">'.$comments['title'].'</span></h3>'; // ранее был вывод title echo '<div>'.$comments['text'].'</div>'; // ранее был вывод статей } ?> т.е нужно, чтобы запрос был один для страницы http://site.ru/article.php и для страницы http://site.ru/article.php?cat=all, чтобы при переходе статьи не дублировались и нижний блок постраничной навигациии : PHP: // постраничная навигация [/COLOR][/COLOR][/COLOR] [COLOR=#ffa64d][COLOR=#a64dff][COLOR=#000000] $res = mysqli_query($connect,"SELECT * FROM dpn_video ORDER BY id desc LIMIT ".($video_list*7-7).",7"); $number = mysqli_num_rows($res); for ($n=1; $n<=$number; $n++) { $comments=mysqli_fetch_array($res); // Оформление и вывод echo '<h3 class="lesson"><span class="gradient">'.$comments['title'].'</span></h3>'; // ранее был вывод title echo '<div>'.$comments['text'].'</div>'; // ранее был вывод статей } работает, но сейчас вывод статей имеется в коде: PHP: if($art_query) { //если есть статьи выводим их на экран while ($art = mysqli_fetch_array($art_query)) { $articles[$art['cat']][] = array('title' => $art['title'], 'text' => $art['text'], 'page' => $art['page']); } и код постраничной навигации нужно встраивать в основной код ? Сама пробовала, как-то коряво получается. В коде закомментировала строчки в функции foreach: Код (Text): //echo '<h1>Статьи из категории: '.$cat_title[$key].'</h1>'; //echo '<h1>Статьи из категории: '.$key.'</h1>'; так как, у меня и так вытаскивается название категории из таблицы log_categories. Заранее благодарна и спасибо за помощь. Кстати, вы абсолютно правы. При таком подходе нет смысла создавать 2 файла, достаточно 1 - article.php. --- Добавлено --- P.S. : В коде FROM dpn_video должно быть FROM dpn_log. У меня в коде всё правильно, это не ошибка, забыла переименовать.
То, о чём вы пишете называется - пагинация. То есть, разбиение вывода результатов на несколько страниц. Чтобы это реализовать вам нужно изменить вот этот кусок кода: PHP: else { //если существует $cat = ($_GET['cat'] != 'all') ? 'WHERE cat='.$_GET["cat"] : ''; //если 'cat' не равен 'all' указываем название категории, иначе выбираем все статьи из базы $art_query = mysqli_query($connect,"SELECT * FROM log $cat"); //запрос к базе } Изменить нужно, примерно так: PHP: else { //если существует $cat = ($_GET['cat'] != 'all') ? 'WHERE cat='.$_GET["cat"] : ''; //если 'cat' не равен 'all' указываем название категории, иначе выбираем все статьи из базы $pagination_num = 5; //количество статей выводящихся на странице $page_num = is_numeric($_GET['page']) ? $_GET['page'] : 1; $limit_max = $pagination_num*$page_num; $limit_min = $limit_max-$pagination_num; $art_query = mysqli_query($connect,"SELECT * FROM log $cat LIMIT $limit_min, $limit_max"); //запрос к базе }
Сергей, здравствуйте. Пагинация мне не нужна, я просто уточнила, если будет нужна, как прикрутить к коду. Спасибо за пример. Как сделать, чтобы на странице site.ru/article.php также загружались все статьи из базы. Когда захожу на страницу article.php, должны также загружаться все статьи, как при клике на ссылку с категорий cat=1. т.е если http://site.ru/article.php или http://site.ru/article.php?cat=all должны извлекаться все статьи. Для cat=all так и есть, а если попадать с главного меню на страницу article.php, то статьи не извлекаются. Сделала другой запрос, например : PHP: $res = mysqli_query($connect,"SELECT * FROM dpn_log"); но тогда статьи дублируются, так как 2 разных запроса (для article.php и article.php с cat=all), т.е когда кликаю по ссылке http://site.ru/article.php?cat=all (в адресной строке браузера, соответственно, такая же ссылка), извлекаются все статьи + статьи от другого запроса. Получается нужен один запрос для article.php с cat=all, который также работал бы и для страницы article.php. Нет разницы попадаем мы на страницу article.php или на страницу article.php с cat=1, должны извлекаться все статьи и не дублироваться. Как-то не очень хорошо объяснила, надеюсь вы разобрались, что я пыталась донести. Спасибо вам за терпение, Ольга. --- Добавлено --- Код : PHP: // категории echo "<div style='text-align: center;'>"; $cat_query = mysqli_query($connect, "SELECT * FROM `dpn_log_categories`"); //список существующих категорий while($cat = mysqli_fetch_array($cat_query)) { $cat_num[] = $cat['id']; //список существующих категорий $cat_title[] = $cat['title']; //названия категорий } if($_GET['cat']) { //если указан get-параметр 'cat' if(!in_array($_GET['cat'], $cat_num) && $_GET['cat'] != 'all') { //если такой категории не существует header('location: /article.php'); //переадресуем на articles.php } else { //если существует $cat = ($_GET['cat'] != 'all') ? 'WHERE cat='.$_GET["cat"] : ''; //если 'cat' не равен 'all' указываем название категории, иначе выбираем все статьи из базы $art_query = mysqli_query($connect,"SELECT * FROM dpn_log $cat"); //запрос к базе } } for($i=-1; $i<sizeof($cat_num); $i++) { //вывод меню if($i == -1) { $title = 'Все статьи'; //название пункта меню $class = ($_GET['cat'] == 'all') ? "active" : "notactive"; //проверяем активный ли это пункт меню $href = 'all'; //ссылка } else { $title = ''.$cat_title[$i]; //название пункта меню $class = ($_GET['cat'] == $cat_num[$i]) ? "active" : "notactive"; //проверяем активный ли это пункт меню $href = $cat_num[$i]; //ссылка } echo '<p style="display: inline-block;"><a class="'.$class.' cat_link push" title="Подробнее" href="/lesson.php?cat='.$href.'">'.$title.'</a></p>'; //выводим пункт меню на страницу } if($art_query) { //если есть статьи выводим их на экран while ($art = mysqli_fetch_array($art_query)) { $articles[$art['cat']][] = array('title' => $art['title'], 'text' => $art['text'], 'page' => $art['page']); } if($articles) { foreach ($articles as $key => $value) { //echo '<h1>Статьи из категории: '.$cat_title[$key].'</h1>'; //echo '<h1>Статьи из категории: '.$key.'</h1>'; foreach ($value as $art) { echo'<h3 class="lesson"><span class="gradient">'.$art['title'].'</span></h3><div>'.$art['text'].'</div>'; } } } else { echo 'Статей не найдено!'; } } echo "</div>";
Замените вот этот кусок кода: PHP: if($_GET['cat']) { //если указан get-параметр 'cat' if(!in_array($_GET['cat'], $cat_num) && $_GET['cat'] != 'all') { //если такой категории не существует header('location: /article.php'); //переадресуем на articles.php } else { //если существует $cat = ($_GET['cat'] != 'all') ? 'WHERE cat='.$_GET["cat"] : ''; //если 'cat' не равен 'all' указываем название категории, иначе выбираем все статьи из базы $art_query = mysqli_query($connect,"SELECT * FROM dpn_log $cat"); //запрос к базе } } На этот: PHP: if($_GET['cat']) { //если указан get-параметр 'cat' if(!in_array($_GET['cat'], $cat_num) && $_GET['cat'] != 'all') { //если такой категории не существует header('location: /article.php'); //переадресуем на articles.php } else { //если существует $cat = ($_GET['cat'] != 'all') ? 'WHERE cat='.$_GET["cat"] : ''; //если 'cat' не равен 'all' указываем название категории, иначе выбираем все статьи из базы } } $art_query = mysqli_query($connect,"SELECT * FROM log $cat"); //запрос к базе
Сергей, огромное спасибо. Стыдно, что не догадалась запрос вынести из скобок... У меня еще осталось к вам 2 маленьких вопроса, чтобы разобраться с этим вопросом. 1. Как сделать, чтобы ссылка article.php с cat=all была не только активной при клике на http://site.ru/article.php?cat=all, но и на странице article.php (в данный момент ссылка не активная), где все категории, в принципе до и после клика все статьи из базы появляются и ссылка "Все статьи" должна быть активной, а не только после клика на ссылку с cat=all. 2. Я прописала класс для ссылки, таким образом : PHP: echo '<p style="display: inline-block;"><a class="'.$class.' cat_link push" href="/article.php?cat='.$href.'">'.$title.'</a></p>'; т.е - Код (Text): class="'.$class.' cat_link push" cat_link push, внутри, где прописана переменная $class. так правильно или оптимальней. как-то по другому ? 3. В куске кода : PHP: if($articles) {[/COLOR][/COLOR] [COLOR=#0000ff][COLOR=#000000] foreach ($articles as $key => $value) { //echo '<h1>Статьи из категории: '.$cat_title[$key].'</h1>'; //echo '<h1>Статьи из категории: '.$key.'</h1>'; foreach ($value as $art) { echo'<h3><span class="gradient">'.$art['title'].'</span></h3><div>'.$art['text'].'</div>'; } } } Я закоментировала строчки, так как мне они не нужны. Их просто удалить или foreach ($articles as $key => $value) { } нужно также будет изменять ? И ещё подскажите какую-нибудь толковую книгу или полезный видеоматериал, которые стоит посмотреть. Сама нигде не училась, изучаю всё сама. Пока освоила html, css, немного js, php. Спрашиваю, так как в инете полно, как и "мусора", так и толковой инфы. Например, "Специалиста" стоит смотреть ? Читала, что Борисов слишком долго, но хорошо объясняет или что-то от Lynda.com лучше посмотреть, где все быстрее. Книги - как вариант Денис Колесниченко, нашла книгу "Современный сайт на PHP 2009", а уже 2018 год. Заранее благодарна, Ольга.
Вот этот код: PHP: $class = ($_GET['cat'] == 'all') ? "active" : "notactive"; //проверяем активный ли это пункт меню Поменяйте на этот: PHP: $class = (!in_array($_GET['cat'], $cat_num)) ? "active" : "notactive"; //проверяем активный ли это пункт меню Мне лично по видео сложно учиться. Я лучше воспринимаю текстовую информацию. Книг много полезных, но я лично предпочитаю изучать документацию на практике. Нужно что-то сделать - ищешь функцию, которая может это сделать. Нет такой функции - пишешь свою. Ещё, лично для меня очень полезным, я считаю, было знакомство с фреймворками (Yii, Laravel). Когда смотришь как они устроены - понимаешь как правильно строить свой код, цепляешь какие-то фишки. А на счёт книжки - выбор большой, но берите свежие издания 2017-18 года. И версия PHP описываемая в книге не должна быть ниже 7.
Сергей, спасибо - работает. Хотела ещё немного безопасности добавить для этой страницы... 1. Когда к странице обращаются без cat, например : PHP: if (!isset ($cat)) {$cat = 1;} т.е при обращении к странице напрямую, например, через адресную строку с cat = 6, а у меня всего на данный момент 5 категорий, должно выдаваться соответствующее сообщение, например : PHP: <?php if(!$res){ echo 'Ошибка запроса: '.mysqli_error($connect).'<br>Напишите админу на <a href="#">http://www.site.ru</a> <br>Код ошибки: '.mysqli_errno($connect); exit; } if (mysqli_num_rows ($res) > 0) { $num_comm = mysqli_fetch_array($res); } else {echo "<p>Нет записей!</p>"; exit;} ?> В данный момент, если я обращаюсь к странице article.php с несуществующей cat извлекаются все равно все статьи, что неверно. У меня есть другая страница log.php (данный код находится в шапке сайта), где при обращению к странице по несуществующему id выдаётся соответствующее сообщение, но выше приведённый код у меня на странице не срабатывает на странице article.php. 2. И если в адресную строку добавлять какой-нибудь запрос. Например, http://site.ru/article.php?cat=select PHP: // проверяем является ли переменная числом if (!preg_match("|^[\d]+$|", $id)) { exit("<p>Неверный формат запроса ! Проверьте адресную строку !</p>"); } И снова, сообщение не выдаётся, а загружаются все статьи из базы. Данные 2 кода прописывала в шапке страницы article.php, а полагаю, что надо в самом коде. Сергей, подскажите как правильно сделать и правильно ли я делаю ? P.S.: Странно почему код в шапке не срабатывает, на другой странице с id всё работает...
Вот кусок кода который отвечает за несуществующие категории: PHP: if(!in_array($_GET['cat'], $cat_num) && $_GET['cat'] != 'all') { //если такой категории не существует header('location: /articles.php'); //переадресуем на articles.php } Я сделал вам так, чтобы при обращении к несуществующей категории пользовател перекидывало на articles.php. Можете убрать строчку: PHP: header('location: /articles.php'); //переадресуем на articles.php И написать вместо неё, например: PHP: echo 'Такой категории не существует!';
Да, я уже с этим разобралась, спасибо. Забыла, что раньше об этом спрашивала. Сергей, а насчёт 2 пункта в 41 сообщении является ли переменная числом код, который я привела не подойдёт ? Сейчас можно через адресную строку напрямую сделать запрос и внести "ненужные" данные в базу или данный код лучше включить в основной код, где есть код для переадресации на страницу article.php ?
Во-первых, для проверки переменной есть функция is_numeric. https://php.ru/manual/function.is-numeric.html А во-вторых зачем вам проверять переменную cat если вот здесь: PHP: if(!in_array($_GET['cat'], $cat_num) && $_GET['cat'] != 'all') { //если такой категории не существует у вас уже идёт проверка на существование категории? В переменной $cat_num у вас содержатся все числовые индексы существующих категорий. Поэтому, если индекса из переменной $_GET['cat'] не содержится в массиве $cat_num, то условие не сработает.
Сергей, здравствуйте. Да, согласна с вами нет необходимости проверять переменную при помощи функции is_numeric, так как в коде есть уже проверка, тем не менее спасибо за ответ. Поздравляю вас с 23 февраля ! Всего самого наилучшего !!! Сергей у меня есть последняя к вам просьба по этой теме - пагинация, всё-таки она будет рано или поздно необходима. У меня она на будущем сайте уже есть и на локальном компьютере работает (для страниц без категорий я разобралась, как сделать), но на странице article.php есть категории я не разобралась как сделать. С категориями сложней и я точно не знаю, как этот код прикрутить, чтобы она правильно работала. Собственно сам код : PHP: <?php // оформление навигации function col_pages($count, $this, $radius) { $j=0; $out=""; $td='<td>'; if (($this-$radius)<1) $i=1; else $i=$this-$radius; if ($i==1) $i++; if (($count-($radius*2+1))<$i) $i=$count-($radius*2+1); if ($i<2) $i=2; if ($this!=1) $out.=$td.'<a href="article.php?page_list=1">1</a></td>'; else $out.=$td.'1</td>'; if ($i>2) $out.=$td.'...</td>'; while ((($i<=($this+$radius)) or ($j<($radius*2+1))) and ($i<$count)) { if ($i!==$this) $out.=$td.'<a href="article.php?page_list='.$i.'">'.$i.'</a></td>'; else $out.=$td.$i.'</td>'; $i++; $j++; } if ($i<$count) $out.=$td.'...</td>'; if ($count>1) { if ($count!=$this) $out.=$td.'<a href="article.php?page_list='.$count.'"> '.$count.'</a></td>'; else $out.=$td.$count.'</td>'; } return $out; } // запрос $art_query = mysqli_query($connect,"SELECT * FROM dpn_log"); $count_list=floor((mysqli_num_rows($art_query)-1)/5)+1; if (is_numeric($_GET[page_list]) and $_GET[page_list]>0) { if ($_GET[page_list]>$count_list) $page_list=$count_list; else $page_list=$_GET[page_list]; } else $page_list=1; if ($page_list==0) $page_list=1; // меню для отображения echo '<table cellspacing="10" cellpadding="5">'; echo '<tr>'; echo '<td>'; if ($page_list>1) echo '<a href="article.php?page_list='. ($page_list-1).'">Назад</a>'; else echo 'Назад'; echo '</td>'; echo col_pages((int)$count_list, (int)$page_list, 3); echo '<td>'; if ($page_list<$count_list) echo '<a href="article.php?page_list='. ($page_list+1).'">Следующая</a>'; else echo 'Следующая'; echo '</td>'; echo '</tr>'; echo '</table>'; // тут располагается код категорий... // постраничная навигация | продолжение $art_query = mysqli_query($connect,"SELECT * FROM dpn_log LIMIT ".($page_list*5-5).",5"); $number = mysqli_num_rows($art_query); for ($n=1; $n<=$number; $n++) { $art=mysqli_fetch_array($art_query); // Оформление и вывод !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! (не нужен, так как есть уже в коде категорий) //echo '<h3>'.$art['title'].'</h3>'; //echo '<div>'.$art['text'].'</div>'; } ?> И весь код целиком : PHP: <?php // оформление навигации function col_pages($count, $this, $radius) { $j=0; $out=""; $td='<td>'; if (($this-$radius)<1) $i=1; else $i=$this-$radius; if ($i==1) $i++; if (($count-($radius*2+1))<$i) $i=$count-($radius*2+1); if ($i<2) $i=2; if ($this!=1) $out.=$td.'<a href="article.php?page_list=1">1</a></td>'; else $out.=$td.'1</td>'; if ($i>2) $out.=$td.'...</td>'; while ((($i<=($this+$radius)) or ($j<($radius*2+1))) and ($i<$count)) { if ($i!==$this) $out.=$td.'<a href="article.php?page_list='.$i.'">'.$i.'</a></td>'; else $out.=$td.$i.'</td>'; $i++; $j++; } if ($i<$count) $out.=$td.'...</td>'; if ($count>1) { if ($count!=$this) $out.=$td.'<a href="article.php?page_list='.$count.'"> '.$count.'</a></td>'; else $out.=$td.$count.'</td>'; } return $out; } // постраничная навигация $art_query = mysqli_query($connect,"SELECT * FROM dpn_log"); $count_list=floor((mysqli_num_rows($art_query)-1)/5)+1; if (is_numeric($_GET[page_list]) and $_GET[page_list]>0) { if ($_GET[page_list]>$count_list) $page_list=$count_list; else $page_list=$_GET[page_list]; } else $page_list=1; if ($page_list==0) $page_list=1; //menu echo '<table cellspacing="10" cellpadding="5">'; echo '<tr>'; echo '<td>'; if ($page_list>1) echo '<a href="article.php?page_list='. ($page_list-1).'">Назад</a>'; else echo 'Назад'; echo '</td>'; echo col_pages((int)$count_list, (int)$page_list, 3); echo '<td>'; if ($page_list<$count_list) echo '<a href="article.php?page_list='. ($page_list+1).'">Следующая</a>'; else echo 'Следующая'; echo '</td>'; echo '</tr>'; echo '</table>'; // код категорий echo "<div width: 800px;'>"; $cat_query = mysqli_query($connect, "SELECT * FROM `dpn_log_categories`"); //список существующих категорий while($cat = mysqli_fetch_array($cat_query)) { $cat_num[] = $cat['id']; //список существующих категорий $cat_title[] = $cat['title']; //названия категорий } if($_GET['cat']) { //если указан get-параметр 'cat' if(!in_array($_GET['cat'], $cat_num) && $_GET['cat'] != 'all') { //если такой категории не существует header('location: /article.php'); } else { //если существует $cat = ($_GET['cat'] != 'all') ? 'WHERE cat='.$_GET["cat"] : ''; } } $art_query = mysqli_query($connect,"SELECT * FROM dpn_log $cat"); //запрос к базе for($i=-1; $i<sizeof($cat_num); $i++) { //вывод меню if($i == -1) { $title = 'Все статьи'; //название пункта меню $class = (!in_array($_GET['cat'], $cat_num)) ? "active" : "notactive"; $href = 'all'; //ссылка } else { $title = ''.$cat_title[$i]; //название пункта меню $class = ($_GET['cat'] == $cat_num[$i]) ? "active" : "notactive"; //проверяем активный ли это пункт меню $href = $cat_num[$i]; //ссылка } echo '<p><a class="'.$class.'" href="/article.php?cat='.$href.'">'.$title.'</a></p>'; //вывод пункта меню на страницу } if($art_query) { //если есть статьи выводим их на экран while ($art = mysqli_fetch_array($art_query)) { $articles[$art['cat']][] = array('title' => $art['title'], 'text' => $art['text'], 'page' => $art['page']); } if($articles) { foreach ($articles as $key => $value) { //echo '<h1>Статьи из категории: '.$cat_title[$key].'</h1>'; //echo '<h1>Статьи из категории: '.$key.'</h1>'; foreach ($value as $art) { echo'<h3>'.$art['title'].'</h3><div>'.$art['text'].'</div>'; } } } else { echo 'Статей не найдено!'; } } echo "</div>"; // постраничная навигация $art_query = mysqli_query($connect,"SELECT * FROM dpn_log LIMIT ".($page_list*5-5).",5"); $number = mysqli_num_rows($art_query); for ($n=1; $n<=$number; $n++) { $art=mysqli_fetch_array($art_query); // Оформление и вывод !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! (не нужен, так как есть уже в коде категорий) //echo '<h3>'.$art['title'].'</h3>'; //echo '<div>'.$art['text'].'</div>'; } ?> 1. На странице без категорий, т.е при обращении к странице article.php, должно быть так : Код (Text): http://site.ru/article.php при клике на ссылку 2 (2 страницу) так : Код (Text): http://site.ru/article.php?page_list=2 и т.д. (http://site.ru/article.php?page_list=3) 2. На странице с категориями, в данный момент у меня их 4 + cat=all Код (Text): http://site.ru/article.php?cat=1 http://site.ru/article.php?cat=2 http://site.ru/article.php?cat=3 http://site.ru/article.php?cat=4 http://site.ru/article.php?cat=all при переходе на ссылку 2 должно быть http://site.ru/article.php?cat=1?page_list=2, но здесь я точно не знаю. Как видно из кода, у меня страницы разбиваются по 5 статей, вставка из основного кода : Код (Text): // постраничная навигация $art_query = mysqli_query($connect,"SELECT * FROM dpn_log"); $count_list=floor((mysqli_num_rows($art_query)-1)/5)+1; if (is_numeric($_GET[page_list]) and $_GET[page_list]>0) { if ($_GET[page_list]>$count_list) $page_list=$count_list; else $page_list=$_GET[page_list]; } else $page_list=1; if ($page_list==0) $page_list=1; // остальной код // постраничная навигация $art_query = mysqli_query($connect,"SELECT * FROM dpn_log LIMIT ".($page_list*5-5).",5"); $number = mysqli_num_rows($art_query); for ($n=1; $n<=$number; $n++) { $art=mysqli_fetch_array($art_query); // Оформление и вывод //echo '<h3>'.$art['title'].'</h3>'; //echo '<div>'.$art['text'].'</div>'; } Надеюсь, что более или менее смогла объяснить, что требуется. У меня данный код отлично работает надругих страницах, а на странице article.php никак не получается, так как вы помогли с кодом категорий, да и ранее я категориями не работала совсем. Ещё раз вас с праздником и заранее благодарна.
Спасибо! Вот этот кусок кода: PHP: $art_query = mysqli_query($connect,"SELECT * FROM log $cat"); //запрос к базе Замените на это: PHP: $art_count = mysqli_fetch_array(mysqli_query($connect,"SELECT COUNT(1) FROM log $cat")); //количество статей $pag_num = 2; //количество выводимых на странице статей $pag_pages_num = ceil($art_count[0]/$pag_num); //количество страниц $current_page = (is_numeric($_GET['page_list'])) ? $_GET['page_list'] : '1'; //текущая страница $current_cat = (!in_array($_GET['cat'], $cat_num) && $_GET['cat'] != 'all') ? '' : 'cat='.$_GET['cat']; //текущая категория $limit_min = $pag_num*($current_page-1); //вывести статьи от $limit = "LIMIT $limit_min, $pag_num"; //LIMIT для запроса $art_query = mysqli_query($connect,"SELECT * FROM log $cat $limit"); //запрос к базе Сам вывод блока пагинации(навигация): PHP: for($i=1; $i<=$pag_pages_num; $i++) { $bg_color = ($current_page == $i) ? 'green' : 'blue'; $href = ($current_cat) ? "$current_cat&page_list=$i" : "page_list=$i"; echo '<a href="/articles.php?'.$href.'"><div style="float:left; padding:5px; margin:2px; background-color:'.$bg_color.'; color:#fff;">'.$i.'</div></a>'; } Лучше поместить его в конец вот этого блока: PHP: if($art_query) { //если есть статьи выводим их на экран
@Sergey_Tsarev У меня складывается ощущение, что ты пишешь сайт а не она. А с ее стороны нужно задать вопрос таким образом чтобы это смотрелось типа, я уже все перепробовала, сделайте пожалуйста все вместо меня. @olga_0630 А вы Ольга не обижайтесь, но оно так на самом деле выглядит.
Здравствуйте, спасибо вам за критику. Сайт я не делаю, а только учусь и помнится вы мне сами недавно свою помощь предлагали, разве не так ? Если вы посмотрите на мой код, например, в сообщении 45 я написала его учитывая, что нигде не училась ( у меня другое образование,а web design - это моё увлечение. Пока освоила html, css, немного js и немного php), то можно сделать скидку, что есть ошибки в коде и вопросы, хотя в голове всё ещё много вопросов и мало ответов. Данная постраничная навигация у меня работает и я Сергея не просила писать код постраничной навигации, а лишь как мой код адаптировать для кода категорий, который Сергей мне помог, за что ему отдельное спасибо. Узнала (не тупо скопировала, а разобрала каждый момент, каждую новую функцию) для себя что-то новое, век живи - век учись... Данный разрабатываемый сайт, у меня на локальном компьютере и когда появляется новая информация, я проверяю как та или иная функция работает. Конечно, когда более или менее разберусь может и сделаю сайт, но пока продолжаю изучение, а если не сделаю, то кому-нибудь помогу и уж точно не буду говорить, что я всё за "тебя" делаю. P.S.: "Чем больше ты отдаёшь, то тем больше ты получаешь. Ещё раз спасибо за критику, буду знать, что не стоит делать по отношению к другим людям." --- Добавлено --- Сергей, спасибо вам большое за помощь, Ольга !!!