Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Про ЧПУ и не только.. [7]

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (9): « 1 2 3 4 5 6 [7] 8 9 »   

> Описание: Малюсенькая статейка.
DeepVarvar Супермодератор
Отправлено: 06 Мая, 2013 - 20:09:08
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Незачем записывать "текущий УРЛ" в сессию, он и так текущий.
В чем смысл этих действий?
Или ты имел виду что точка добавления комментариев у тебя находится, напимер, на "/comments/add", а сам комментируетмый материал на "/a/b/c/d", и тебе типа надо пройти после добавления комментария на этот "/a/b/c/d" ?
 
 Top
Морозов Семен
Отправлено: 06 Мая, 2013 - 20:53:33
Post Id



Гость


Покинул форум
Сообщений всего: 105
Дата рег-ции: Март 2012  


Помог: 0 раз(а)




DeepVarvar пишет:
Незачем записывать "текущий УРЛ" в сессию, он и так текущий.
В чем смысл этих действий?
Или ты имел виду что точка добавления комментариев у тебя находится, напимер, на "/comments/add", а сам комментируетмый материал на "/a/b/c/d", и тебе типа надо пройти после добавления комментария на этот "/a/b/c/d" ?


Предположим, имеется страница c ЧПУ $params[0]=page_1, на этой странице находится статья со списком комментариев и формой добавления нового комментария,
при чем комментарии записываются в таблицу бд, содержащую следующие столбцы:
1. id //номер коммента AI
2. link //Это как раз-таки page_1, т.е. ЧПУ страницы, которую комментируют, по которому комментарий и определяет свою страницу при выборке из бд
3. date // дата добавления
4. id_author // id пользователя(автора коммента)
5. text // собственно сам коммент (текст коммента)

А чтобы передать обработчику эту ссылку, и используется механизм сессий,
Я конечно подумал, может отказаться от такой затеи,
и просто передать в поле input hidden эту ссылку, но опять же возможен и такой вариант: какие-нибудь "гавнюки" набьют базу данных нехорошей информацией, прочитав и изменив это поле через браузер

А сессию прочитать не каждый школьник сможет, но это я грубо выразился.

Кстати, я нашел причину, из-за которой в сессию не добавлялся $_SERVER['QUERY_STRING'] и $params[0]
Оказывается это класс шаблонизации, которым я пользуюсь, и который стащил отсюда, спасибо огромное автору за этот класс, работает отлично:
http://www.php.su/articles/?cat=...les&page=006

Но вот как он воздействует на добавление в сессию $_SERVER['QUERY_STRING'] я никак не могу понять, причем $_SERVER['SERVER_NAME'] в сессию добавляется без проблем
(Добавление)
Я вот подумал, и нашел альтернативу методу, описанному выше, использовать в обработчике добавления коммента $_SERVER['HTTP_REFERER'], останется только из ссылки убрать http://mysite[dot]com/ и оставить только page_1 и записать её в базу, а после добавления коммента пользователя редиректом отправить на страницу, где он оставил коммент:
PHP:
скопировать код в буфер обмена
  1. header('Location: '.$_SERVER['HTTP_REFERER']);
 
 Top
caballero
Отправлено: 06 Мая, 2013 - 21:08:21
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




а как класс шаблонизации вообще связан с добавлением чего то в сессию? работа шаблонизатора - уже в конце когда данные собраны разложены и обработаны


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Морозов Семен
Отправлено: 06 Мая, 2013 - 21:11:28
Post Id



Гость


Покинул форум
Сообщений всего: 105
Дата рег-ции: Март 2012  


Помог: 0 раз(а)




caballero пишет:
а как класс шаблонизации вообще связан с добавлением чего то в сессию? работа шаблонизатора - уже в конце когда данные собраны разложены и обработаны


Попробовал выключить шаблонизацию, в сессию $_SERVER['QUERY_STRING'] записался, опять включил класс - в сессии пустая переменная, я и сам удивлен
(Добавление)
Уже второй день голову ломаю по этому поводу
 
 Top
caballero
Отправлено: 06 Мая, 2013 - 21:15:49
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




а может наоборот - шаблонизатор вытирает это из сессии? впрочем смысла все равно не вижу зачем писать это в сессию. с текущей страницы либо идет переход на эту же страницу либо на другую - в обоих случаях запоминать текущий URL в сесси непонятно зачем
(Добавление)
и зачем ты пишешь URL в бд если его можно формировать на лету


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
DeepVarvar Супермодератор
Отправлено: 06 Мая, 2013 - 21:33:55
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Действительно странный шаблонизатор.
И да, я не согласен с тем что урлу надо писать в сессию.
Сделай хидден-поле с айдишником документа (или урлой, дело твое) - пусть пишут куда хотят, какя тебе разница?
Всеравно модерировать будешь.
 
 Top
