2014-12-15 2 views
1

У меня есть хранимая процедура, которая проверяет, существует ли пользователь, независимо от ввода, используемого для электронного письма, которое возвращается с первой строкой в ​​базе данных. Если я запускаю инструкции select вручную, я получаю правильные результаты. Любые предложения почему?MySQL хранимая процедура не возвращает правильные результаты

CREATE DEFINER=`myusername`@`localhost` PROCEDURE `User_Auth`(IN `Email` VARCHAR(30)) 
BEGIN 
    DECLARE User_ID INT(30); 
     SELECT `User ID` INTO User_ID FROM `Users` WHERE `Email` = Email LIMIT 1; 

    IF (User_ID > 0) THEN 
     SELECT * FROM `Users` WHERE `User ID` = User_ID; 
    ELSE 
     SELECT concat('No Users Found: ', Customer_Name); 
    END IF; 
END 
+0

Вы можете добавить некоторые выборочные данные, показывающие, что вы ожидаете получить против того, что вы на самом деле получаете? –

+0

Какое название столбца является идентификатором пользователя? – SMA

+0

Вы, кажется, назвали свой параметр 'Email' так же, как и столбец' Email'. Попробуйте изменить имя параметра на другое. –

ответ

3

Ваша проблема, без сомнения лежит здесь:

SELECT `User ID` INTO User_ID FROM `Users` WHERE `Email` = Email LIMIT 1; 

Для йота; ваше имя параметра совпадает с именем вашего столбца. То, что может действительно работает, но правила, чтобы сделать это, могут быть странными. (Я думаю, что если вы включили цитаты, это может сработать).

Но на самом деле, что вы должны сделать, это переименовать параметр Email к чему-то еще:

CREATE DEFINER=`myusername`@`localhost` PROCEDURE `User_Auth`(IN `EmailAddress` VARCHAR(30)) 
BEGIN 
    DECLARE User_ID INT(30); 
     SELECT `User ID` INTO User_ID FROM `Users` WHERE `Email` = EmailAddress LIMIT 1; 

    IF (User_ID > 0) THEN 
     SELECT * FROM `Users` WHERE `User ID` = User_ID; 
    ELSE 
     SELECT concat('No Users Found: ', Customer_Name); 
    END IF; 
END 
1

Проблема в том, что переменная имеет имя email, так же, как колонны. Таким образом, email = email в основном не работает, потому что он относится только к имени столбца.

Это хорошая идея, чтобы префикс параметров с чем-то, чтобы избежать путаницы:

CREATE DEFINER=`myusername`@`localhost` PROCEDURE `User_Auth`(IN v_Email VARCHAR(30)) 
BEGIN 
    DECLARE v_User_ID INT(30); 
    SELECT `User ID` INTO User_ID FROM `Users` u WHERE u.Email = v_Email LIMIT 1; 

    IF (User_ID > 0) THEN 
     SELECT * FROM `Users` WHERE `User ID` = v_User_ID; 
    ELSE 
     SELECT concat('No Users Found: ', Customer_Name); 
    END IF; 
END 
Смежные вопросы