Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.77/22: Рейтинг темы: голосов - 22, средняя оценка - 4.77
3 / 3 / 0
Регистрация: 03.10.2012
Сообщений: 50
1

Как написать адекватный маршрутизатор на php

26.11.2014, 22:26. Показов 4593. Ответов 22
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Сейчас разбираюсь в некоторых деталях php, в том числе и организации маршрутизатора.

В .htaccess переадресую все на Index.php, где подключаю автозагрузчик, который подключает и запускает роутер.

Пока идея такая:

1. Берем uri
2. Проверяем uri по базе, выявляем id и тип материала и запускаем соответствующий контроллер с нужными параметрами.

Просьба посоветовать, как еще можно организовать роутер и обозначить несовершенства такой схемы. Как это обычно работает в современных CMS.
1
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.11.2014, 22:26
Ответы с готовыми решениями:

нужно написать простой php скрипт или расказать как его написать php токо учю на примерах
что нужно от скрипта 3 поля для ввода данных 1.поле 1 2.поле 2 3.поле 3 после заполнения...

Как преобразовать картинку чтобы получить адекватный вектор входных данных для нейронной сети?
Иначе, Как преобразовать картинку к виду массива? Может кто сталкивался?

[Unity, лайфхак] Как сделать адекватный синглтон (singleton или уникальный для сцены) компонент
Что такое singleton – я надеюсь знают все. Какие цели лично я преследую при использовании...

Маршрутизатор не видит другой маршрутизатор
Доброго времени суток всем, у меня есть три роутера (№1-старый, №1-новый, №2), они были подключены...

22
Эксперт PHP
5753 / 4133 / 1507
Регистрация: 06.01.2011
Сообщений: 11,276
27.11.2014, 06:49 2
1) Получаем URL.
2) Разбиваем URL по слешу с помощью explode.
3) Вырезаем из получившегося массива первый элемент (это название класса контроллера).
4) Смотрим, есть ли файл с таким контроллером с помощью file_exists() (файлы именовать можно так, чтобы название файла соответствовало содержащемуся там классу).
5) Если файла нет - ошибка 404. Если есть - создаём экземпляр класса контроллера.
6) Вырезаем из получившегося массива второй элемент (это название метода контроллера).
7) Смотрим, есть ли такой метод в классе с помощью method_exists().
8) Если метода нет - ошибка 404. Если есть, то вызываем его и передаём в качестве аргумента оставшийся массив.
9) В методе уже проверяем, передан ли в массиве ID. Если нет (а он был обязателен) - ошибка 404. Если не обязателен - действуйте по усмотрению.
0
3 / 3 / 0
Регистрация: 03.10.2012
Сообщений: 50
27.11.2014, 17:57  [ТС] 3
по такому типу уже писал роутеры, но к сожалению не решает нужную задачу, спасибо.
0
Эксперт PHP
5753 / 4133 / 1507
Регистрация: 06.01.2011
Сообщений: 11,276
27.11.2014, 18:10 4
Цитата Сообщение от mrseo Посмотреть сообщение
2. Проверяем uri по базе, выявляем id и тип материала и запускаем соответствующий контроллер с нужными параметрами.
Т.е. Вы хотите, чтобы все URL хранились в базе и при переходе по ссылке, проверялось, есть ли в базе такой url? Интересная схема...
0
Software Developer
287 / 247 / 52
Регистрация: 23.09.2014
Сообщений: 823
27.11.2014, 21:09 5
Цитата Сообщение от mrseo Посмотреть сообщение
Проверяем uri по базе
Не лучшая идея
1
3 / 3 / 0
Регистрация: 03.10.2012
Сообщений: 50
28.11.2014, 13:58  [ТС] 6
это для фронтенда, а для админке как раз сделал по описаной схеме
0
Эксперт PHP
5753 / 4133 / 1507
Регистрация: 06.01.2011
Сообщений: 11,276
28.11.2014, 14:48 7
Цитата Сообщение от mrseo Посмотреть сообщение
это для фронтенда
Какая разница? Всё равно:
Цитата Сообщение от Custos Посмотреть сообщение
Не лучшая идея
0
3 / 3 / 0
Регистрация: 03.10.2012
Сообщений: 50
28.11.2014, 14:53  [ТС] 8
можно по подробнее почему? а как тогда вместе с ЧПУ таким образом по вашей схеме сделать. Ведь название статьи может быть и такое "Как написать парсер на php", соответственно алиас будет следующий - kak-napisatj-parser-na-php, как мне такое реализовать при описанном вами подходе?
0
Эксперт PHP
5753 / 4133 / 1507
Регистрация: 06.01.2011
Сообщений: 11,276
28.11.2014, 15:02 9
Лучший ответ Сообщение было отмечено mrseo как решение

Решение

mrseo, я не про alias говорю , а говорю, что сначала в URL передаём контроллер, затем метод контроллера (его можно опустить при желании и использовать метод по умолчанию), а только затем alias. А вот этот alias уже по БД проверять, есть ли он или нет. Но весь URL в БД хранить не надо.
2
3 / 3 / 0
Регистрация: 03.10.2012
Сообщений: 50
29.11.2014, 10:55  [ТС] 10
теперь сохраняю только алиас, но вот перед проверкой значения, берущегося из uri строки в базе как стоит проверить или обработать строку?
0
Эксперт PHP
5753 / 4133 / 1507
Регистрация: 06.01.2011
Сообщений: 11,276
29.11.2014, 11:42 11
mrseo, можно не обрабатывать специально этот alias, а просто использовать подготовленные запросы. Пример с PDO:
PHP
1
2
3
4
5
6
7
8
# Подготавливаем запрос
$stmt = $this->db->prepare('SELECT * FROM `имя таблицы` WHERE `alias` = :alias');
 
