2013-07-24 4 views
0

Я разрабатываю PHP-скрипт с подключением базы данных MySQL. Проблема, с которой я столкнулась, заключается в том, что мои запросы должны быть оптимизированы, потому что я обрабатываю много информации, и для этого я делаю большие запросы.MySQL - пользовательская ошибка в выражении WHERE

Чтобы написать пример, я не буду писать большой запрос, но один для вас, чтобы быть в состоянии увидеть, что мне нужно:

SELECT db1.name, db1.pass, db1.user_id, db2.datetime, db2.user_id 
FROM database1 db1, database2 db2 
WHERE db1.name = 'name' 
AND db1.pass = 'pass' 
AND db1.user_id = db2.user_id 

Что мне нужно знать, если запрос не удается, так как имя и pass неверны или потому, что user_id не равен в обеих таблицах.

В принципе, мне нужно вернуть номер ошибки или что-то в этом вопросе, чтобы иметь возможность идентифицировать ошибку в запросе и выводить пользовательское сообщение: «Ваш пароль и пароль неверны». или «У вас нет разрешений в базе данных2».

Заранее благодарен!

+3

Я считаю, что SQL не является местом для такой бизнес-логики. Однако, я думаю, это возможно с помощью хранимой процедуры: возможно, это не то, что вы хотите. – Xaqq

+1

Я согласен с @Xaqq, что вы не должны делать это в SQL. Нормально, что вы делали бы проверку на стороне клиента, а не на сервере (или в этом случае на БД). Но в некоторых случаях я понимаю, что могут быть исключения. Процедура магазина сделала бы трюк. – Sebastien

+0

Но даже с процедурой магазина это все равно не оптимально. То, как я это вижу, вам нужно будет вызвать процедуру Store, которая запустит одну запись и проверит оба условия, и это будет для всего набора записей обоих БД. Не самый быстрый и лучший способ достичь своей цели. – Sebastien

ответ

1

Оператор SQL SELECT не предназначен для возврата «номера ошибки» или «сообщения об ошибке», когда строки не возвращаются, поскольку не был выполнен конкретный предикат.

(«Ошибка запроса» и «ошибка в запросе», я предполагаю, что вы ссылаетесь на запрос, не возвращающий какие-либо строки, потому что предикаты не выполнялись (т. Е. Были ли какие-либо строки «сопоставлены» предложением WHERE) чем фактическая ошибка MySQL.)

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

Например:

SELECT IF(db1.name IS NULL 
     ,'Your user and password are incorrect.' 
     ,IF(db2.user_id IS NULL 
      ,'You don''t have permissions in database2.' 
      ,'' 
     ) AS message 
    , db1.name 
    , db1.pass 
    , db1.user_id 
    , db2.datetime 
    , db2.user_id 
    FROM (SELECT 1 AS i) i 
    LEFT 
    JOIN database1 db1 
    ON db1.name = 'name' 
    AND db1.pass = 'pass' 
    LEFT 
    JOIN database2 db2 
    ON db1.user_id = db2.user_id 

Но тот факт, вы можете написать такое заявление не означает, что это хороший подход. (Должно быть какое-то имя для этого анти-шаблона.)

+0

Спасибо за этот ответ! Может быть, я отброшу этот путь из-за недостатков, которые я получу по сравнению с другими способами, которые я тестировал, но ваш путь был бы тем, который я использовал бы, а затем проверял, является ли сообщение «или не знает» если была какая-то ошибка. Еще раз спасибо. – Unapedra

Смежные вопросы