За последние 24 часа нас посетили 22985 программистов и 1227 роботов. Сейчас ищут 750 программистов ...

единая точка входа и чпу

Тема в разделе "PHP для новичков", создана пользователем Hovik, 21 ноя 2019.

  1. Hovik

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

    С нами с:
    22 окт 2018
    Сообщения:
    89
    Симпатии:
    0
    Привет всем, я создаю сайт в процедурном стиле и хочу сделать точка входа с чпу но как то не получается вроде все сделаю правильно но не получается
    PHP:
    1. AddDefaultCharset utf-8
    2. ErrorDocument 404 view/404
    3.  
    4.  
    5. RewriteEngine On
    6. RewriteCond %{REQUEST_FILENAME} !-d
    7. RewriteCond %{REQUEST_FILENAME} !-f
    8. RewriteRule (.*) index.php?$1 [L,QSA]
    9.  
    10. RewriteRule ^/blog/([a-z]+)/$ blog?post=$1 [L]
    а вот и index.php
    PHP:
    1. $base = '/strides.website/';
    2.  
    3.  
    4. $permit = [
    5.     'studio' => 'view/studio.php',
    6.     'about' => 'view/about.php',
    7.     'portfolio' => 'view/portfolio.php',
    8.     'blog' => 'view/blog.php',
    9.     'training' => 'view/training.php',
    10. ];
    11.  
    12.  
    13. if ($_SERVER['REQUEST_URI'] == $base) $page = 'studio';
    14.   else {
    15.     $page = substr($_SERVER['REQUEST_URI'], strlen($base));
    16.    
    17.   }
    18.  
    19.  
    20.  
    21. if (array_key_exists($page, $permit) || isset($_GET['lang'])) {
    22.     require_once 'assets/header.php';
    23.     require_once $permit[$page];
    24.     require_once 'assets/footer.php';
    25. }
    26.  
    27. else if (isset($_GET['post'])) {
    28.      require_once 'assets/header.php';
    29.    require_once 'view/blog.php';
    30.     require_once 'assets/footer.php';
    31. }
    32.     else{
    33.         header('HTTP/1.1 404 Not Found');
    34.         require_once 'view/404.php';
    35.     }
     
  2. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.794
    Симпатии:
    650
    Что не получается?
     
  3. Hovik

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

    С нами с:
    22 окт 2018
    Сообщения:
    89
    Симпатии:
    0
    на сайте есть фильтрация с гет параметром и еще мультиязычность на гет хотелось красивые ссылки типо
    domain/blog/ru вместо domain/blog?lang=ru и domain/blog/avtor вместо domain/blog?post=avtor
     
  4. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.794
    Симпатии:
    650
    Ну сделай ключи в твоем массиве двухкомпонентными, например blog/ru.

    P.S. Если ты работаешь с $_SERVER['REQUEST_URI'], вот эту всю муть можно смело в топку отправлять:
    Код (Text):
    1. ?$1 [L,QSA]
    2.  
    3. RewriteRule ^/blog/([a-z]+)/$ blog?post=$1 [L]
    Флаг L можешь оставить.

    ---

    PHP:
    1. if ($_SERVER['REQUEST_URI'] == $base) $page = 'studio';
    Ну сделай
    PHP:
    1. $permit = [
    2.   '' => 'view/studio.php',
    и потом просто, например,
    PHP:
    1. $page = strval(substr(...
    ---

    PHP:
    1. || isset($_GET['lang'])
    Что это? почему просто ИЛИ?

    ---

    Код (Text):
    1. require_once
    Используй абс. пути, например ROOT_PATH.'assets/header.php' (хотя подобную фигню лучше убрать из корня; в assets обычно лежат клиентские скрипты и прочий статик обвес). По этой же схеме можно использовать относительные пути, имеющие спец. назначение, когда константа содержит пустую строку (см. этот коммент).

    ---

    Из $_SERVER['REQUEST_URI'] нужно прежде выделить путь (отделить строку параметров). Например, как показано тут.
    --- Добавлено ---
    P.P.S. Вообще с языком нужно думать. У нас обычно разные языковые версии на разных (под)доменах располагаются. На разных, Карл. Возможно, вариант с GEТ-параметром для тебя будет более удачным. Или на худой конец используй первый компонент пути, а не последний.
    --- Добавлено ---
    Что касается фильтрации и роутинга, есть такой подход сразу выделять из адреса отдельные компоненты пути и значения GET-параметров. Я упрощенно писал про фильтрацию с использованием этого подхода здесь:
    https://gency.ru/filter-items-by-level-of-hierarchy
    https://gency.ru/filter-items-by-two-independent-properties
    --- Добавлено ---
    Хотя нет. Для тебя это пока лишняя инфа, т.к. ты только по одному значению фильтруешь. Лучше здесь запросы посмотри:
    https://gency.ru/g-drive-blog
     
  5. Hovik

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

    С нами с:
    22 окт 2018
    Сообщения:
    89
    Симпатии:
    0
    извини но мне не понятно почему регулярко не работает
     
  6. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.752
    Симпатии:
    1.322
    Адрес:
    Лень
    все это заменит магическая функция https://www.php.net/manual/ru/function.parse-url.php
     
  7. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.794
    Симпатии:
    650
    Какое «регулярко»?
     
  8. Hovik

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

    С нами с:
    22 окт 2018
    Сообщения:
    89
    Симпатии:
    0
    в htaccess RewriteRule ^/blog/([a-z]+)/$ blog?post=$1 [L]
    --- Добавлено ---
    оно должно преобразовать путь не так ли?
     
  9. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.794
    Симпатии:
    650
    Я в курсе, что есть такая. И даже когда-то пытался тебе объяснить, почему в коде моей статьи про ед. точку входа она не используется.
     
  10. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.752
    Симпатии:
    1.322
    Адрес:
    Лень
    напомни.
     
  11. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.794
    Симпатии:
    650
    Зачем тебе это. Ты же используешь в скрипте $_SERVER['REQUEST_URI']. Лучше выкинь все лишнее из .htaccess. Это лишняя завязка скрипта на конфиги сервера.
     
  12. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.752
    Симпатии:
    1.322
    Адрес:
    Лень
    зачем дополнительные педали крутишь в велосипед ?
    Код (Text):
    1. AddDefaultCharset UTF-8
    2.  
    3. DirectoryIndex index.php
    4.  
    5. RewriteEngine On
    6.  
    7. # Redirect Trailing Slashes If Not A Folder...
    8. RewriteCond %{REQUEST_FILENAME} !-d
    9. RewriteRule ^(.*)/$ /$1 [L,R=301]
    10.  
    11. # Handle Front Controller...
    12. RewriteCond %{REQUEST_FILENAME} !-d
    13. RewriteCond %{REQUEST_FILENAME} !-f
    14. RewriteRule ^ index.php [L]
    принимаешь все:
    PHP:
    1. $_SERVER['REQUEST_URI']
    Разбираешь:
    https://www.php.net/manual/ru/function.parse-url.php

    Все !
    --- Добавлено ---
    С пост запросами определяешь:
    PHP:
    1. $_SERVER['REQUEST_METHOD'] == 'POST'
    2.  
    3. else
    4.  
    5. ...
     
  13. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.794
    Симпатии:
    650
    Я спать. Вкратце: чтобы была возможность ловить адреса формата /path? (только с вопросом на конце, без «тела» строки параметров).
     
  14. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.752
    Симпатии:
    1.322
    Адрес:
    Лень
    для чего ловить ?
     
  15. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.794
    Симпатии:
    650
    @Hovik, короче работай напрямую с исходными адресами без лишних искажений/преобразований. Это круто, например для той же фильтрации:
    / или /blog – список без фильтрации – не добавляется доп. условие на выборку
    /author/mike – фильтрация по автору – добавляется доп условие `author`='mike'
    /category/php-mysql-faq – фильтрация по категории – добавляется доп условие `category`='php-mysql-faq'

    В последних двух строчках значения (как и имена) полей берутся для запроса прямо из пути. (На самом деле это не совсем так, но об этом потом расскажу, если будет интересно.)
    --- Добавлено ---
    Для чего потребуется. Даже если не потребуется, чтобы просто различать /path и /path?
     
  16. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.752
    Симпатии:
    1.322
    Адрес:
    Лень
    o_O Странно...
    PHP:
    1. $url = 'http://www.writephponline.com/path?';
    2.  
    3. $this -> u = parse_url ( $url );
    4.  
    5. if ( strpos ( $url, '?' ) !== false ) {...}
     
  17. Hovik

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

    С нами с:
    22 окт 2018
    Сообщения:
    89
    Симпатии:
    0
    вот фильтрация
    PHP:
    1. function selectBlog($request , $id = FALSE ){
    2. $request = 'SELECT * FROM admin_post_add';
    3.  
    4.       if ($id) {
    5.             if ($id == 'hovik') {
    6.         $request .= " WHERE post_author = 'Hovik Ghambaryan' LIMIT 5";    
    7.             }else if($id == 'hrach'){
    8.                 $request .= " WHERE post_author = 'Hrach Poxosyan'";
    9.             }else if($id == 'armine'){
    10.                 $request .= " WHERE post_author = 'Armine Saroyan'";
    11.             }else if($id == 'all'){
    12.                 $request = "SELECT * FROM `admin_post_add`";  
    13.             } else{
    14.             echo '<h3 class="text-center w-100">something is wrong the participant has no posts</h3>';
    15.                 exit();
    16.             }
    17.            
    18. }
    19.   global $conn;
    20.   $posts = $conn->query($request);
    21.   return $posts;
    22. };
    --- Добавлено ---
    а это в блог.пхп
    PHP:
    1. $postsAll = 'SELECT * FROM `admin_post_add`';
    2. if(isset($_GET['post'])){
    3.    
    4.     $id = strip_tags($_GET['post']);
    5.     $posts = selectBlog($postsAll, $id);
    6. }
    7. else{ $posts = selectBlog($postsAll); }
     
  18. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.794
    Симпатии:
    650
    @MouseZver, и чЁ? Когда потребуется, там по логике вопрос должен быть частью компонента пути. Но ты пиши, потому что использование в представленном мной коде (условия с) $_SERVER['QUERY_STRING'] тоже не айс. Дам ссылку на твои труды, кому надо. Спасибо за внимание.
    --- Добавлено ---
    @Hovik, ты при добавлении очередного автора собираешься в код лезть? :)

    Про GET-параметры тебе уже тут много написали.
     
  19. Hovik

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

    С нами с:
    22 окт 2018
    Сообщения:
    89
    Симпатии:
    0
  20. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.794
    Симпатии:
    650
    К пред посту. Короче рассказываю, как это работает на сайте по многочисленным представленным в этой теме ссылкам (за которые прошу прощение у всех присутствующих; я обычно не «спамлю» так нагло :D).

    Для страницы по адресу /author/mike сначала идет запрос к таблице авторов для выбора записи по слагу mike (он обычно выполняется движком автоматом, поэтому программист конкретного сайта особо не парится, как это происходит). Запрос возвращает в том числе и числовой id автора, по кот. программист уже делает выборку принадлежащих этому автору, т.е. в данном случае мне, материалов. В статье (и комментах) по последней ссылке моя жена вроде бы об этом подробно писала.

    Я это понял. Говорю, не надо преобразовывать /blog/hovik в /blog?post=hovik, но в общем дело твое. Думал, что ты сюда за советом пришел, а не просто показать, чего добился ;)
    --- Добавлено ---
    Видел эту демку?
    http://g09.ru/gency-demo-2/single-entry-point?p=1
    (вместо single-entry-point можешь написать hovik и т.п.)
     
  21. Hovik

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

    С нами с:
    22 окт 2018
    Сообщения:
    89
    Симпатии:
    0
    конечно я за советом пришел сюда и принимаю ваши советы спасибо вам :)
     
  22. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.794
    Симпатии:
    650
    Вообще адресация – это важный момент при разработке сайта. Лучше сразу продумать адреса различных типов страниц. Даже немного наперед, когда их все сразу создавать не собираешься. Например, ты для фильтра по авторам выбрал формат /blog/тут_автор, но ты уверен, что у тебя, например, не будет в блоге фильтра по категориям, для которого адрес этого формата (/blog/тут_категория) может быть более предпочтителен? Или ты будешь вперемешку для обоих фильтров использовать один и тот же формат адреса (это сложнее технически)?
     
  23. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.752
    Симпатии:
    1.322
    Адрес:
    Лень
    а в чем причина нехотелки - проверить на существовании "?" в сыром урл, а после выполнять нужные действия, чем городить регулярки/лишние движения ?
     
  24. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.794
    Симпатии:
    650
    Я точно не знаю. Тот код писал не я. Как выше написал, там основная задача – не просто 404-ую выдать для путей с завершающим вопросом, а чтобы этот вопрос мог быть частью последнего компонента пути, например для /a/b? чтобы выделялись a и b?, но в общем конечно можно как-то по-другому проверять наличие этого вопроса и, если он есть, добавлять его в конец последнего компонента (когда вопрос «съедается» при выделении компонентов).

    А почему ты упорно навязываешь parse_url для разделения пути и строки параметров, когда для этого есть более простая ф-ция, я понять не могу. Название parse_url хорошо ассоциируется с выполняемым действием? Или просто хочешь, чтобы у всех было, как у тебя? :) Web-серверы, кстати, это делают более лаконичными ф-циями, больше похожими на explode('?', $_SERVER['REQUEST_URI'], 2).
     
  25. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.752
    Симпатии:
    1.322
    Адрес:
    Лень
    процитируй мое сообщение об навязывании.
    Напомнил про милторга, который в свою очередь делает те же действия, только через регулярку все гонит.
    • Ты дробишь php одной функцией - explode
    • Я дроблю сразу на части без возни дальнейшей - php одной функцией

    • Дальше, тебе нужно работать с патчем... Снова действие... снова вызов функции для дробления.
    • У меня же - все готово для дальнейшего прогона.
    Пурпурно - фиолетово. Лишь узнаю логику других действий, почему так а не так.
    На сколько помню, мы через это проходили и через n-месяцев, пишешь противоположную принадлежность часть продукта.