Морозов Семен
Отправлено: 06 Мая, 2013 - 21:38:30
Post Id



Гость


Покинул форум
Сообщений всего: 105
Дата рег-ции: Март 2012  


Помог: 0 раз(а)




caballero пишет:
а может наоборот - шаблонизатор вытирает это из сессии? впрочем смысла все равно не вижу зачем писать это в сессию. с текущей страницы либо идет переход на эту же страницу либо на другую - в обоих случаях запоминать текущий URL в сесси непонятно зачем
(Добавление)
и зачем ты пишешь URL в бд если его можно формировать на лету


У меня в проекте не урл формируется на лету, а страница формируется на лету, согласно урл.

В базе хранятся урл, и содержимое контента, прикрученное к каждому урл

У каждого человека разный ход мыслей, кому-то удобно так, кому-то по другому, программирование - это вольный ход мыслей, я начал изучать его не по шаблону, а практически изучая это. Вот, поставил цель (сделать сайт) и двигаюсь к ней, уже больше половины сделал.


Что-то брал уже готовое, вот например http://www.php.su/articles/?cat=...les&page=006 и то, про что рассказывается в этой статье, комбинируя это + свои наработки, получается интересная структура, которая работает четко, слаженно, только везде есть свои нюансы, с которыми приходится сталкиваться
(Добавление)
DeepVarvar, в принципе, вы правы. Но я уже сделал так:
PHP:
скопировать код в буфер обмена
  1. $link = $_SERVER['HTTP_REFERER'];
  2. $link = str_replace('http://'.$_SERVER['SERVER_NAME'].'/', '', $link);

Очень рад, всё работает)) Огромное всем спасибо, скоро отправлю ссылочку на проект))
 
 Top
caballero
Отправлено: 06 Мая, 2013 - 21:49:20
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
В базе хранятся урл, и содержимое контента, прикрученное к каждому урл

а зачем прикручивать его в БД если можно прикрутить после появления запроса от пользователя. Ведь алгоритм тот же - сопоставление данных урлу.
а если к урлу какой параметр надо приписать (например язык или таймстамп или еще какую служебную инфу)- тогда все урлы с БД станут нерабочими - хотя на самом деле нужно не использовать этот параметр при формировании страницы.


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Морозов Семен
Отправлено: 06 Мая, 2013 - 21:49:59
Post Id



Гость


Покинул форум
Сообщений всего: 105
Дата рег-ции: Март 2012  


Помог: 0 раз(а)




Это был последний штрих в разработке комментов
(Добавление)
caballero пишет:
Цитата:
В базе хранятся урл, и содержимое контента, прикрученное к каждому урл

а зачем прикручивать его в БД если можно прикрутить после появления запроса от пользователя. Ведь алгоритм тот же - сопоставление данных урлу.
а если к урлу какой параметр надо приписать (например язык или таймстамп или еще какую служебную инфу)- тогда все урлы с БД станут нерабочими - хотя на самом деле нужно не использовать этот параметр при формировании страницы.


Я имею ввиду то, что урл и контент находятся в одной строке таблицы базы данных, если пользователь зашел на чпу урл, например about_me, contacts, site-map и т.д., то на страницу выводится вся инфа, связанная с этим урлом
(Добавление)
caballero пишет:
Цитата:
В базе хранятся урл, и содержимое контента, прикрученное к каждому урл

а зачем прикручивать его в БД если можно прикрутить после появления запроса от пользователя. Ведь алгоритм тот же - сопоставление данных урлу.
а если к урлу какой параметр надо приписать (например язык или таймстамп или еще какую служебную инфу)- тогда все урлы с БД станут нерабочими - хотя на самом деле нужно не использовать этот параметр при формировании страницы.


Урлу никакие параметры прикручивать не надо, это ведь ЧПУ, т.е. текст, какие вы параметры прикрутите к тексту?
(Добавление)
Кстати, я не использую вложенные чпу типа mysite.com/countries/russia/ufa и не вижу необходимости в этом, лучше это отдельно разбить на простые чпу,
типа
mysite.com/countries
mysite.com/russia
mysite.com/ufa
Для простого пользователя это лучше запомнится и волокиты для программиста меньше.
Кстати, вот код из этой статьи, и как я им пользуюсь

