За последние 24 часа нас посетил 22031 программист и 1116 роботов. Сейчас ищут 770 программистов ...

переменные

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

Метки:
  1. sizeofrawdata

    sizeofrawdata Новичок

    С нами с:
    12 окт 2019
    Сообщения:
    8
    Симпатии:
    0
    Здравствуйте All!
    Имеются ссылки вида:
    Код (Text):
    1. echo '<a href="index.php?var=besedka">Link 1</a>';
    при нажатии на ссылку передаётся параметр besedka (это имя таблицы) и обрабатывается:
    Код (Text):
    1. if(isset ($_GET['var']))
    2. {
    3.     $name_table = $_GET['var'];
    4. }
    а затем "подставляется" в запрос:
    Код (Text):
    1. $query = mysqli_query($link, 'select * from '.$name_table);
    Результаты отображаются на страницы правильно, но при попытке навигации (нажатии на 2 или другую ссылку на страницу) происходит ошибка:
    Код (Text):
    1. Notice: Undefined variable: name_table in C:\Users\main\Desktop\PHP_Projects\index.php on line 580
    Скрипт (третий вариант) для постраничного вывода использовал из:
    https://htmlweb.ru/php/example/postranichniy_vivod.php
    Думаю что необходимо сохранять значение переменной (в данном случае name_table), но как правильно это сделать?
     
  2. sizeofrawdata

    sizeofrawdata Новичок

    С нами с:
    12 окт 2019
    Сообщения:
    8
    Симпатии:
    0
    Попробовал сохранить значение переменной вот таким образом:
    Код (Text):
    1. if(isset ($_SESSION['var']))
    2. {
    3.     $name_table = $_SESSION['var'];  
    4. }
    5.     else
    6.     {
    7. if(isset ($_GET['var']))
    8. {
    9.     $_SESSION['var'] = $_GET['var'];  
    10.     $name_table = $_SESSION['var'];
    11. }
    12.     }
    в итоге переход по страницам навигации работает правильно, но значение переменной при переходе по ссылке не менятется, т.е. необходимо извлечь данные из таблицы besedka:
    Код (Text):
    1. echo '<a href="index.php?var=besedka">Link 1</a>';
    а затем :
    Код (Text):
    1. echo '<a href="index.php?var=news">Link 1</a>';
    открывается всё равно таблица besedka...
     
  3. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.825
    Симпатии:
    738
    Адрес:
    Татарстан
    А вы в курсе, что в get параметрах более одного значения передавать можно?

    ?var=news&var2=other&var3=2


    Ну и напрямую параметры из get сразу в запрос пихать, верный способ получить sql injections
     
    sizeofrawdata нравится это.
  4. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.794
    Симпатии:
    650
    @sizeofrawdata, много накрутили. Раз name_table не определена, значит не выполняется ни одно из условий ветвлений, где эта переменная определяется.
     
    sizeofrawdata нравится это.
  5. sizeofrawdata

    sizeofrawdata Новичок

    С нами с:
    12 окт 2019
    Сообщения:
    8
    Симпатии:
    0
    да, но как эту возможность использовать применительно к млей проблеме?
    а как правильно?
    --- Добавлено ---
    при первом переходе по ссылке я её передаю в запрос, а потом
    (в моём посте #2) я сохраняю её в session, но потом она там так и остаётся и попытка передать параметром другую таблицу (посредством ссылки) не работает...
     
  6. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
    твоя проблема в том, что ты не видишь проблему. :)
    зачем тебе вообще брать имя таблицы из пользовательского ввода?! я уже не говор про уязвимости, просто вообще: ЗАЧЕМ?
    --- Добавлено ---
    ну это нормально ))) стоит в одном месте применить костыли, как они потребуют новых костылей и т.д. пока не бросишь это вообще.
    --- Добавлено ---
    если тебе по каким-то условиям понадобилось использовать запросы к разным таблицам, опиши эти условия в программе и делай два разных запроса:
    PHP:
    1. if (причина) {
    2.   запрос к besedka
    3. } else {
    4.   запрос к news
    5. }
     
  7. sizeofrawdata

    sizeofrawdata Новичок

    С нами с:
    12 окт 2019
    Сообщения:
    8
    Симпатии:
    0
    прикладываю файлы... из test передаю параметр (имя табдицы) в index
     

    Вложения:

    • index.txt
      Размер файла:
      5,4 КБ
      Просмотров:
      1
    • test.txt
      Размер файла:
      245 байт
      Просмотров:
      0
  8. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
    не дошло. пойду отсюда...
     
    MouseZver нравится это.
  9. sizeofrawdata

    sizeofrawdata Новичок

    С нами с:
    12 окт 2019
    Сообщения:
    8
    Симпатии:
    0
    запросы происходят с разных страниц, могут быть и с текущей, я не знаю как описать это правильно.
    На страницах имеется меню (страницы html и php) при выборе определённого пункта необходимо отобразить данные на странице.
    Для отображения используется скрипт постраничного вывода.
     
  10. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
    попробуй забыть про меню. это второстепенный элемент и ты можешь в любой момент изменить его.

    рассуждай от страницы (ресурса): есть страница новостей, есть старницы чата и страница с домашним порно. это разные ресурсы и SQL запросы в них разные. у каждого ресурса есть свой адрес URL (universal resource locator).
    часто, но не всегда, URL указывает на отдельный php-файл — так проще поначалу понимать где что.

    вот и сделай два файла, каждый со своими данными: один для news, другой для besedka. без этой сраной магии с именем таблицы в переменной!
    и потом добавь к ним меню: в третьем файле. подключай его через include.
     
    sizeofrawdata нравится это.
  11. sizeofrawdata

    sizeofrawdata Новичок

    С нами с:
    12 окт 2019
    Сообщения:
    8
    Симпатии:
    0
    первая передача параметра besedka происходит при нажатии на ссылку:
    Код (Text):
    1. echo '<a href="index.php?var=news">Link 1</a>';
    дальше я при нажатии на ссылку необходимой страницы (постраничный вывод на этой же странице) получается передаю параметр номер страницы (для скрипта постраничного вывода), а имя таблицы из которой следует выводить результаты не передаётся (оно не сохраняется) и соответственно происходит ошибка.
    Скрипт постраничного вывода получил необходимый ему номер страницы(параметр который он сам сгенерировал), а переменная таблицы name_table нет.
    --- Добавлено ---
    думал над таким подходом, но если у меня много таблиц?...
     
  12. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
    я уже понял, что до тебя не дошло. не обязательно меня/нас в этом убеждать )))

    ешё раз: передавать имя таблицы через параметры плохо.
    а ты не экономь буквы. ты уже нагородил г* с сессиями, приготовился ещё добавить. вот она, твоя экономия.
    понимаешь, страницы всё равно должны быть разные. не получится одним запросом сделать всё.
     
    #12 artoodetoo, 12 окт 2019
    Последнее редактирование: 12 окт 2019
    sizeofrawdata нравится это.
  13. sizeofrawdata

    sizeofrawdata Новичок

    С нами с:
    12 окт 2019
    Сообщения:
    8
    Симпатии:
    0
    если так, то сделаю как вы посоветовали.
     
  14. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
    сейчас у меня в работе проект со 132-мя таблицами. как правило, для каждой таблицы в контроллере описано 7 действий (мы используем REST API и resource controller-ы) как правило, на таблицу заведено по три файла: модель, сервис, контроллер. можешь грубо прикинуть количество файлов. и это только бекенд, а есть ещё фронт.
    конечно во многом действия схожи, многое вынесено в общие классы для повторного использования. но мы никогда не занимаемся такой х*ней как подстановка имени таблицы из пользовательского ввода ))) запомни: сэкономить на спичках не получится. надо выполнить задачу и не обосраться. а сколько букв потрачено не важно.
     
    #14 artoodetoo, 12 окт 2019
    Последнее редактирование: 12 окт 2019
    MouseZver и sizeofrawdata нравится это.
  15. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.794
    Симпатии:
    650
    В принципе, если действия с разными таблицами абсолютно однотипные, то можно использовать универсальный код. Но естественно имя таблицы из адреса нужно проверять, прежде чем его пихать в запрос. У нас есть панелька, где без навеса расширений так и происходит (хотя сами действия достаточно универсальные, в большой степени учитывающие структуру таблиц, типы полей и т.п.). Суть в том, чтобы имена таблиц на входе пропускать через спец. корневую таблицу. Модель в общих чертах описана тут.
    --- Добавлено ---
    P.S. То же самое происходит и с мордой. Простейший фронт для этого описан тут.
    Фактически имена таблиц объектов для запросов берутся из корневой таблицы.
    --- Добавлено ---
    P.P.S. В общем-то ничто не мешает использовать и обычную маршрутизацию, только нужно тщательно проверять имена таблиц в шаблоне роута или использовать отдельные роуты для таблиц.
     
    sizeofrawdata нравится это.
  16. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
    то есть существует белый список?
    --- Добавлено ---
    не знаю, может быть если твоя цель написать второй phpmyadmin, то это вариант. для прикладных задач, я считаю, это обернётся только расходами. мало общего между таблицами Пользователи и Строки_Накладной. а какой профит передавать именно имя таблицы, когда показываемая сущность вообще не таблица.
     
  17. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.794
    Симпатии:
    650
    @artoodetoo, как я понял, вопрос мне адресован.

    Да, «белый список». Да, чем-то напоминает pma. Только без раздражений, которые периодически испытываешь при работе с pma :)

    Насчет расходов на прикладных задачах можно согласиться, но можно и поспорить. По сути прикладной фронт может еще на этапе роутинга подтягивать частично или полностью необходимые данные из БД, проверять существование «коллекций» и объектов в них. Для REST самое то. Какой-то тип объектов можно разместить прямо в корневой таблице (вместе со служебными «входами» для доступа к др. таблицам). В частности осн. контент главной страницы сайта можно хранить прямо в корневой таблице. Например, см. первую таблицу тут.
    --- Добавлено ---
    P.S. В админке изоляция служебных входов корневой таблицы обычно делается средствами самой СУБД (при помощи вьюшки БД), так что обычный администратор сам не поменяет имена используемых таблиц и др. важные параметры доступа к ним.
     
    #17 miketomlin, 12 окт 2019
    Последнее редактирование: 12 окт 2019
  18. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
    @miketomlin ок, спасибо. надо будет изучить ваше изделие.
    --- Добавлено ---
    О, я заработал 800-ю симпу! :)
    [ и немедленно выпил! ]

    Screenshot 2019-10-12 at 22.28.17.png
     
  19. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.794
    Симпатии:
    650
    @artoodetoo, по поводу концовки твоего пред. поста. Модель предусматривает возможность описывать при помощи «корневых входов» множества произвольных объектов, т.е. не только хранящиеся в БД. Например, тут используется только корневой вход files (я храню в нем имя ветки «File Browser»), а глубже, естественно, нет ничего общего с БД.

    Congratulations! :) И хороших выходных.
     
    #19 miketomlin, 12 окт 2019
    Последнее редактирование: 12 окт 2019
  20. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @artoodetoo, наливай, а то уйду :)
    @sizeofrawdata, то что ты в параметре передаёш имя таблицы - это уже не правильно с точки зрения организации хранения данных в БД.
    Организация архитектуры БД это 50% всей работы над проектом, потому что это фундамент всего проекта.
    Получается сейчас ты строишь дом с хреновым фундаментом. Понимаешь чем это грозит?
     
  21. sizeofrawdata

    sizeofrawdata Новичок

    С нами с:
    12 окт 2019
    Сообщения:
    8
    Симпатии:
    0
    я ответил artoodetoo что:
    to Valick:
    У меня БД c изображениями по категориям (таблицы), что вы порекомендуете по поводу правильной архитектуры (с вашей точки зрения)?
     
    #21 sizeofrawdata, 13 окт 2019
    Последнее редактирование: 13 окт 2019
  22. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @sizeofrawdata, тут совет один, отказаться от бредовой идеи создавать отдельную таблицу на каждую категорию. Изучить правила нормализации и построения архитектуры БД.
    Изображения - это сущность, которая вообще не должна знать, что она принадлежит какой-то категории. Знать о о том что категории принадлежит какое-то изображение - это "проблема" самой категории.
     
  23. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.794
    Симпатии:
    650
    @sizeofrawdata, да, даже когда нужно, чтобы они были видны как разные таблицы, в реале это обычно одна таблица. См. тут вторую таблицу (site_category) и там же вьюшки к ней. Чтобы не случилось раздвоения сознания по поводу категорий, поясню, что в примере категории являются элементами, а разделение происходит по разделам (у тебя элементами являются изображения, а разделение происходит по категориям). Короче объедини картинки в одну таблицу и добавь id категории (id самих картинок можно не менять: сделай составной ключ id картинки-id категории или наоборот, тут важен порядок).
    --- Добавлено ---
    Т.е. ты сначала можешь сделать объединение таблиц, вообще не трогая код. Потом можно сделать деконструкцию вьюшек и вместо них добавить соотв. код.
    --- Добавлено ---
    P.S. Конечно, если у тебя картинки добавляются при помощи автоинкремента, лучше их перенумеровать или добавить отдельное автоинкрементальное поле. Также можно попробовать установить автоинкрементальный счетчик объединенной таблицы в максимум среди подобных счетчиков у разрозненных таблиц.