Методика проверки внешних ключей, веб-приложение MVC, MySQL - PullRequest
0 голосов
/ 22 марта 2012

Наличие двух таблиц базы данных:

orders (id, client_id, ...) - хранит заказы клиентов

address (id, client_id, ...) - хранит адреса доставки клиентов

Соотношение между этими таблицами много ко многим, поэтому у меня есть таблица

address_orders (id, order_id, address_id), который отображает куда идет заказ

Но я бы хотел привести в исполнение одну вещь - в таблице address_orders могут быть соединены вместе только заказы и адреса одного и того же клиента.

Каков наилучший способ сделать это?

У меня есть веб-приложение на основе MVC, которое хранит данные в базе данных MySQL. Каждый клиент получает на выбор только свои заказы и адреса, но форма может быть подделана, и злонамеренный пользователь может изменить address_id на случайное предположение, что приведет к описанной неопределенности.

В целях безопасности я должен проверить этот сценарий - возможно, в модели или непосредственно в базе данных. Я предпочитаю второе решение, но как это сделать? Может быть, некоторые триггеры?

Ответы [ 3 ]

1 голос
/ 23 марта 2012

Если в адресах нет совпадений (только один клиент на адрес), то ваша структура БД не имеет смысла.

Clients         Addresses         Orders
---             -------           -------
client_id PK    address_id PK     order_id PK
name            client_id FK      address_id FK
phone_number    full_address      data

Затем получить все детали из заказа

SELECT 
    Clients.name
    Addresses.full_address
    Orders.data
FROM Orders
    LEFT JOIN Addresses USING(address_id)
    LEFT JOIN Clients USING(client_id)
WHERE 
    client_id = 42

Это даст вам все заказы от клиента с идентификатором 42.

  • каждый order имеет один address
  • каждый address имеет один client
  • каждый client имеет несколько addresses
  • каждый address имеет несколько orders
0 голосов
/ 23 марта 2012

Мы склонны использовать следующий подход:

a) Сохранять customerid в сеансе

b) При выборе заказов или адресов используйте один из следующих пунктов, показывая имена пользователей при сохраненииИдентификаторы: - предварительно созданный список с использованием элемента управления select, в котором можно выбрать только один - предварительно созданный список, из которого можно выбирать определенные элементы с помощью флажков

0 голосов
/ 22 марта 2012

Является ли address_id скрытым или видимым полем формы, и вы беспокоитесь о том, что пользователи могут или хотят связываться с ним?

Я предполагаю, что ваши клиенты вошли в систему. Вы можете воспользоваться информацией о сеансе и user_id (или чем-то еще). Получите клиентов address_id в файле процесса и используйте этот address_id, а не идентификатор, отправленный формой (вы, конечно, можете проверить, совпадают ли они). Если что-то идет не так, проблема, вероятно, где-то в безопасности сеанса / приложения, но не в поддельной форме.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...