Пример №1
Простая и надежная функция проверки логина, пароля, роли, с результатом tinyint(1)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
CREATE DEFINER=`root`@`localhost` FUNCTION `loginpasswordrolecheck2`(ALogin VARCHAR(45), APassword VARCHAR(45), ARoleName VARCHAR(45)) RETURNS tinyint(1) BEGIN -- DECLARE foundRows INT; -- default 0; DECLARE CONTINUE HANDLER FOR SQLEXCEPTION return 0; -- if count=1 then OK select count(*) from users where login=ALogin and password=APassword and roles_id=(select id from roles where name=ARoleName) into @RowCount; if @RowCount=1 then return 1; else return 0; end if; END |
C результатом VarChar
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
CREATE DEFINER=`root`@`localhost` FUNCTION `loginpasswordrolecheck`(ALogin VARCHAR(45), APassword VARCHAR(45), ARoleName VARCHAR(45)) RETURNS varchar(45) CHARSET utf8 BEGIN -- DECLARE foundRows INT; -- default 0; -- DECLARE roleName varchar(45); -- default 0; DECLARE CONTINUE HANDLER FOR SQLEXCEPTION return 0; -- if count=1 then OK select count(*) from users where login=ALogin and password=APassword and roles_id=(select id from roles where name=ARoleName) into @RowCount; if @RowCount=1 then return '1'; else return '0'; end if; END |
Вызов из Delphi
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
CREATE DEFINER=`root`@`localhost` FUNCTION `loginpasswordrolecheck`(ALogin VARCHAR(45), APassword VARCHAR(45), ARoleName VARCHAR(45)) RETURNS varchar(45) CHARSET utf8 BEGIN -- DECLARE foundRows INT; -- default 0; -- DECLARE roleName varchar(45); -- default 0; DECLARE CONTINUE HANDLER FOR SQLEXCEPTION return 0; -- if count=1 then OK select count(*) from users where login=ALogin and password=APassword and roles_id=(select id from roles where name=ARoleName) into @RowCount; if @RowCount=1 then return '1'; else return '0'; end if; END |
Вызов из Delphi
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
procedure TMain.bHelloClick(Sender: TObject); var result:string; begin with FDStoredProc do begin Connection:=FDConnection; //coffeetest_db.loginPasswordRoleCheck //StoredProcName:='loginpasswordrolecheck'; StoredProcName:='loginpasswordrolecheck2'; Prepare; Params[0].Value := 'admin1'; Params[1].Value := 'admin'; Params[2].Value := 'admin'; Result := ExecFunc; ShowMessage(result); end; end; |
Пример №2
Вот функция в MySQL, которая проверяет пару логин пароль и при обнаружении выдает id пользователя
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
CREATE DEFINER=`root`@`localhost` FUNCTION `GetUserID`(luser_name VARCHAR(45),lpassword VARCHAR(45)) RETURNS int(11) BEGIN -- defining local vars DECLARE aid_user INT; DECLARE apassword VARCHAR(45) default 0; DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET aid_user = 0; -- selecting for login select id,password into aid_user,apassword from users where login=luser_name and password=lpassword; -- check number of selected rows SELECT FOUND_ROWS() as num_of_rows_found into @RowCount; if @RowCount=0 then set aid_user = 0; end if; -- if md5(lpassword)<>apassword then set aid_user = 0; end if; -- if lpassword<>apassword then set aid_user = 0; end if; RETURN aid_user; END |
Эту функцию дал мне Денис Зубов, который также сейчас работает активно с базой MySQL.
Вариант от Дениса Зубова
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
CREATE DEFINER=`root`@`localhost` FUNCTION `GetUserID`(luser_name VARCHAR(45),lpassword VARCHAR(45)) RETURNS int(11) BEGIN -- defining local vars DECLARE aid_user INT; DECLARE apassword VARCHAR(45) default 0; DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET aid_user = 0; -- selecting for login select id,password into aid_user,apassword from users where login=luser_name; -- if md5(lpassword)<>apassword then set aid_user = 0; end if; if lpassword<>apassword then set aid_user = 0; end if; RETURN aid_user; END |
Простая и понятная функция в стиле Си я бы сказал. Делаем выборку по логину и сравниваем пароль. Если ID не найден, тогда он 0. Можно использовать в качестве авторизации.
Я в своих проектах использую авторизацию через СМС, поэтому мне нужно проверять телефон и пароль. Немного изменил эту функцию на свой лад.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
CREATE DEFINER=`root`@`localhost` FUNCTION `GetUserID`(Aphone VARCHAR(45),Apassword VARCHAR(45)) RETURNS int(11) BEGIN DECLARE lid INT; DECLARE lpassword VARCHAR(45) default 0; DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET lid = -1; select id,password into lid,lpassword from clients where phone=Aphone; -- if md5(lpassword)<>apassword then set lid_user = 0; end if; if Apassword<>lpassword then set lid = 0; end if; RETURN lid; END |
Далее нам нужно вызывать эту функцию, например таким образом
1 |
select galionsms_db.GetUserID('+0000', '0000'); |
Как вызывать хранимую функцию из Delphi?
Подробное описание на официальном сайте Embarcadero
1 2 3 4 5 6 7 8 9 10 11 12 13 |
procedure TUsers.bTestClick(Sender: TObject); var UserID:Integer; begin with FDStoredProc1 do begin StoredProcName:='galionsms_db.GetUserID'; Prepare; Params[0].Value:='+0000'; Params[1].Value:='0000'; UserID:=ExecFunc; ShowMessage(UserID.ToString()); end; end; |
Если возвращается результат, используем ExecFunc, если нужно просто, чтобы процедура отработала на сервере базы, тогда ExecProc