За последние 24 часа нас посетили 14797 программистов и 1725 роботов. Сейчас ищут 1095 программистов ...

ЧПУ, mod_rewrite, MVC

Тема в разделе "PHP для новичков", создана пользователем Qumo, 19 фев 2016.

  1. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    вот. а теперь покажи как ты айдишник передаешь. и самое главное - скажи ЗАЧЕМ ты айдишник передаешь как параметр? у тебя ЧПУ или не ЧПУ?
     
  2. Qumo

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

    С нами с:
    6 июн 2013
    Сообщения:
    160
    Симпатии:
    0
    Ну ты же видел уже, как я передаю его=) Да даже без хренова ЧПУ=) Чтобы просто начал принимать id, и еще кстати lang.
     
  3. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    я тя понял. ты хочешь ЧПУ вообще без ЧПУ. хочешь фигачить аргументы запроса к несуществующим урлам. это кстати неплохая практика но ты потом поймешь чем. расскажи мне про флаг QSA в рерайтере.
     
  4. Qumo

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

    С нами с:
    6 июн 2013
    Сообщения:
    160
    Симпатии:
    0
    Для GET
     
  5. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    что для гет?
     
  6. Qumo

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

    С нами с:
    6 июн 2013
    Сообщения:
    160
    Симпатии:
    0
    Чтобы можно было передавать данные в строку запроса, или я неправильно его юзаю? я думал, что если он есть, то можно писать id и прочее в рерайте, а он их подменит, не?
    Т.е. ссылка у меня будет такая: index?id=1, а в рерайте делать подмену этой строки.
     
  7. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    у тебя рерайтер раскладывает адрес на какой-то другой адрес и различные параметры. куэса добавляет к этим параметрам изначально переданные.
     
  8. Qumo

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

    С нами с:
    6 июн 2013
    Сообщения:
    160
    Симпатии:
    0
    так вот, параметры то эти никак не могу передать в даже в адресную строку, потому что он не принимает, даже если напрямую писать ссылку: <a href="index?id=1">text</a>
     
  9. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    но из адресной строки-то они у тебя в движок попадают?
     
  10. Qumo

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

    С нами с:
    6 июн 2013
    Сообщения:
    160
    Симпатии:
    0
    Видимо нет, раз 404. У меня есть шаблон(views/template.php), по которому выглядят все страницы сайта. Т.е. ссылки меню в нем. Там я и пишу это(даже без БД, простым текстом):
    Код (PHP):
    1. [url="index?id=1"]text[/url]
    И так пробовал тоже:
    Код (PHP):
    1. [url="/index?id=1"]text[/url] 
    - с лидирующим слешем.
     
  11. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    ой, 6ля, тебе еще и про отладку надо будет рассказать... ну ты вообще... оставь в index.php (или куда у тебя там рерайтятся запросы) одну сука строку - phpinfo(); exit; и делай запросы разные. убедись что рерайтер корректно переписывает запрос. когда убедишься что у тебя входное состояние в пхп-машине всегда нужное - убери эту строку и добавь несколько строк с различными объявлениями своих там модулей и тому подобной хрени и убедись что у тебя внутреннее состояние программы соответствует твоим ожиданием. потом уже переходи к вызовам своих модулей контроллеров и прочей лапши. пока у тебя же путь мартышки с гранатой. накидал все в одну кучу. нихера не понимаешь что из этого как работает и работает ли. и просто бестолку рвешь жопу на британский флаг потому что убогий результат не соответствует высоким ожиданиям.
     
  12. Qumo

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

    С нами с:
    6 июн 2013
    Сообщения:
    160
    Симпатии:
    0
    Не будет работать этот php_info, потому что в любом случае 404. Это только усложнит задачу, как мне кажется. Где мануал именно по данному дебагу? Я знаю про просмотр исходного кода HTML, про var_dump, теперь еще про дебаг рерайтера, но не про дебаг php_info.
     
  13. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    вот ты даун. если у тебя пхп-машина приняла запрос и направила к файлу в котором вписаны эти конструкции - пхп-машина покажет инфо и сдохнет. если у тебя валится статусом 404 то ты где-то нарукожопил на этапе рерайта и соответственно тебе нужно отладить сначала тот этап разрешения запроса. где читать про дебаг? а нигде. вообще нигде. у тебя в голове должно быть представление о том какие переменные на каком этапе должны иметь какие значения. ты можешь выводить эти значения любым удобным тебе образом. тем же вардампом. но в твоем случае все усложняется тем что ты ни малейшего представления не имеешь о том как у тебя работает тобою же написанная программа. ты та самая настоящая матышка с гранатой. тяп-тяп и готово. ну а вдруг повезет. как видишь чо-то не везет. голову включи уже.

    зы пхпинфо+экзит это просто удобно набивать. видно сразу все переменные в том числе и окружение. хотя тебе-то это слово ни о чем не скажет. и выходит из исполнения. а значит прикрывает весь оставшийся в файле код. как я до этого только мог додуматься? ах ну да, Я-ТО ИМЕЮ ПРЕДСТАВЛЕНИЕ О ДАННЫХ МНЕ ИНСТРУМЕНТАХ И УМЕЮ ИХ СОЧЕТАТЬ ДЛЯ ДОСТИЖЕНИЯ РЕЗУЛЬТАТА. ЭТО И ЕСТЬ ПРОГРАММИРОВАНИЕ.
     
  14. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ты походу не понял, что тебе Ганзал вещает
     
  15. Qumo

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

    С нами с:
    6 июн 2013
    Сообщения:
    160
    Симпатии:
    0
    О, дааааа...ты изначально родился Богом php, блеать, везде голову включал, не тупил, не косячил, не имел мозги другим, ты изначально уже знал все о php, все о нем знал. Знал о всех запросах, о всех переменных в php, знал все функции php. Вообще все знал! Да, спасибо, Боженька ЯП PHP, за молву твоя.

    Добавлено спустя 1 минуту 35 секунд:
    да, я его не совсем понял. Единственное, что я понимаю из его сообщений, что он высокомерный Божок, не более пока что. Или работает учителем в каком-нибудь институте.
     
  16. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    я не брался за задачи значительно выше уровня своих знаний. я шел от простого к сложному. а ты жопу рвешь при нулевом понимании происходящего. как видишь твоя модель решения задач обосралась по полной.
     
  17. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    нет, он просто социопат.

    Тебе надо взять от любой cms файл .htaccess убрать все параметры, и все запросы рулить на index.php

    Куда уж проще.
     
  18. Qumo

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

    С нами с:
    6 июн 2013
    Сообщения:
    160
    Симпатии:
    0
    Спасибо, так понятнее=)
     
  19. Alex_1984

    Alex_1984 Новичок

    С нами с:
    10 дек 2014
    Сообщения:
    133
    Симпатии:
    0
    Код (PHP):
    1. RewriteEngine on
    2. RewriteCond %{REQUEST_FILENAME} !-f
    3. RewriteCond %{REQUEST_FILENAME} !-d
    4. RewriteRule ^(.*)$ index.php?route=$1 [L,QSA]
    5. AddDefaultCharset utf-8
    меня еще не разу не подводило ))
     
  20. Qumo

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

    С нами с:
    6 июн 2013
    Сообщения:
    160
    Симпатии:
    0
    Спасибо за ответ, но проблема несколько в другом=) У меня движок напрочь отказывается передавать id. Хоть из БД, хоть не из БД, хоть обычным кодом. Он не принимает никаких ?id или ?route или ?lang в ссылке, он(движок) редиректит сразу на 404 и все. Он понимает только название моих файлов в представлении без .php, не более.
     
  21. Alex_1984

    Alex_1984 Новичок

    С нами с:
    10 дек 2014
    Сообщения:
    133
    Симпатии:
    0
    аа, я чет не правильно понял, думал он у тебя даже на index не переходит.
    кинь код роутера своего
     
  22. Qumo

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

    С нами с:
    6 июн 2013
    Сообщения:
    160
    Симпатии:
    0
    Огромная просьба, не отвечай больше мне в моих темах. Мне неприятна твоя манера общения. Пусть даже мне в теме никто не ответит, не надо надрываться и отвечать мне сквозь оскаленные зубы. Я понимаю, что у тебя расстройство, но меня это как-то не волнует. Мне трудно потом сидеть с плохим настроением, и разбираться в своих ошибках. Спасибо за понимание!

    Добавлено спустя 31 секунду:
    Код (PHP):
    1. class Route
    2. {
    3.     static function start()
    4.     {
    5.         // контроллер и действие по умолчанию
    6.         $controller_name = 'index';
    7.         $action_name = 'index';
    8.         
    9.         $routes = explode('/', $_SERVER['REQUEST_URI']);
    10.         
    11.         // получаем имя контроллера
    12.         if (!empty($routes[1]))
    13.         {    
    14.             $controller_name = $routes[1];
    15.         }
    16.         
    17.         // получаем имя экшена
    18.         if (!empty($routes[2]))
    19.         {
    20.             $action_name = $routes[2];
    21.         }
    22.  
    23.         // добавляем префиксы
    24.         $model_name = 'Model_'.$controller_name;
    25.         $controller_name = 'Controller_'.$controller_name;
    26.         $action_name = 'action_'.$action_name;
    27.  
    28.         
    29.         // Для шаблонов пользовательских шаблонов. Подцепляем файл с классом модели (файла модели может и не быть)
    30.  
    31.         $model_file = strtolower($model_name).'.php';
    32.         $model_path = "core/models/".$model_file;
    33.         if(file_exists($model_path))
    34.         {
    35.             include "core/models/".$model_file;
    36.         }
    37.  
    38.         // подцепляем файл с классом контроллера
    39.         $controller_file = strtolower($controller_name).'.php';
    40.         $controller_path = "core/controllers/".$controller_file;
    41.         if(file_exists($controller_path))
    42.         {
    43.             include "core/controllers/".$controller_file;
    44.         }
    45.         else
    46.         {
    47.             /*
    48.             правильно было бы кинуть здесь исключение,
    49.             но для упрощения сразу сделаем редирект на страницу 404
    50.             */
    51.             Route::ErrorPage404();
    52.         }
    53.         
    54.         // создаем контроллер
    55.         $controller = new $controller_name;
    56.         $action = $action_name;
    57.         
    58.         if(method_exists($controller, $action))
    59.         {
    60.             // вызываем действие контроллера
    61.             $controller->$action();
    62.         }
    63.         else
    64.         {
    65.             // здесь также разумнее было бы кинуть исключение
    66.             Route::ErrorPage404();
    67.         }
    68.     
    69.     }
    70.     
    71.     public static function ErrorPage404()
    72.     {
    73.         $host = 'http://'.$_SERVER['HTTP_HOST'].'/';
    74.         header('HTTP/1.1 404 Not Found');
    75.         header("Status: 404 Not Found");
    76.         header('Location:'.$host.'404');
    77.     }
    78. } 
     
  23. Alex_1984

    Alex_1984 Новичок

    С нами с:
    10 дек 2014
    Сообщения:
    133
    Симпатии:
    0
    попробуй так
    Код (PHP):
    1. $request = $_REQUEST; 
    2. $route = explode('/', array_shift($request));
    в route у тебя будет массив с контроллером и экшном, а в request массив с параметрами

    я так понимаю у тебя вот тут
    Код (PHP):
    1. if(file_exists($controller_path))
    2.         {
    3.             include "core/controllers/".$controller_file;
    4.         }
    5.         else
    6.         {
    7.             /*
    8.             правильно было бы кинуть здесь исключение,
    9.             но для упрощения сразу сделаем редирект на страницу 404
    10.             */
    11.             Route::ErrorPage404();
    12.         }
    13.  
    всегда else выполняется ))
     
  24. Qumo

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

    С нами с:
    6 июн 2013
    Сообщения:
    160
    Симпатии:
    0
    Воууууу, реально пошло=))) Спасибо огромнейшее тебе=))))

    Добавлено спустя 5 минут 3 секунды:
    Нет, но оно и срабатывало, когда я передавал параметры.
     
  25. Alex_1984

    Alex_1984 Новичок

    С нами с:
    10 дек 2014
    Сообщения:
    133
    Симпатии:
    0
    ну я это и имел ввиду, у тебя в controller_file было все что после 2 слеша, включая параметры, вот файл и не находился