Автор |
Сообщение |
Richard Ferlow Гуру Предупреждений : 2
|
|
Расскажу подробнее
Таблица с правами и текстовым полем
Код: |
--
-- Структура таблицы `fin_relations`
--
CREATE TABLE `fin_relations` (
`id_pole` int(11) NOT NULL auto_increment,
`id` int(11) NOT NULL default '0',
`parentid` int(11) NOT NULL default '0',
`comment` text NOT NULL,
`prava` varchar(128) NOT NULL,
PRIMARY KEY (`id_pole`),
KEY `id` (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=42 ; |
Вторая таблица
Код: |
--
-- Структура таблицы `fin_bank_name`
--
CREATE TABLE `fin_bank_name` (
`id` int(11) NOT NULL auto_increment,
`userid` int(11) NOT NULL default '0',
`bank_name` varchar(255) NOT NULL default '',
`schet` varchar(255) NOT NULL default '',
`vladelec` varchar(255) NOT NULL default '',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=8 ; |
Задача такова
В fin_relations для каждого пользователя в поле prava записаны элементы(id) через запятую, к которым он имеет доступ.
Тоесть фактически нужно
из таблицы fin_bank_name выбрать строки с такими id, которые есть в поле prava(перечисленные через запятую) для конкретного пользователя. |
|
|
|
|
BS Эксперт |
|
Ну и отлично
CREATE TABLE `fin_relations` (
`id_pole` int(11) NOT NULL auto_increment,
`id` int(11) NOT NULL default '0',
`parentid` int(11) NOT NULL default '0',
`comment` text NOT NULL,
PRIMARY KEY (`id_pole`),
KEY `id` (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT ;
REATE TABLE `prava` (
id int(11) auto_increment,
id_prava int(11) not null,
id_fin_relateons int(11) not null) |
|
|
|
|
Richard Ferlow Гуру Предупреждений : 2
|
|
BS
А запрос к двум таблицам тогда как будет выглядеть, не подскажешь ? |
|
|
|
|
BS Эксперт |
|
Richard Ferlow
Что именно тебе не понятно? |
|
|
|
|
BS Эксперт |
|
Точнее, что ты хочешь сделать? |
|
|
|
|
Richard Ferlow Гуру Предупреждений : 2
|
|
BS
Из таблицы `fin_bank_name`
Сделать выборку согласно правам в новой таблице `prava`
Т.е из fin_bank_name сделать SELECT *, где id записей есть в id_prava у пользователя userid в таблице
СREATE TABLE `prava` (
id int(11) auto_increment,
id_prava int(11) not null,
userid int(11) not null)
В запросах к нескольким таблицам не силен просто. |
|
|
|
|
BS Эксперт |
|
Если ты хочешь выбрать права, то, это, типа
select * prava, fin_relations where fin_relations.id=prava.id_prava
Кстати говоря, в теории реляционных баз данных есть такое определение, как нормальная форма. Всего их пять. Хорошо, когда база данных находится хотя бы в третьей. Ты решил игнорировать первую. "значением таблицы не может быть таблица или массив" |
|
|
|
|
BS Эксперт |
|
Не понял, какое ты условие должно быть. Представь, что ты объясняешь очень тупому человеку) Вроде меня) |
|
|
|
|
Richard Ferlow Гуру Предупреждений : 2
|
|
BS
С запросом поэкперементирую
Ты имеешь ввиду, что неверно нужные мне значения через запятую так хранить в поле ? |
|
|
|
|
BS Эксперт |
|
Ну да)
Попробуй, действительно, что нибудь сам сделать. Если не получиться, пиши, разберёмся |
|
|
|
|
Richard Ferlow Гуру Предупреждений : 2
|
|
BS
Почему же, смотри.
У каждого пользователя есть такое вот текстовое поле, где хранятся id, к которым он имеет доступ.
Далее в системе определяется для пользователя, когда он авторизован, массив из этих элементов($permission).
Для какого-то места проверяется, если в массиве прав доступа ($permission) содержится допустим число 22, то к этому блоку человек имеет доступ.
Код: |
$prava = $DB->query_first("SELECT prava FROM " . TABLE_PREFIX . "relations WHERE id = '$userids' AND parentid = '$parentadmin' ");
$permisson = @explode(',', $prava['prava']);
|
Дальше проверяем есть ли доступ
Код: |
if(@in_array(22, $permisson))
|
Но в случае взаимодействия этих прав с другими таблицами вот вышла неурядица |
|
|
|
|
BS Эксперт |
|
Richard Ferlow
Ты хочешь быть как в том анегдоте, где гинеколог чинил автомобиль через трубу?
Ну это будет работать, я не спрорю. А ссли тебе понадобиться убрать права или добавить?
Тоже самое могло иметь следующий вид
select count(*) from, fin_relations, prava where fin_relations.id=prava.id_prava and prava.id_prava = 22
И смотришь, 0 или не ноль и сё.
Я не совсем понимаю логику твоей бд, поэтому не могу добавить вторую таблицу, наверно это будет что то вроде
select count(*) from, fin_relations, prava, fin_bank_name where fin_relations.id=prava.id_prava and prava.id_prava = 22 and fin_bank_name. user_id = fin_relations.id |
|
|
|
|
Richard Ferlow Гуру Предупреждений : 2
|
|
BS
Так я один раз делаю запрос к базе и все.
Добавление и убирание прав делается через массив из checkbox - из тех, что отмечены, из массива значений через implode получаем строчку через запятую и помещаем в базу данных. |
|
|
|
|
BS Эксперт |
|
В любом случае нормальный способ будет работать быстрее, когда будет меньше и он будет читабельнее. |
|
|
|
|
Richard Ferlow Гуру Предупреждений : 2
|
|
BS
Кстати, на форуме одном мне предложили вот какой вариант
Код: |
$id_list ="1,3,5,7,9";
$q = mysql_query("select * from table where id in($id_list)") |
По ходу как раз что нужно =), но еще не пробовал =)
А я блин уже намутил отдельную таблицу под права =)
) |
|
|
|
|
BS Эксперт |
|
Richard Ferlow
Структура таблиц - бред.
Используй 3ую таблицу. |
|
|
|
|
|