# Указываем значение
$stmt->bindParam( ':alias', $alias, PDO::PARAM_STR );
 
# Выполняем подготовленный запрос
$stmt->execute();
В $alias должен быть alias, который мы ищем.

Добавлено через 55 секунд
В таком случае никакой sql-инъекции провести не удастся.
0
3 / 3 / 0
Регистрация: 03.10.2012
Сообщений: 50
29.11.2014, 13:04  [ТС] 12
отлично, у меня в работе с бд как раз использую PDO, и в модели уже написан метод с подобным запросом, только без привязке, немножко переделаю, тогда еще 1 вопрос, если можно. А к примеру когда я с админки сохраняю также данные в базе при помощи PDO, привязку стоит делать.

И еще можно уточнить как именно этот вариант не дает sql инъекциям пролезть, благодаря использованию рпивзяки с флагом PDO::PARAM_STR ?
0
Software Developer
287 / 247 / 52
Регистрация: 23.09.2014
Сообщений: 823
29.11.2014, 14:08 13
Цитата Сообщение от mrseo Посмотреть сообщение
И еще можно уточнить как именно этот вариант не дает sql инъекциям пролезть, благодаря использованию рпивзяки с флагом PDO::PARAM_STR ?
Используй безымянные плейсхолдеры вместо именных и не мучайся.

PHP
1
2
3
4
5
# Подготавливаем запрос
$stmt = $this->db->prepare('SELECT * FROM имя_таблицы WHERE alias=?');
 
# Выполняем подготовленный запрос
$stmt->execute(array($alias));
1
3 / 3 / 0
Регистрация: 03.10.2012
Сообщений: 50
29.11.2014, 15:37  [ТС] 14
спасибо, просто мой вопрос был именно в том, как именно здесь происходит защита от инъекций, благодаря чем, получается благодаря тому, что сначала подготавливаем запрос?
0
Эксперт PHP
5753 / 4133 / 1507
Регистрация: 06.01.2011
Сообщений: 11,276
29.11.2014, 17:19 15
mrseo, мы же напрямую не вставляем полученные данные в запрос, следовательно даже если будут там неэкранированные символы - не страшно. Ведь PDOStatement реализует всё за Вас.

Добавлено через 1 минуту
Custos, я тоже хотел с начала так написать, но решил показать пример поподробнее . Может зря, а может и нет.
1
5 / 5 / 0
Регистрация: 09.11.2010
Сообщений: 58
03.12.2014, 15:26 16
Цитата Сообщение от lyod Посмотреть сообщение
говорю, что сначала в URL передаём контроллер, затем метод контроллера (его можно опустить при желании и использовать метод по умолчанию), а только затем alias. А вот этот alias уже по БД проверять, есть ли он или нет. Но весь URL в БД хранить не надо.
А почему весь url хранить в базе плохая идея? Ведь, если ЧПУ, то перед alias в ссылке наименование раздела, а не контроллера, а в разделе сайта могут быть различного типа материалы, да и alias теоретически может быть одинаковый, а разделы и страницы разные.

Объясните, пожалуйста, почему неправильно отсылать к контроллеру по полному url.

Буду очень признательна за разъяснения. Спасибо!
0
Эксперт PHP
5753 / 4133 / 1507
Регистрация: 06.01.2011
Сообщений: 11,276
03.12.2014, 15:56 17
Цитата Сообщение от Yatop Посмотреть сообщение
Ведь, если ЧПУ, то перед alias в ссылке наименование раздела, а не контроллера
Ну в MVC обычно и используют ЧПУ. Сначала идёт имя контроллера (оно же имя раздела, если хотите), потом метод (хотя метод можно и опустить и использовать метод по умолчанию).
Цитата Сообщение от Yatop Посмотреть сообщение
да и alias теоретически может быть одинаковый, а разделы и страницы разные
Вы имеете в виду, что храниться все данные для всех разделов будут в одной таблице? Обычно одна таблица для одного контроллера (вернее модели).

Простите, сейчас я сильно занят. Завтра утром может попробую объяснить.
1
5 / 5 / 0
Регистрация: 09.11.2010
Сообщений: 58
03.12.2014, 16:02 18
lyod, спасибо. Буду ждать
0
5 / 5 / 0
Регистрация: 09.11.2010
Сообщений: 58
09.12.2014, 16:02 19
lyod, прощу прощение за беспокойство Но, если у Вас появилось время, могли бы Вы внести ясность в вопрос выше?

Спасибо!
0
Эксперт PHP
5753 / 4133 / 1507
Регистрация: 06.01.2011
Сообщений: 11,276
11.12.2014, 13:49 20
Цитата Сообщение от Yatop Посмотреть сообщение
Объясните, пожалуйста, почему неправильно отсылать к контроллеру по полному url.
Потому что при использовании такого подхода будет не MVC, а неизвестный шаблон проектирования . Если Вы хотите писать, используя MVC, то нужно придерживаться стандартов этого шаблона приложения.
Потом, ситуаций может быть масса всяких разных. А если приложение разрастётся сильно? База же разрастётся до невероятных размеров, если каждый существующий url туда писать.
1
11.12.2014, 13:49
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.12.2014, 13:49
Помогаю со студенческими работами здесь

Как написать на PHP
Добрый! Вот аватарка чтобы писать свои скрипты(код или исходники) 1. Как это называется? 2. Как...

Как написать программу на php?
Привет. Читаю учебник. Там только примеры кода. Как писть не сказано. С html и css вроде немного...

Как написать код php
Yстроился на работу администратором сайта, начальство требует от меня создать форму для заполнения...

Как написать маршрутизацию PHP?
На сайте требуется показывать определенного пользователя лишь введя определенный адрес www, как в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru