Добрый день. Помогите, как говорится кто, чем может.
Нацарапал я небольшой модулек, который выводит инфу из определенной таблицы. Та вот когда я, как администратор, пытаюсь воспользоваться модулем все ОК. Проблема возникает когда любой другой пользователь, без разницы зарегистрирован он на сайте или нет, пытается получить необходимую информацию. В этом случае появляется следующая ошибка:
user warning: Unknown column 'n.nid' in 'on clause' query: SELECT DISTINCT * FROM table1 n INNER JOIN node_access na ON na.nid = n.nid WHERE (na.grant_view >= 1 AND ((na.gid = 0 AND na.realm = 'all') OR (na.gid = 0 AND na.realm = 'content_access_author') OR (na.gid = 1 AND na.realm = 'content_access_rid'))) AND ( n.zakaz_num = '19964/2010' AND ((n.doc_num = '0706 921040') OR (n.doc_inn = '0706 921040')))
Чувствую одним местом, что чего-то я недокрутил в модуле с правами доступа, только вот что?
Комментарии
Скорей всего у Вас модуль стоит какой-то, который дописывает в запрос свою проверку на права доступа к ноде, а вот присоединенную таблицу node не видит.
В свой запрос присоедините таблицу и все заработает + проверка прав будет работать.
P.S. Для админа скорей всего этот модуль не делает проверки, можно в Вашем модуле тоже сделать проверку и не дописывать лишнее для этой роли.
"Unknown column 'n.nid' in 'on clause' query: SELECT DISTINCT * FROM table1 n "
Ну по аглицки же написано - нет поля nid в таблице table1 )
Может вам из таблицы node надо выбирать, а не из table1 ?
Спасибо tornadoxxxl Вы правы. Удаление дополнительного модуля content access решает проблему. Скажите что нужно сделать чтобы добавить проверку в свой модуль о которой Вы говорите?
Так зачем удалять модуль (если не нужен то конечно).
Вы можете в свой запрос добавить таблицу node и модуль оставить.
Не знаю Вашей ситуации, но схематически будет как-то так:
if ($user->roles[7] || $user->uid == 1) {
/* 7 - номер роли с правами administrator в которой нет проблем, вторая проверка на супер админа */
$result = db_result(db_query("
SELECT DISTINCT *
FROM table1 t
WHERE ( t.zakaz_num = '%s' AND ((t.doc_num = '%s') OR (t.doc_inn = '%s')))", "19964/2010", "0706 921040", "0706 921040"));
}
else {
$result = db_result(db_query("
SELECT DISTINCT *
FROM table1 t
INNER JOIN node n ON t.nid = n.nid
WHERE ( t.zakaz_num = '%s' AND ((t.doc_num = '%s') OR (t.doc_inn = '%s')))", "19964/2010", "0706 921040", "0706 921040"));
/* t.nid = n.nid по чем их соединять виднее Вам, но когда content access допишет свою проверку он найдет в
INNER JOIN node_access na ON na.nid = n.nid таблицу n - node */
}
Ну или как Вариант SELECT DISTINCT заменить на SELECT и не что в Ваш запрос дописываться не будет.
Но в таком случаи после добавление какого-то функционала делающего например проверку на права доступа, тут действовать не будет.
Смотрите по ситуации.
Вот мой запрос:
$sql = "SELECT * FROM {table1} t WHERE t.zakaz_num = '%s' AND ((t.doc_num = '%s') OR (t.doc_inn = '%s'))";
Как видите DISTINCT вообще нету. А соединить table1 c node тоже не представляется возможным т.к. в table1 совершенно отвлеченная информация которая загружается из вне.
Но вы же скорей всего используете db_rewrite_sql (там и происходит добавление лишнего и SELECT DISTINCT).
Попробуйте через db_query.