За последние 24 часа нас посетили 141415 программистов и 2282 робота. Сейчас ищут 1252 программиста ...

О get-переменных в адресной строке

Тема в разделе "PHP для новичков", создана пользователем desertFox, 8 янв 2015.

  1. desertFox

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

    С нами с:
    19 окт 2013
    Сообщения:
    62
    Симпатии:
    0
    Доброго времени суток.

    Ситуация следующая..

    Допустим есть адрес страницы - http://sait.ru/forum/viewforum.php?forum_id=5&page=2
    Теперь переставляем get-переменные местами - http://sait.ru/forum/viewforum.php?page=2&forum_id=5

    Получается, что переменные также передаются, но одна и та же страница доступна по двум разным адресам.

    Можно ли задать строгий порядок следования переменных в адресной строке? У меня пока только одна идея - проверять с помощью preg_match

    Код (Text):
    1.  
    2. if(!empty($_GET['page'])) {
    3.   if(!preg_match("#\/forum\/viewforum.php\?forum_id\=(.*)\&page\=(.*)#i", $_SERVER['REQUEST_URI'])) {
    4.     require_once ('error404.php');
    5.   }
    6. }
    Но если в адресной строке много переменных - http://sait.ru/forum/viewforum.php?forum_id=5&option=3&page=2, то кол-во проверок резко увеличивается

    Код (Text):
    1.  
    2. if(!empty($_GET['page'])) {
    3.   if(!preg_match("#\/forum\/viewforum.php\?forum_id\=(.*)\&page\=(.*)#i", $_SERVER['REQUEST_URI'])) {
    4.     require_once ('error404.php');
    5.   }
    6. }
    7.  
    8. if(!empty($_GET['option'])) {
    9.   if(!preg_match("#\/forum\/viewforum.php\?forum_id\=(.*)\&option\=(.*)#i", $_SERVER['REQUEST_URI'])) {
    10.     require_once ('error404.php');
    11.   }
    12. }
    13.  
    14. if(!empty($_GET['page']) && !empty($_GET['option'])) {
    15.   if(!preg_match("#\/forum\/viewforum.php\?forum_id\=(.*)\&option\=(.*)\&page\=(.*)#i", $_SERVER['REQUEST_URI'])) {
    16.     require_once ('error404.php');
    17.   }
    18. }
    Добавил всего-то одну новую переменную а кода стало больше в три раза. Как ещё можно решить эту задачу, чтобы покороче было?
     
  2. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    1) Придумать проблему;
    2) Ломать голову над решением;

    Не надо так делать. Проблемы нет. Поисковики не будут тасовать параметры, получая тонны ссылок. Никто не будет их руками переставлять специально, чтобы вам подгадить. А их положение в строке при генерации ссылки определяете только вы.
     
  3. Ganzal

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

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

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

    С нами с:
    19 окт 2013
    Сообщения:
    62
    Симпатии:
    0
    Благодарю, понял).
    Ну как всегда пытаешься учесть все возможные варианты ошибок, вот и появляются "надуманные проблемы".

    А вот это мне очень понятно, разве поисковый робот не посчитает эти ссылки разными?
     
  5. Ganzal

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

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

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

    С нами с:
    19 окт 2013
    Сообщения:
    62
    Симпатии:
    0
    ну вот реальный пример
    правильная ссылка - http://rusfusion.ru/forum/viewforum.php?forum_id=7&rowstart=20
    неправильная - http://rusfusion.ru/forum/viewforum.php?rowstart=20&forum_id=7

    ведь поисковик эти ссылки будет считать разными, а страница одна и та же открывается
     
  7. Ganzal

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

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

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Даже если бы это имело значение, вероятность самого появления проблемы меньше 0.00000000000000000000000000000000000001.
     
  9. machetero

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

    С нами с:
    25 окт 2014
    Сообщения:
    499
    Симпатии:
    21
    Отправляй не GETом а POSTом.
     
  10. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    еще один борец за вооружение приматов разрывными снарядами...
     
  11. Period

    Period Новичок

    С нами с:
    29 дек 2014
    Сообщения:
    148
    Симпатии:
    1
    На самом деле, никаких проблем с контролем следования переменных в массиве $_GET нет. Хотите так сделать, бегите циклом по гету и сверяйте в той ли последовательности идут параметры в которой вам нужно и редиректите, если что не так, а не 404рите. Хотя как уже сказали, разницы нет. Чисто ради порядка. Зачем регулярки-то мучать?

    Есть более правильное решение: ЧПУ

    Я лично геты только для поиска использую.
     
  12. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Внимание, вопросы к автору цитаты:
    1) А для чего, собственно, по-вашему, нужен GET как таковой?
    2) И для чего нужен POST?
    3) По-вашему, POST лучше, чем GET?
    4) Зачем тогда они оба до сих пор в спецификации?
     
  13. machetero

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

    С нами с:
    25 окт 2014
    Сообщения:
    499
    Симпатии:
    21
    Для меня POST просто альтернатива GET. Почему не остался только один из них не знаю.
     
  14. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    потому что назначение у них разное))))))))) равно как и у HEAD и OPTION и так далее. такие вот у нас веб-программисты пошли. основного стандарта веба - протокола передачи гипертекста - не знают.
     
  15. machetero

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

    С нами с:
    25 окт 2014
    Сообщения:
    499
    Симпатии:
    21
    Программистом меня ещё врядли назвать можно.
     
  16. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Не знаешь что, но уже советуешь. Это не альтернатива GET ни разу. У них, как было сказано выше, принципиальное назначение разное. Ищи, читай, вникай.

    Добавлено спустя 2 минуты 51 секунду:
    Вот еще пища для ума: GET и POST не просто названия с потолка. Они осмысленные. И, вдовесок, POST - не является более продвинутой версией GET, и не появился значительно позже. Они - часть стандарта, были введены сразу вместе. Как думаешь, стали бы просто так вводить два идентичных метода, когда достаточно одного, да еще и именовать их так странно?
     
  17. desertFox

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

    С нами с:
    19 окт 2013
    Сообщения:
    62
    Симпатии:
    0
    Благодарю всех за ответы, выводы для себя сделал.

    На счёт вопроса почему GETом данные передаю.. потому что не знаю как сделать постраничную навигацию используя POST, вернее один способ уже испробовал, каждый раз результат переданных параметров сохранял в сессию, но мне такой подход показался сложным и снова много лишних проверок, проще через GET
     
  18. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    не надо делать постраничную навигацию методом пост. ну пожалуйста.
     
  19. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.132
    Симпатии:
    1.251
    Адрес:
    там-сям
    desertFox, для указания "единственно правильного адреса" используй canonical url.

    и еще, если у тебя есть форма с поиском или еще какой-то источник богатых адресов с параметрами, объяви выдачу этой формы неиндексируемой: через robots.txt или meta noindex. ибо нефиг индексировать всё подряд.
     
  20. desertFox

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

    С нами с:
    19 окт 2013
    Сообщения:
    62
    Симпатии:
    0
    artoodetoo, благодарю за подсказку, это уже активно используется на страницах с чпу-адресами,

    я только не знал, как относятся поисковики к полностью динамическим адресам, у которых просто местами переставлены переменные, ну вроде с этим разобрался
     
  21. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    тебе не всё ли равно?

    Добавлено спустя 2 минуты 39 секунд:
    ссылку можно другу кинуть, но большие данные кодировать в урл геморно и выглядит жутко. Поэтому большие данные и формы лучше отправлять постом, а если над осделать так чтобы ссылку кинуть можно было - то надо придумать с get'ом ченить.
     
  22. desertFox

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

    С нами с:
    19 окт 2013
    Сообщения:
    62
    Симпатии:
    0
    да уже понял, что в этом нет смыла))