[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Вывод информации из БД, имя таблицы - в переменной
neitrosha
Имеется несколько таблиц в БД, и имя таблицы передается через адресную строку.
И вот тут встает проблема, что не удается произвести запрос.
Собственно, код:

if (isset($_GET['list'])) {$list=$_GET['list']; //в данном случае попадает сюда значение furniture
$poisk = mysql_query("SELECT * FROM '$list' WHERE cath='tables'",$db);
$products = mysql_fetch_assoc($poisk);}


И тут,разумеется, встают проблемы, потому что php ругается, а что делать - непонятно, поскольку таблиц несколько и передаваться будут разные значения, а как из этих таблиц вытаскивать данные в данном случае - непонятно.
В идеале, должно получиться так:

if (isset($_GET['list'])) {$list=$_GET['list']; //в данном случае попадает сюда значение furniture
$poisk = mysql_query("SELECT * FROM furniture WHERE cath='tables'",$db);
$products = mysql_fetch_assoc($poisk);}


Как сделать так, чтобы нормально получилось получить значение из адресной строки по моему коду или же есть какой-то альтернативный и более разумный вариант?



Спустя 7 минут, 54 секунды (23.03.2012 - 17:48) Visman написал(а):
Я бы не рекомендовал подставлять имена таблиц из гет в запрос без проверки!
Массив создай с именами всех разрешенных таблиц и проверяй имя из гет на наличие в этом массиве.
Если есть, то можно и в запрос поставить.

Спустя 48 секунд (23.03.2012 - 17:48) Visman написал(а):
'$list'

-->
`$list`

Спустя 29 минут, 5 секунд (23.03.2012 - 18:17) neitrosha написал(а):
Visman.

Отлично, спасибо, идея очень понравилась

Спустя 1 час, 3 минуты, 32 секунды (23.03.2012 - 19:21) Placido написал(а):
Я делаю так. Обрамляю в запросе переменную обратными апострофами, а саму переменную, в которой лежит имя таблицы, прогоняю через str_replace() для того, чтобы исключить инъекцию. Вот так:
$list = str_replace("`", "``", $list);
$poisk = mysql_query("SELECT * FROM `$list` WHERE cath='tables'",$db);

Спустя 3 минуты, 43 секунды (23.03.2012 - 19:25) Visman написал(а):
$list = mysql_real_escape_string($list);
$poisk = mysql_query("SELECT * FROM `$list` WHERE cath='tables'",$db);

Спустя 3 минуты, 56 секунд (23.03.2012 - 19:29) Visman написал(а):
Placido, но все равно не верно, так как таблицы может не быть.
Нужна проверка через массив на допустимые имена таблиц.

Спустя 12 минут, 37 секунд (23.03.2012 - 19:41) Placido написал(а):
Цитата (Visman @ 23.03.2012 - 18:25)
$list = mysql_real_escape_string($list);
$poisk = mysql_query("SELECT * FROM `$list` WHERE cath='tables'",$db);

mysql_real_escape_string() не экранирует обратные апострофы, и поэтому в этом случае инъекция возможна, например:
$list = 'databasename` WHERE 1+1 -- ';

Спустя 1 минута, 50 секунд (23.03.2012 - 19:43) Placido написал(а):
Цитата (Visman @ 23.03.2012 - 18:29)
Нужна проверка через массив на допустимые имена таблиц.

С этим согласен.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.