Получение только связанных данных MySQL

219
13 февраля 2018, 08:59

Одна база используется сразу же несколькими сайтами. В таблице sites есть список всех авторизованных сайтов, которые имеют доступ к базе, у каждого сайта свой id.

В каждой таблице есть колонка site, которая содержит id сайта, к которой та или иная запись относится.

Вопрос. Можно ли каким-то образом автоматически получать и работать только со своей порцией данных, чтобы каждый раз в каждом запросе не писать WHERE site = ...?

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

Answer 1

Без схемы данных сложно сказать что-то осмысленное. В текущей формулировке вопроса я бы предложил сделать следующее:

  1. Каждый сайт коннектится к БД со своим собственным логином
  2. В запрос вставляете where site = current_user() (так кажется в mysql определяется текущий пользователь)
  3. Можно еще сделать view и вставить условие туда, тогда один и тот же запрос select * from my_view будет возвращать каждому пользователю только его данные.
Answer 2

В развитие идеи @Dmitry о вьювах, с целью снять проблему заведения для каждого сайта отдельного пользователя. Исполняемый код, обращающийся к БД, знает, для какого именно сайта он выполняет запрос. Однако автор хочет избежать постоянной передачи имени сайта (неважно, как параметра запроса или статически). Вроде имя сайта можно было бы содержать в сессионной переменной - но в представлении переменные не допускаются.

Решением может быть пользовательская функция, возвращающая значение переменной, которая в представлении допустима. Типа

CREATE FUNCTION getsite() 
DETERMINISTIC 
NO SQL
RETURNS VARCHAR(128)
RETURN @site;

и соответственно

CREATE VIEW sitedata()
AS
SELECT * 
FROM alldata
WHERE site = getsite();

Тогда при установлении соединения мы сразу инициализируем сессионную переменную, типа

SET @site = 'www.mysite.ru'

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

Костыль, конечно... и надо проверить, как оно себя поведёт при разрыве и автовосстановлении соединения... и совсем неприменимо, если используется пул соединений.

READ ALSO
Не пойму почему не работает спарсенный код?

Не пойму почему не работает спарсенный код?

Получаю содержимое тега head при помощи кода

183
обработка результата запроса

обработка результата запроса

Через Curl нужно получить весь запросТо есть аккуратный массив/объект со всеми именами-значениями заголовков и отдельно тело

166
Как передать массив по ссылке? PHP

Как передать массив по ссылке? PHP

Подскажите, пожалуйста как передать массив php по ссылке? Итак, есть массив:

161
Продлить акцию на неделю, программно

Продлить акцию на неделю, программно

Подскажите как сделать на php, продление акции на неделю программноесть код:

144