Здравствуйте All! Имеются ссылки вида: Код (Text): echo '<a href="index.php?var=besedka">Link 1</a>'; при нажатии на ссылку передаётся параметр besedka (это имя таблицы) и обрабатывается: Код (Text): if(isset ($_GET['var'])) { $name_table = $_GET['var']; } а затем "подставляется" в запрос: Код (Text): $query = mysqli_query($link, 'select * from '.$name_table); Результаты отображаются на страницы правильно, но при попытке навигации (нажатии на 2 или другую ссылку на страницу) происходит ошибка: Код (Text): 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), но как правильно это сделать?
Попробовал сохранить значение переменной вот таким образом: Код (Text): if(isset ($_SESSION['var'])) { $name_table = $_SESSION['var']; } else { if(isset ($_GET['var'])) { $_SESSION['var'] = $_GET['var']; $name_table = $_SESSION['var']; } } в итоге переход по страницам навигации работает правильно, но значение переменной при переходе по ссылке не менятется, т.е. необходимо извлечь данные из таблицы besedka: Код (Text): echo '<a href="index.php?var=besedka">Link 1</a>'; а затем : Код (Text): echo '<a href="index.php?var=news">Link 1</a>'; открывается всё равно таблица besedka...
А вы в курсе, что в get параметрах более одного значения передавать можно? ?var=news&var2=other&var3=2 Ну и напрямую параметры из get сразу в запрос пихать, верный способ получить sql injections
@sizeofrawdata, много накрутили. Раз name_table не определена, значит не выполняется ни одно из условий ветвлений, где эта переменная определяется.
да, но как эту возможность использовать применительно к млей проблеме? а как правильно? --- Добавлено --- при первом переходе по ссылке я её передаю в запрос, а потом (в моём посте #2) я сохраняю её в session, но потом она там так и остаётся и попытка передать параметром другую таблицу (посредством ссылки) не работает...
твоя проблема в том, что ты не видишь проблему. зачем тебе вообще брать имя таблицы из пользовательского ввода?! я уже не говор про уязвимости, просто вообще: ЗАЧЕМ? --- Добавлено --- ну это нормально ))) стоит в одном месте применить костыли, как они потребуют новых костылей и т.д. пока не бросишь это вообще. --- Добавлено --- если тебе по каким-то условиям понадобилось использовать запросы к разным таблицам, опиши эти условия в программе и делай два разных запроса: PHP: if (причина) { запрос к besedka } else { запрос к news }
запросы происходят с разных страниц, могут быть и с текущей, я не знаю как описать это правильно. На страницах имеется меню (страницы html и php) при выборе определённого пункта необходимо отобразить данные на странице. Для отображения используется скрипт постраничного вывода.
попробуй забыть про меню. это второстепенный элемент и ты можешь в любой момент изменить его. рассуждай от страницы (ресурса): есть страница новостей, есть старницы чата и страница с домашним порно. это разные ресурсы и SQL запросы в них разные. у каждого ресурса есть свой адрес URL (universal resource locator). часто, но не всегда, URL указывает на отдельный php-файл — так проще поначалу понимать где что. вот и сделай два файла, каждый со своими данными: один для news, другой для besedka. без этой сраной магии с именем таблицы в переменной! и потом добавь к ним меню: в третьем файле. подключай его через include.
первая передача параметра besedka происходит при нажатии на ссылку: Код (Text): echo '<a href="index.php?var=news">Link 1</a>'; дальше я при нажатии на ссылку необходимой страницы (постраничный вывод на этой же странице) получается передаю параметр номер страницы (для скрипта постраничного вывода), а имя таблицы из которой следует выводить результаты не передаётся (оно не сохраняется) и соответственно происходит ошибка. Скрипт постраничного вывода получил необходимый ему номер страницы(параметр который он сам сгенерировал), а переменная таблицы name_table нет. --- Добавлено --- думал над таким подходом, но если у меня много таблиц?...
я уже понял, что до тебя не дошло. не обязательно меня/нас в этом убеждать ))) ешё раз: передавать имя таблицы через параметры плохо. а ты не экономь буквы. ты уже нагородил г* с сессиями, приготовился ещё добавить. вот она, твоя экономия. понимаешь, страницы всё равно должны быть разные. не получится одним запросом сделать всё.
сейчас у меня в работе проект со 132-мя таблицами. как правило, для каждой таблицы в контроллере описано 7 действий (мы используем REST API и resource controller-ы) как правило, на таблицу заведено по три файла: модель, сервис, контроллер. можешь грубо прикинуть количество файлов. и это только бекенд, а есть ещё фронт. конечно во многом действия схожи, многое вынесено в общие классы для повторного использования. но мы никогда не занимаемся такой х*ней как подстановка имени таблицы из пользовательского ввода ))) запомни: сэкономить на спичках не получится. надо выполнить задачу и не обосраться. а сколько букв потрачено не важно.
В принципе, если действия с разными таблицами абсолютно однотипные, то можно использовать универсальный код. Но естественно имя таблицы из адреса нужно проверять, прежде чем его пихать в запрос. У нас есть панелька, где без навеса расширений так и происходит (хотя сами действия достаточно универсальные, в большой степени учитывающие структуру таблиц, типы полей и т.п.). Суть в том, чтобы имена таблиц на входе пропускать через спец. корневую таблицу. Модель в общих чертах описана тут. --- Добавлено --- P.S. То же самое происходит и с мордой. Простейший фронт для этого описан тут. Фактически имена таблиц объектов для запросов берутся из корневой таблицы. --- Добавлено --- P.P.S. В общем-то ничто не мешает использовать и обычную маршрутизацию, только нужно тщательно проверять имена таблиц в шаблоне роута или использовать отдельные роуты для таблиц.
то есть существует белый список? --- Добавлено --- не знаю, может быть если твоя цель написать второй phpmyadmin, то это вариант. для прикладных задач, я считаю, это обернётся только расходами. мало общего между таблицами Пользователи и Строки_Накладной. а какой профит передавать именно имя таблицы, когда показываемая сущность вообще не таблица.
@artoodetoo, как я понял, вопрос мне адресован. Да, «белый список». Да, чем-то напоминает pma. Только без раздражений, которые периодически испытываешь при работе с pma Насчет расходов на прикладных задачах можно согласиться, но можно и поспорить. По сути прикладной фронт может еще на этапе роутинга подтягивать частично или полностью необходимые данные из БД, проверять существование «коллекций» и объектов в них. Для REST самое то. Какой-то тип объектов можно разместить прямо в корневой таблице (вместе со служебными «входами» для доступа к др. таблицам). В частности осн. контент главной страницы сайта можно хранить прямо в корневой таблице. Например, см. первую таблицу тут. --- Добавлено --- P.S. В админке изоляция служебных входов корневой таблицы обычно делается средствами самой СУБД (при помощи вьюшки БД), так что обычный администратор сам не поменяет имена используемых таблиц и др. важные параметры доступа к ним.
@miketomlin ок, спасибо. надо будет изучить ваше изделие. --- Добавлено --- О, я заработал 800-ю симпу! [ и немедленно выпил! ]
@artoodetoo, по поводу концовки твоего пред. поста. Модель предусматривает возможность описывать при помощи «корневых входов» множества произвольных объектов, т.е. не только хранящиеся в БД. Например, тут используется только корневой вход files (я храню в нем имя ветки «File Browser»), а глубже, естественно, нет ничего общего с БД. Congratulations! И хороших выходных.
@artoodetoo, наливай, а то уйду @sizeofrawdata, то что ты в параметре передаёш имя таблицы - это уже не правильно с точки зрения организации хранения данных в БД. Организация архитектуры БД это 50% всей работы над проектом, потому что это фундамент всего проекта. Получается сейчас ты строишь дом с хреновым фундаментом. Понимаешь чем это грозит?
я ответил artoodetoo что: to Valick: У меня БД c изображениями по категориям (таблицы), что вы порекомендуете по поводу правильной архитектуры (с вашей точки зрения)?
@sizeofrawdata, тут совет один, отказаться от бредовой идеи создавать отдельную таблицу на каждую категорию. Изучить правила нормализации и построения архитектуры БД. Изображения - это сущность, которая вообще не должна знать, что она принадлежит какой-то категории. Знать о о том что категории принадлежит какое-то изображение - это "проблема" самой категории.
@sizeofrawdata, да, даже когда нужно, чтобы они были видны как разные таблицы, в реале это обычно одна таблица. См. тут вторую таблицу (site_category) и там же вьюшки к ней. Чтобы не случилось раздвоения сознания по поводу категорий, поясню, что в примере категории являются элементами, а разделение происходит по разделам (у тебя элементами являются изображения, а разделение происходит по категориям). Короче объедини картинки в одну таблицу и добавь id категории (id самих картинок можно не менять: сделай составной ключ id картинки-id категории или наоборот, тут важен порядок). --- Добавлено --- Т.е. ты сначала можешь сделать объединение таблиц, вообще не трогая код. Потом можно сделать деконструкцию вьюшек и вместо них добавить соотв. код. --- Добавлено --- P.S. Конечно, если у тебя картинки добавляются при помощи автоинкремента, лучше их перенумеровать или добавить отдельное автоинкрементальное поле. Также можно попробовать установить автоинкрементальный счетчик объединенной таблицы в максимум среди подобных счетчиков у разрозненных таблиц.