Помогите найти ошибку

Главные вкладки

Аватар пользователя valen valen 21 сентября 2010 в 17:22

Добрый день. Помогите, как говорится кто, чем может.

Нацарапал я небольшой модулек, который выводит инфу из определенной таблицы. Та вот когда я, как администратор, пытаюсь воспользоваться модулем все ОК. Проблема возникает когда любой другой пользователь, без разницы зарегистрирован он на сайте или нет, пытается получить необходимую информацию. В этом случае появляется следующая ошибка:
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')))

Чувствую одним местом, что чего-то я недокрутил в модуле с правами доступа, только вот что?

Комментарии

Аватар пользователя tornadoxxxl tornadoxxxl 21 сентября 2010 в 19:09

Скорей всего у Вас модуль стоит какой-то, который дописывает в запрос свою проверку на права доступа к ноде, а вот присоединенную таблицу node не видит.
В свой запрос присоедините таблицу и все заработает + проверка прав будет работать.

P.S. Для админа скорей всего этот модуль не делает проверки, можно в Вашем модуле тоже сделать проверку и не дописывать лишнее для этой роли.

Аватар пользователя G.A. Vinogradov G.A. Vinogradov 21 сентября 2010 в 19:20

"Unknown column 'n.nid' in 'on clause' query: SELECT DISTINCT * FROM table1 n "

Ну по аглицки же написано - нет поля nid в таблице table1 )
Может вам из таблицы node надо выбирать, а не из table1 ?

Аватар пользователя valen valen 22 сентября 2010 в 9:24

Спасибо tornadoxxxl Вы правы. Удаление дополнительного модуля content access решает проблему. Скажите что нужно сделать чтобы добавить проверку в свой модуль о которой Вы говорите?

Аватар пользователя tornadoxxxl tornadoxxxl 22 сентября 2010 в 10:20

Так зачем удалять модуль (если не нужен то конечно).
Вы можете в свой запрос добавить таблицу node и модуль оставить.
Не знаю Вашей ситуации, но схематически будет как-то так:

global $user;
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 и не что в Ваш запрос дописываться не будет.
Но в таком случаи после добавление какого-то функционала делающего например проверку на права доступа, тут действовать не будет.
Смотрите по ситуации.

Аватар пользователя valen valen 22 сентября 2010 в 10:39

Вот мой запрос:
$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 совершенно отвлеченная информация которая загружается из вне.

Аватар пользователя tornadoxxxl tornadoxxxl 22 сентября 2010 в 18:57

Но вы же скорей всего используете db_rewrite_sql (там и происходит добавление лишнего и SELECT DISTINCT).
Попробуйте через db_query.