За последние 24 часа нас посетили 52377 программистов и 1797 роботов. Сейчас ищут 813 программистов ...

Динамические ссылки через isset($_GET)

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

  1. Uint32

    Uint32 Новичок

    С нами с:
    16 дек 2018
    Сообщения:
    45
    Симпатии:
    1
    День добрый. Итак, если у меня имеется 10 ссылок для какого-нибудь меню, ниже приведенный код справляется на ура.
    PHP:
    1. $test = isset($_GET['test'])
    2. домен/?page&test  -  сама ссылка
    3. if ( $test )
    4. { echo "Заработало!"; }
    Но как мне быть, если таких ссылок будет столько, сколько создастся строк в БД ? Мне нужно как-то привязать на конце ссылки, id строки в базе данных. Т.е вместо test должен подставляться айди строк из бд.
    При попытке подставить переменную после амперсанта, переменная ничего не отображает, ссылка высвечивается так: "домен/?page&"

    PHP:
    1. $test = $data['id'];
    "домен/?page&<?$test ?>"

    Хелп ме
     
  2. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.861
    Симпатии:
    657
    Берите id из адреса и по нему ищите. Только поаккуратнее, без дыр в безопасности.

    Можно уже начало адреса (первый компонент пути) связывать с таблицей в БД, только тут лучше использовать символьные идентификаторы (по крайней мере в адресе). См. описание используемой во многих наших движках простой модели данных. В частности может быть полезно для коротких ссылок, например u75.ru/firefox (использовал именно тот скрипт, который описан в статье по ссылке).
     
  3. Uint32

    Uint32 Новичок

    С нами с:
    16 дек 2018
    Сообщения:
    45
    Симпатии:
    1
    Что значит брать айди из адреса, на примере можно?
     
  4. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.861
    Симпатии:
    657
    Ну например http://gency.ru/comment/69 (69 – это числовой id в адресе; парсите как-нибудь адрес, чтобы его извлечь, и подставляете в запрос к БД).

    P.S. Естественно, символьные идентификаторы (слаги) тоже можно использовать не только в первом компоненте пути, что сейчас оч. распространено, например: http://g09.ru/articles/my-first-article (что не отменяет использование числовых id для «внутренних» нужд).
    --- Добавлено ---
    В этой статье я показал простейший пример парсинга. Результат см. там же во второй демке.
    --- Добавлено ---
    Вот, например: http://g09.ru/gency-demo-2/69 (идентификатор 69 будет отдельно показан на странице по ссылке).
     
  5. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.861
    Симпатии:
    657
    Эээ... Может, вы просто не знаете, как использовать GET-параметры. Обычно GET-параметр в адресе имеет вид name=value. В коде можно обрабатывать так:
    PHP:
    1. $testvalue = isset($_GET['test'])?$_GET['test']:'undefined';
    Или так:
    PHP:
    1. $testvalue = $_GET['test']??'undefined';
    Но с путями симпатичнее – нет лишней избыточности, когда она не нужна:
    /page/69
    /test/69

    Можно использовать и смешанный вариант, парся весь адрес, используя целиком всю строку параметров и т.п.:
    /page?69 (69 занимает всю строку параметров, т.е. это значение $_SERVER['QUERY_STRING'] в строковом формате).
     
    #5 miketomlin, 22 мар 2019
    Последнее редактирование: 22 мар 2019
  6. Uint32

    Uint32 Новичок

    С нами с:
    16 дек 2018
    Сообщения:
    45
    Симпатии:
    1
    Так конкретно в моем примере, что я не так сделал ? Или в моем не хватает информации?
     
  7. Uint32

    Uint32 Новичок

    С нами с:
    16 дек 2018
    Сообщения:
    45
    Симпатии:
    1
    Все дело в том, что мне не только нужно сформировать ссылку по какому либо параметру из БД, но так же и проверить ее на нажатие.
    Если пользователь не кликнул по ссылке - условие и контент один, если нажал - другой контент и условие.
    Ссылка на статью про чпу, вообще к теме не относится, либо я чего-то недопонимаю.
    Можете на моем примере показать какой шаг был упущен ?
     
  8. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.861
    Симпатии:
    657
    Я ссылку давал не столько ради ЧПУ, сколько ради парсинга, о чем прямо написал ;)

    Какому параметру из БД? Вы конкретно про выборку записей по id писали.

    Смотрите, если у вас в строке параметров только значения и их несколько (page&test), нужно использовать парсинг, чтобы понять, что есть что, основываясь на порядке следования значений. Либо забить на порядок и использовать что-то вроде: page=page&id=test (или &id=69, или &test=69 – ХЗ, что такое у вас test).
    --- Добавлено ---
    P.S. page=page вместо вашего page нужно, чтобы не чекать десять раз при каждом запросе наличие нужного имени в адресе, а по имени параметра page взять его значение (в данном случае тоже page) и проверить его валидность за один проход, например поискать в массиве с предопределенными именами.
    --- Добавлено ---
    P.P.S. Собственный парсинг круче. Достаточно сравнить внешне page&test и page=page&id=test, а раз делать парсинг, почему бы сразу не использовать пути. Опять достаточно сравнить внешне /page/test и /?page&test (как мин. один лишний символ, слэши при обозначении иерархии лучше воспринимаются пользователями и т.д.).
     
    #8 miketomlin, 23 мар 2019
    Последнее редактирование: 23 мар 2019
  9. Uint32

    Uint32 Новичок

    С нами с:
    16 дек 2018
    Сообщения:
    45
    Симпатии:
    1
    Смотрите, на одной странице new.php1 идёт запрос вбд, все полученные данные из запроса заносятся в массив. На странице new.php2 происходит вывод контента из массива через форейч.

    Вот он выводит мне на странице new.php2 - 3 строки, из нужной таблицы, у каждой строки свой айди, пусть будет 1, 2 и 3. Т.е в переменной $data['id'] хранятся эти 3 айди. Вот что мне необходимо сделать дальше?
     
  10. Uint32

    Uint32 Новичок

    С нами с:
    16 дек 2018
    Сообщения:
    45
    Симпатии:
    1
    Дальше мне нужно в конец ссылки подставить переменную, верно?
    Домен/?new.php2&<?$data['id']?>
     
  11. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @Uint32, дальше вам нужно выкинуть всю эту муть из головы и прочесть хотя бы одну книгу.
     
  12. Uint32

    Uint32 Новичок

    С нами с:
    16 дек 2018
    Сообщения:
    45
    Симпатии:
    1
    --- Добавлено ---
    Если вы не хотите или не можете помочь - пройдите мимо молча.
    --- Добавлено ---
    В каждой выводимой строке имеется ссылка, цель при ее активации - скрыть остальные 2 строки, не уходя со страницы new.php2.
     
  13. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.861
    Симпатии:
    657
    @Uint32, вы в простых понятиях как-то плаваете (или просто с точностью формулировок проблемы), поэтому Valick отчасти прав. Мне тоже местами трудно понять, что именно вы имеете в виду. Поясню ниже.
    Если это действительно разные страницы, то во второй массив виден не будет. Если это два разных файла, участвующие в обработке одного запроса, то они должны быть как-то взаимосвязаны.
    Одновременно три разных id в одной переменной? Может, по очереди в том же цикле? Или, может, уже на странице конкретной записи?

    Вы наверно спрашиваете Как сделать вывод списка статей? Да?

    Нужно же еще потом и обрабатывать такие запросы. Я в основном об этом/с расчетом на это вам писал. Шорттэг для вывода – это не <?, а <?= ;)
    --- Добавлено ---
    Ну все понятно. Действительно не мешает почитать про основные принципы HTTP. На второй «странице» (на самом деле для каждого значения id будет отдельная страница, но код для их вывода будет один и тот же) массив уже будет недоступен. Нужно делать отдельное подключение к БД, отдельный запрос и т.д.
    --- Добавлено ---
    P.S. В статье по ссылке я ничего кроме шаблона не пишу для отдельной статьи, но это только потому, что используемый каркас все это делает автоматом, включая выборку по id из БД. Но вам все это нужно делать самому. Я об этом там подробно в комментах писал.
    --- Добавлено ---
    P.P.S. Реально не уходя со страницы – это AJAX или селективное отображение блоков на JS, но вам 100% об этом еще рано думать. Уверен, вы подразумеваете под словами «не уходя со страницы» адреса вроде /?page и /?page&test. На самом деле это разные страницы. Одной страницей еще можно назвать страницу, отличающуюся только якорями в адресах (#bla-bla-bla), и то тут много разных трактовок.
     
  14. Uint32

    Uint32 Новичок

    С нами с:
    16 дек 2018
    Сообщения:
    45
    Симпатии:
    1
    Все верно, подразумеваю именно такую /?page&test Только вместо test - идентификатор, в этом примере 1 или 2 или 3.
     
    #14 Uint32, 23 мар 2019
    Последнее редактирование: 23 мар 2019
  15. Uint32

    Uint32 Новичок

    С нами с:
    16 дек 2018
    Сообщения:
    45
    Симпатии:
    1
    Вот, изменил кое-что, теперь при наведении на ссылку - показывает нужный айди. Но условие всегда возвращает ложь.. А при клике, ничего не изменяется.

    PHP:
    1. $id = (int)$data["id"];
    2. if (  isset( $_GET["id"] ) && (int)($_GET["id"] == $id )  )
    3. {
    4.     echo "true";
    5. }
    6. else
    7. {
    8.     echo "feil";
    9. }
    /?page&<?=$id?>

    П.с Причем, если в таблице 5 строк, он выведет "feil" - 5 раз.
     
    #15 Uint32, 25 мар 2019
    Последнее редактирование: 25 мар 2019
  16. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.861
    Симпатии:
    657
    Еще раз: на странице конкретной записи обычно нет никакой $data, пока вы не выберите соотв. запись отдельным запросом (тут обычно нет необходимости выбирать сразу несколько записей, как для списка).
    PHP:
    1. if (isset($_GET['id']))
    2. {
    3.     $id=(int)$_GET['id'];
    4.     и только потом запрос с использованием $id
    5. }
    6. else
    7. {
    8.     а это ветка для (запроса к БД/вывода) списка записей
    9. }
    --- Добавлено ---
    P.S. Чтобы можно было обращаться к параметру по имени, его нужно оформлять в адресе так: id=100500, о чем я уже писал.
    --- Добавлено ---
    P.P.S. Если вы сделаете &100500, у вас, естественно, никакого GET-параметра id не будет, будет 100500 :)

    Короче, вы ни то что книжки не хотите читать, но и услышать меня у вас не получается.