За последние 24 часа нас посетили 22392 программиста и 1015 роботов. Сейчас ищут 655 программистов ...

Вывод из БД по меткам

Тема в разделе "PHP для новичков", создана пользователем Kizer, 16 дек 2018.

  1. Kizer

    Kizer Новичок

    С нами с:
    19 авг 2018
    Сообщения:
    44
    Симпатии:
    0
    Привет всем, для вывода новостей из БД, в php, я использую вот этот код:
    Код (Text):
    1. SELECT * FROM news ORDER BY id DESC
    В таблице news у меня есть столбец categ в нём, как вы понимаете, записана категория.
    Как мне вывести новости, только с категорией, например sport?
     
  2. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    PHP:
    1. SELECT * FROM news WHERE categ = 'sport' ORDER BY id DESC
     
  3. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    Да, только все же в таблице новостей должны использоваться не слаги, а числовые идентификаторы категорий. Если в адресе страницы категории используется слаг, нужно его «развернуть» отдельным запросом, заодно проверив существование запрошенной категории. Тут описаны основы универсализации данного кода (один и тот же код используется для всех основных списков: общего списка, списков по категориям и списков по авторам; также может использоваться для списков комментариев без иерархии). Предварительные запросы не описаны, т.к. используемый движок их выполняет автоматом. Также не описаны присоединения (LEFT JOIN) и прочие вспомогательные запросы для получения доп. метаданных, которые не обеспечиваются автоматическими предварительными запросами (например, если в общем списке или в списках по категориям нужны метаданные авторов, то для их получения нужно присоединять таблицу авторов к осн. запросу, а вот в списках по авторам это делать не обязательно, т.к. в отдельно взятом списке автор один и его метаданные обеспечиваются предварительным запросом).
     
    AlexandrS нравится это.
  4. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    Алгоритм для обеспечения метаданных примерно такой:
    1) изначально код получает список всех признаков («автор», «категория» и т.п.), для которых нужны метаданные (обычно это слаг для формирования ссылки и имя, например для признака «автор» это может быть mike и Михаил соответственно);
    2) из списка удаляется признак, чьи метаданные получены заранее (для общего списка ничего не удаляется), и попутно расширяется список возвращаемых в основном запросе полей примерно такой строкой «, 'mike' `author_slug`, 'Михаил' `author_name`», а также добавляется условие к основному запросу « AND `author`=2» (2 – это мой числовой идентификатор);
    3) в заключение для каждого оставшегося в списке признака расширяется список возвращаемых в основном запросе полей «, `table_author`.`slug` `author_slug`, `table_author`.`name` `author_name`», а также добавляется присоединение к основному запросу « LEFT JOIN `table_author` USING(`author`)».
     
  5. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @miketomlin, узбагойся, ты ТС напугал еще своим первым сообщением, ему теперь MySQL шо Пеннивайз :D
     
  6. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    @Valick, реакция ожидаема, но не от тебя. Естественно, я это написал не только для ТСа.
    --- Добавлено ---
    P.S. В моем первом посте в теме сделано вполне конкретное и понятное замечание. А дальше уже это т.с. информация к сведению для развития.
    --- Добавлено ---
    P.P.S. Если конкретно тебя раздражает, ты скажи прямо. Один раз я это у тебя уже спрашивал, но ты сказал, что лично тебе пофиг. Соврал?
     
  7. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @miketomlin, ты видишь негатив там где его нет. Расслабся, набухайся и включи наконец отображение смайликов :)
     
  8. Kizer

    Kizer Новичок

    С нами с:
    19 авг 2018
    Сообщения:
    44
    Симпатии:
    0
    @miketomlin, Спасибо, я понял, что ничего не понял. Если в кратко, то в общей таблице в столбце категории все должно быть в числовом виде. У меня собственный движок, поэтому столько вопросов.
     
  9. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    Второе предложение тоже не понял?
     
  10. Kizer

    Kizer Новичок

    С нами с:
    19 авг 2018
    Сообщения:
    44
    Симпатии:
    0
    @miketomlin, вообще не понял к чему это и зачем
     
  11. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    Второе предложение еще относится непосредственно к твоему вопросу. Или ты слаги в адресах страниц категорий вообще не используешь и хз зачем приплел к вопросу sport, а Artur_hopf тебя в этом поддержал?
    --- Добавлено ---
    P.S. Даже при использовании примерно таких адресов /category/1 имеет смысл делать предварительный запрос, чтобы проверить существование запрошенной категории.
     
  12. Kizer

    Kizer Новичок

    С нами с:
    19 авг 2018
    Сообщения:
    44
    Симпатии:
    0
    @miketomlin, я сейчас вспомнил про возможность передавать значение переменной в url.
    Код (Text):
    1. //файл uplod.php c ссылкой ...uplod.php?template=template7&Numphotos=33
    2. $template = $_GET['template'];
    3. $Numphotos = $_GET['Numphotos'];
    Но у меня всё происходит через index.php с помощью .htaccess и при неизвестной ссылке он перенаправляет на главную. Как это исправить?
    Код (Text):
    1. RewriteEngine on
    2. RewriteCond %{REQUEST_FILENAME} !-f
    3. RewriteCond %{REQUEST_FILENAME} !-d
    4. RewriteRule . index.php
     
  13. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    Тоже не понял, о чем ты и какое отношение это имеет к теме.

    index.php – это не главная, а фронт(контроллер) или, по-другому, единая точка входа. «При неизвестной ссылке» твой движок должен генерировать 404-ую страницу.
    --- Добавлено ---
    Припиши к домену из запощенной мной выше ссылки, например, /category или /category/test и посмотри, что получится (также обрати внимание на статус ответа в консоли браузера или в каком-нибудь сервисе – будет 404, а не 200).
     
  14. Kizer

    Kizer Новичок

    С нами с:
    19 авг 2018
    Сообщения:
    44
    Симпатии:
    0
    @miketomlin, Про единую точку согласен. Теперь хочу объяснить при чем тут ссылка и .htaccess. Что бы дать человеку ссылку на стенку с статьями категории один, я хочу использовать переменную и с помощью её вывести новости данной категории. Значение переменной можно получить через ссылку, например /news?category=7 . Но вся проблема в том, что при попытке перейти на данный URL, меня перекидывает на '/' Что нужно изменить? Или дело не в .htaccess?
    --- Добавлено ---
    @miketomlin, дописал я к ссылке неизвестный адрес, ошибку не даст ибо он перекинет на страницу по деффолту
     
  15. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    Т.е. реальный редирект происходит (со сменой адреса)? В показанном .htaccess этого точно нет.
     
  16. Kizer

    Kizer Новичок

    С нами с:
    19 авг 2018
    Сообщения:
    44
    Симпатии:
    0
    @miketomlin, блин, наверное стоило в начале сказать, что я юзаю конструкцию case в php, роутер дает переменную после домена и case уже выполняет свою роль, если не нашел, то кидает на default
    --- Добавлено ---
    @miketomlin
    PHP:
    1. function route($item = 1) {
    2.     $request = explode("/", $_SERVER["REQUEST_URI"]);
    3.     return $request[$item];
    4.     define(ROOT, $_SERVER['DOCUMENT_ROOT']);
    5.     require(ROOT.'/sys/core.php');
    6.     $page = route(1);
    7.     $ext = route(2);
    8. switch($page){
    9.         case 'post':
    10.             echo '<h2>Конкретный пост</h2>';
    11.             break;
    12.         case 'news':      
    13.             $title = "Новости";
    14.             $tpl = "news";
    15.             break;
    16.         default:
    17.             $title = "Главная";
    18.             $tpl = "default";
    19.     }
    --- Добавлено ---
    @miketomlin, накинул часть кодов
     
  17. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    Ну значит код не находит и кидает. Совет: для начала при ненахождении все же выдавай 404-ую, а не делай редиркт. Редирект если и делается в подобных случаях, то только в оч. частных.
    --- Добавлено ---
    В $_SERVER["REQUEST_URI"] содержится не только путь, но и строка параметров. Вот моя статья на эту тему: Как сделать единую точку входа с ЧПУ? Там есть пример кода отделения пути от строки параметров.
    --- Добавлено ---
    Можно ограничиться только командой вроде list($p)=explode('?',$p,2); (условие перед ней нужно, только чтобы не «потерять» пути с вопросом на конце, когда вопрос есть, а строки параметров нет).
     
  18. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    Да, никакого редиректа и в помине не было – в таком случае не нужно писать «перекидывает (кидает) на '/'», можно написать «выдается (или выводится) главная». Совет: дефолтную сделать 404-ой, а не главной, и соответственно главную распознавать и выдавать в отдельной ветке. По «роутеру» куча замечаний, но не будем об этом.
     
  19. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.745
    Симпатии:
    1.319
    Адрес:
    Лень
    Ты советуешь дерьмовую инфу с адресом на дерьмо.
    Устаревшая логика, которую до сих пор советуешь.

    PHP:
    1. parse_url ( $url, PHP_URL_QUERY );
    Лучше ? Yes.

    Можешь даже в if, эту вишню провернуть. Больше дерьма не должно быть.
     
  20. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    Это насколько должны дерьмом мозги заплыть, чтобы не понимать, что во-первых показанная команда не тождественна процитированной, а во-вторых не «лучше», а по большому счету пофиг – выбирай, что больше нравится. @MouseZver, ты мне это уже писал, твое мнение учтено, выводы сделаны :)
     
  21. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.745
    Симпатии:
    1.319
    Адрес:
    Лень
    Пофиг что советуешь дальше дерьмо, и понимаешь/или нет ? Сам себе этот факт поставил, норм. Тебе сколько раз писал с аргументами, где были сделаны выводы, там или тут ? ничего не изменилось, тождественно тому, что юзать php 4 в 2к18 и понимать что все правильно делаешь, либо косить под дурочку сваливая на "пофиг".
     
  22. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    @MouseZver, что устарело, list или explode? Твоя дерьмовая ф-ция из того же четрвертого пыха, только она долго дорастала, чтобы возвращать отдельную часть адреса. И мне не нужно парсить полноформатный адрес, мне нужно из максимум двух частей получить первую часть. Что касается использования именно этого варианта в моей статье, я его выдернул из конкретного софта, а не сам написал. Но если бы ты давал норм. советы, а не поливал дерьмом мои посты по мелочам, какие-то изменения были бы выполнены в том числе и в обозначенном софте. А пока что приходится делать выводы, касающиеся совсем др. вещей.