hdusec 发表于 2010-6-12 14:07:38

codeigniter 调用存储过程实例

目的:实现登陆验证

b_user表

uidusernamepasswordstatustokenid
用户编号用户名密码状态令牌


第一步:编写验证的存储过程
delimiter //
create procedure p_base_loginvalid(in name varchar(20),in pwd varchar(64 ),out LoginCode int )
begin
declare num int default 0;
declare Tpwd varchar(64);
declare enable enum('active','inactive' );
set LoginCode = 0;//登陆成功
select count(*), password,statusinto num,Tpwd ,enable from b_user where username = namelimit 1;
if num <> 1 then
   setLoginCode = 1; //该用户不存在
end if;
ifSTRCMP(pwd,Tpwd) <> 0 then
   set LoginCode = 2; //密码错误
end if;
ifSTRCMP(enable,'active' ) <> 0 then
   set LoginCode = 3; //用户被禁用
end if;
end //
delimiter ;

第二步:在model里面调用该存储过程

function verifyuser($u,$p)
{
/*
   方法名:verfyuser 调用数据库存储过程p_base_loginvalid进行身份用户确认
   参数说明
   输入参数列表:
   $u 用户名字符串类型
   $p 密码    字符串类型
   返回值 boolean   true,验证通过
   
   修改记录:
*/
if(empty($u)||empty($p))
{
   $this->session->set_flashdata('error', '用户名或者密码不能为空!');
   return false;
}
else
{
   $pwd = dohash($p);
   $sql = "call p_base_loginvalid('$u','$pwd',@code)";
   
   $this->db->query($sql);
   $result = $this->db->query("select @code as code");
   $logincode = $result->row();
   $code = $logincode->code;
   
   if($code) return true;
   if($code == 1)
   {
    $this->session->set_flashdata('error', '用户名不存在!');
    return false;
   }
   if($code == 2)
   {
    $this->session->set_flashdata('error', '密码错误!');
    return false;
   }
   if($code == 3)
   {
    $this->session->set_flashdata('error', '用户已被禁用!');
    return false;
   }
}
}

oonxt 发表于 2010-6-12 14:49:55

mark.ORACLE也是一样的方式吗?

hdusec 发表于 2010-6-13 08:31:10

oracle 我没接触过 抱歉 但是原理肯定都是一样的。。 你摸索下吧。

spt119 发表于 2010-6-13 10:41:04

一不小心看到了end if。吓了一跳,再看,原来是在mssql里边。
怀念以前在asp里边调用mssql存储过程的时代。
其实现在用c#和vb.net编写的asp.net程序,理论上也可以像java那样编译成机器码,从而跨平台的。不过其他平台对微软的这种“野心”,基本会持否定状态。
好久没碰.net了,现在应该是.net 3.0了吧。
页: [1]
查看完整版本: codeigniter 调用存储过程实例