Могу ли я использовать ограничения внешнего ключа для возврата значимых ошибок пользовательского интерфейса с PHP - PullRequest
2 голосов
/ 26 мая 2010

Вначале я хочу сказать, что я большой поклонник использования внешних ключей и склонен использовать их даже в небольших проектах, чтобы не допустить заполнения моей базы данных потерянными данными. В более крупных проектах я получаю множество ключей, которые покрывают от 8 до 10 слоев данных.

Я хочу знать, может ли кто-нибудь предложить изящный способ обработки «ожидаемых ошибок» из базы данных MySQL таким образом, чтобы я мог создавать значимые сообщения для конечного пользователя. Я объясню «ожидаемые ошибки» на примере.

Допустим, у меня есть набор таблиц, используемых для базовых обсуждений:

discussion
questions
responses
users

Иерархически они, вероятно, будут выглядеть примерно так:

-users
--discussion
---questions
----responses

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

Что я ХОЧУ сделать, так это уловить эту ошибку при удалении и сказать конечному пользователю что-то вроде: «Извините, но все обсуждения должны быть удалены, прежде чем вы сможете удалить этого пользователя ...».

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

Любая помощь здесь будет принята с благодарностью, или если я просто смотрю на это совершенно неправильно, пожалуйста, дайте мне знать.

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

Заранее спасибо

Ответы [ 3 ]

2 голосов
/ 26 мая 2010

К сожалению, MySQL не предоставляет возможность определять пользовательскую ошибку, как это было бы с SQL Server или Oracle.

Обход


Проверьте это сообщение в блоге об использовании UDF для определения пользовательских ошибок .

0 голосов
/ 26 мая 2010

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

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

редактировать

Вы можете проверить наличие внешних ключей за один выбор. Если вы используете доктрину, подобную ORM, вам даже не нужно указывать соединение, просто укажите, какие поля выбрать, а затем проверьте каждую таблицу на наличие ненулевых строк.

0 голосов
/ 26 мая 2010

Похоже, вам нужно определить ваши внешние ключи с помощью ON DELETE CASCADE. Это удалит все ссылочные данные в других таблицах.

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