PHP:
скопировать код в буфер обмена
  1. // вот тут будут наши "части"
  2. $params = array();
  3. // получили строку
  4. $query_string = str_replace("q=","",trim($_SERVER['QUERY_STRING']));
  5. // на всякий случай декодируем
  6. $query_string = urldecode($query_string);
  7. // разбиваем на массив
  8. $query_params = explode("/",$query_string);
  9. // и проверяем
  10. // а вдруг в конец слеш не дописали?
  11. // да и почистим сразу от SQL-инъекций
  12. foreach ($query_params as $query_param)
  13.   if ($query_param != "")
  14.     $params[] = mysql_real_escape_string($query_param);
  15. // посмотрим что получилось
  16. //var_dump($params);
  17.  
  18.  
  19. $query_string = $params[0];
  20. if ($params[1]== true) header('Location: http://'.$_SERVER['SERVER_NAME'].'/error404');

(Добавление)
caballero пишет:
а если к урлу какой параметр надо приписать (например язык или таймстамп или еще какую служебную инфу)
Это можно прикрутить к сессии
 
 Top
DeepVarvar Супермодератор
Отправлено: 06 Мая, 2013 - 23:19:34
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Морозов Семен пишет:
это отдельно разбить на простые чпу
Ну в данном контексте возможно это и так. Тогда смысл вообще делать строковые доступы?
Лучше и быстрее будет доступ по айдишнику:

mysite.com/23
mysite.com/542345
mysite.com/1
 
 Top
sc2r2bey
Отправлено: 11 Мая, 2013 - 15:17:02
Post Id



Гость


Покинул форум
Сообщений всего: 116
Дата рег-ции: Июль 2009  


Помог: 0 раз(а)




DeepVarvar пишет:
Раз уж решил отписаться - отпишусь.
Как и обещал - простыми словами.

В связи с тем что на форуме участились вопросы по теме ЧПУ, раскрою немного эту тему.

Начнем с того, что же это такое, но с небольшим отступлением.

1. IPv4
Были времена, когда не было доменных имен.
И все сетевые ресурсы были доступны только по прямому обращению по уникальному IP-адресу.
Но ресурсов становилось все больше и больше.
Такое кол-во IP-адресов было трудно запомнить, неудобно хранить..
И люди придумали доменные имена.
Появились DNS-сервера, хранящие данные к какому IP-адресу относится доменное имя.
DNS-сервис можно сравнить с записной книжкой телефона.

Имя - номер..
Имя - номер..
Имя - номер..
Имя - номер..

Не зачем запоминать IP-адрес. Достаточно запомнить доменное имя.
Это ведь ЧЕЛОВЕЧНО Улыбка

2. ЧПУ
Ссылки динамических сайтов изначально выглядели примерно так:

http://site[dot]ru/index.php?cat=news&post=12
http://site[dot]ru/cart.php?block=or[dot][dot][dot]mp;product=65545
http://site[dot]ru/articles.php?rubr[dot][dot][dot];page=8#comments
http://site[dot]ru/registration.php?step=2

Потом кто-то задумался, по аналогии с доменными именами: "А не сделать ли и ссылки внутри сайта красивыми и ЧЕЛОВЕЧНЫМИ?"
Задумался и сделал.. Улыбка

Теперь ссылки стали выглядеть красиво, аккуратно и ЧЕЛОВЕЧНО.

http://site[dot]ru/news/12/
http://site[dot]ru/order/65545/
http://site[dot]ru/articles/657/34/page/8/#comments
http://site[dot]ru/registration/2/

Но это был только первый шаг. Ведь вроде бы для пользователя все красиво и понятно.
А как же программист? Сидеть и раскапывать сотни строчек в файле .htaccess?
Ну уж нет! Увольте! Программисту тоже нужна свобода и удобстно!

3. Единая точка входа
Вот тут и начинается рассказ об удобстве для программиста.
Итак, мы хотим прозрачно и понятно для себя самих получать данные из строки запроса и легко их обрабатывать.
Так поехали. Расскажу только один принцип для примера. Самый простой и понятный.

Мы просто ВООБЩЕ ВСЕ что к нам приходит перенаправим в один единственный файл:

.htaccess:
CODE (html):
скопировать код в буфер обмена
  1. RewriteEngine on
  2. RewriteBase /
  3. RewriteCond %{REQUEST_FILENAME} !-d
  4. RewriteCond %{REQUEST_FILENAME} !-f
  5. RewriteRule ^(.*) index.php?q=$1 [L]

Файл index.php будет единственной точкой входа для всех запросов.
Теперь обработаем полученную строку:

