SQL: отображение опции ссылки с использованием условий

#sql #asp-classic #vbscript #ado

#sql #asp-classic #vbscript #ado

Вопрос:

Я пытаюсь сделать пункт меню доступным для пользователей в зависимости от условий, используя 2 таблицы.

У нас есть веб-сайт каталога для разных городов, и каждый администратор города может добавлять подкатегории в основные категории, чтобы настроить свою структуру каталогов, но в настоящее время это позволяет им добавлять подкатегории в другие подкатегории, которые уже заполнены рекламой, чего он не должен делать.

Я хотел бы показывать опцию «Добавить подкат-категорию» в другую подкатегорию только тогда, когда в нее уже не добавлено объявлений.

Например, во всех справочниках городов есть подкатегория под названием «Бухгалтеры». Она заполнена клиентскими объявлениями в каталоге ‘Brentwood’, но не в каталоге ‘Shreusbury’.

Я хочу показывать опцию «Добавить подкатегорию» только в том случае, если выполняются следующие три условия с использованием данных из следующих таблиц и столбцов:

  • Таблица ‘Каталоги’: это должен быть текущий город франчайзинга (используя столбец ‘FranchiseGID’)
  • Таблица «Каталоги»: она должна применяться к каждой отдельной подкатегории (столбец GID)
  • Таблица «Клиенты»: Ни один клиент не зарегистрировался для включения в подкатегорию (столбец GID)

Итак, используя комбинацию этих столбцов таблицы, используя ‘iAdvertCount’ в качестве счетчика и ‘ClientGID’, чтобы проверить, есть ли подписки на рекламу в этой конкретной подкатегории; также, что это применяется только к текущему веб-сайту франшизы (FranchiseGID).

Я могу выбирать информацию из одной таблицы, но не из нескольких — поэтому мне была бы нужна помощь в выборе требуемой информации из приведенных выше столбцов и таблиц.

Вот как далеко я продвинулся с таблицей ‘Directories’, но также необходимо добавить условие Client GID из ‘Clients’:

 Dim iAdvertCount

SQLCommand = "SELECT COUNT(*) AS Counter FROM Directories WHERE GID is not null AND FranchiseGID is not null"
rsTemp.Open SQLCommand, objConn, adOpenStatic, adLockReadOnly
iSubscriptionCount = rsTemp("Counter")
rsTemp.Close
if iSubscriptionCount = 0 then
    %><a href="AddDirectory.asp?PGID=<% = rsDirectory("GID") %>"><% = GetIcon("Add", "Add Sub Directory", 25, True) %></a><%
end if
  

Пока что я могу скрыть опцию «Добавить подкатегорию» в любом каталоге франшизы веб-сайта (например, Brentwood), который содержит ClientGID, но он применяется ко всем подкатегориям, независимо от того, содержат ли они клиентские подписки / рекламу или нет.

Я надеюсь, что кто-нибудь сможет помочь и действительно разобраться в том, что я написал, чтобы каким-то образом помочь, поскольку это очень помогло бы!

Комментарии:

1. Что происходит, когда AdminFranchiseGID является ') drop table uvw_DirectoryBrowser_Adverts select (' ?

2. Я не понимаю этот вопрос, и отсутствует много контекста, и предоставляется много лишней информации

3. Sam указывает на то, что ваш код может быть уязвим для хакерской техники, называемой «SQL-инъекцией». Есть ли что-нибудь, что пользователь может ввести, что позволило бы ему установить значение AdminFranchiseGID? Потому что, если они установят для нее значение, которое показывает вам Sam, результирующей SQL-командой будет: «ВЫБЕРИТЕ COUNT(*) В КАЧЕСТВЕ счетчика Из uvw_DirectoryBrowser_Adverts ГДЕ … И (FranchiseGID = «) Отбрасывает таблицу uvw_DirectoryBrowser_Adverts select («)» — которая будет отбирать некоторые данные, затем отбрасывать таблицу, затем выбирать константу. Выполните поиск в Google по запросу «избегать внедрения SQL», чтобы узнать об этом намного больше.

4. Мы сможем оказать вам ГОРАЗДО большую помощь, если вы предоставите нам более подробную информацию. Как выглядит таблица uvw_DirectoryBrowser_Adverts? Укажите нам имена столбцов и типы данных. Кроме того, как вы определяете, есть ли в подкатегории реклама? Если вы не можете сообщить нам , что вы хотите сделать, вы, конечно, не сможете сообщить SQL Server, что вы хотите сделать.

5. Администраторы должны иметь возможность видеть ссылку, только если в подкатегории нет рекламы. Я не совсем понимаю, как структурированы ваши данные. Не могли бы вы помочь мне разобраться в таблицах каталогов и клиентов? В каталогах есть подкатегория бухгалтеров и идентификатор франшизы (Брентвуд или Шрусбери) на основе примера. Существует объявление для бухгалтеров в Брентвуде (записано в таблице клиентов?) Вы хотите узнать количество рекламных объявлений для каждой франшизы? Возвращает только список мест, в которых нет рекламы? Учитывая франшизу и подкатегорию, сколько там объявлений? Какую проблему мы пытаемся решить?

Ответ №1:

Я надеюсь, что это нечто большее, чем пресловутый выстрел в темноте

Я считаю, что вам нужно использовать оператор exist.

Оператор exist используется в предложении where для определения, возвращает ли подзапрос результаты или нет.

Таким образом, ваш запрос может выглядеть следующим образом:

 SELECT COUNT(*) AS Counter
  FROM Directories
 WHERE GID is not null
   AND FranchiseGID is not null
   AND NOT EXISTS(SELECT 'ARBITRARY VALUE'
                    FROM clients
                   WHERE clients.gid = directories.gid)
  

Оператор exists использует преимущества подзапроса, вот почему мы можем ссылаться на таблицу directories, даже если ее нет в предложении from подзапроса. Таким образом, если подзапрос возвращает что-либо, это не будет возвращено для подсчета функцией count

Вероятно, вам потребуется изменить предложение where в подзапросе, чтобы заставить его работать правильно, поскольку я не уверен, как структурирована ваша база данных