用户
 找回密码
 入住 CI 中国社区
搜索
查看: 9843|回复: 3
收起左侧

[数据库] codeigniter 调用存储过程实例

[复制链接]
发表于 2010-6-12 14:07:38 | 显示全部楼层 |阅读模式
目的:实现登陆验证

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


第一步:编写验证的存储过程
SQL复制代码
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,STATUS  INTO num,Tpwd ,enable FROM b_user WHERE username = name  LIMIT 1;
IF num <> 1 THEN
   SET  LoginCode = 1; //该用户不存在
END IF;
IF  STRCMP(pwd,Tpwd) <> 0 THEN
   SET LoginCode = 2; //密码错误
END IF;
IF  STRCMP(enable,'active' ) <> 0 THEN
   SET LoginCode = 3; //用户被禁用
END IF;
END //
delimiter ;
复制代码


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

PHP复制代码
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;
   }
  }
}
复制代码
发表于 2010-6-12 14:49:55 | 显示全部楼层
mark.ORACLE也是一样的方式吗?
 楼主| 发表于 2010-6-13 08:31:10 | 显示全部楼层
oracle 我没接触过 抱歉 但是原理肯定都是一样的。。 你摸索下吧。
发表于 2010-6-13 10:41:04 | 显示全部楼层
一不小心看到了end if。吓了一跳,再看,原来是在mssql里边。
怀念以前在asp里边调用mssql存储过程的时代。
其实现在用c#和vb.net编写的asp.net程序,理论上也可以像java那样编译成机器码,从而跨平台的。不过其他平台对微软的这种“野心”,基本会持否定状态。
好久没碰.net了,现在应该是.net 3.0了吧。

本版积分规则