index.php:
PHP:
скопировать код в буфер обмена
  1. // вот тут будут наши "части"
  2. $params = array();
  3.  
  4. // получили строку
  5. $query_string = str_replace("q=","",trim($_SERVER['QUERY_STRING']));
  6.  
  7. // на всякий случай декодируем
  8. $query_string = urldecode($query_string);
  9.  
  10. // разбиваем на массив
  11. $query_params = explode("/",$query_string);
  12.  
  13. // и проверяем
  14. // а вдруг в конец слеш не дописали?
  15. // да и почистим сразу от SQL-инъекций
  16. foreach ($query_params as $query_param)
  17.   if ($query_param != "")
  18.     $params[] = mysql_real_escape_string($query_param);
  19.  
  20. // посмотрим что получилось
  21. var_dump($params);


В итоге у вас должно получится следующее:

Запрос: http://site[dot]ru/news/12/
Массив: $params = array("news","12");

Запрос: http://site[dot]ru/order/65545/
Массив: $params = array("order","65545");

Запрос: http://site[dot]ru/articles/657/34/page/8/#comments
Массив: $params = array("articles","657","34","page","8");
(по #comments браузер вообще не будет совершать запрос)

Запрос: http://site[dot]ru/registration/2/
Массив: $params = array("registration","2");

4. Заключение
Когда у вас есть массив параматров,
вы можете использовать его как параметры функций или методов классов.
Например для последнего запроса можно поступить так:
http://site[dot]ru/registration/2/

Берем первый параметр $params[0] (там "registration")
И подключаем файл содержащий код для регистрации.
PHP:
скопировать код в буфер обмена
  1. if (file_exists("modules/".$params[0].".php"))
  2.   require_once("modules/".$params[0].".php");

А сам файл может содержать все что вам надо исключительно для работы с регистрацией пользователей.
Кстати самый смысл в том, что он ведь может обработать и $params[1], скорее даже должен.
Ведь именно для него мы передаем второй параметр.

P.S.
Ну вот на самом деле даже наверное все..
Сильно не бейте - я вообще впервые взял в руки "виртуальное перо".
А вдруг получится написать нормально? Закатив глазки

а почему тогда не происходит перенаправление если ввожу в адресной строке путь к существующему файлу, так и должно быть?
ввожу www[dot]example[dot]org/module/article/index.php и этот скрипт выполняется

а за статью, спасибо, очень ценно!
 
 Top
DeepVarvar Супермодератор
Отправлено: 11 Мая, 2013 - 15:58:15
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




sc2r2bey пишет:
а почему тогда не происходит перенаправление если ввожу в адресной строке путь к существующему файлу, так и должно быть?
Потому, что именно так и написано в .htaccess:
Цитата:
Если файла или папки нет, передать строку запроса в index.php лежащий в корне сайта, пусть сам разбирает эту строку.
Соответственно при наличии "живого" файла, он пойдет до файла.

К тому же - НИКАКОГО ПЕРЕНАПРАВЛЕНИЯ НЕТ, есть только то, что .htaccess (конечно же не сам файл, а сервер apache его выполняющий) не найдя файла по указанному пути, передаст строку, которую запрашивали у него, внутрь файла index.php

Вобщем все то же самое, только другими словами.
 
 Top
sc2r2bey
Отправлено: 11 Мая, 2013 - 16:18:07
Post Id



Гость


Покинул форум
Сообщений всего: 116
Дата рег-ции: Июль 2009  


Помог: 0 раз(а)




спасибо! т.е. если мне нужно, чтоб эти файлы не обрабатывались, мне надо в них запретить прямой доступ или например 404 ошибку выводить
 
 Top
Runet4ik
Отправлено: 16 Июня, 2013 - 15:02:47
Post Id



Гость


Покинул форум
Сообщений всего: 105
Дата рег-ции: Май 2011  
Откуда: Россия


Помог: 0 раз(а)




Может не углядел интересуещее в этом топе про чпу, но хотелось бы узнать как подружить .htaccess с кириллицей?
Имееются такой url:
site.ru/company/Компания и компания/
Правило в .htaccess такое:
RewriteRule ^company/([a-zA-Zа-яА-ЯёЁ0-9\-\s]*)/?$ index.php?company=$1 [L]
но только вот для кириллицы оно не работает, для латиницы же всё отлично..
 
 Top
LIME
Отправлено: 16 Июня, 2013 - 15:10:42
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




Runet4ik кирилицы в url быть не может
только ASCII
то что ты видишь в адресной строке это браузер тебе переводит
 
 Top
Страниц (9): « 1 2 3 4 5 6 [7] 8 9 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Обсуждение статей »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB