我正在开发面向对象的PHP网站,并试图确定从系统其余部分抽象数据库功能的最佳方式。现在,我有一个DB类来管理系统使用的所有连接和查询(它几乎是MDB2的一个接口)。但是,在使用这个系统时,我意识到我的代码中随处可见很多SQL查询字符串。例如,在我的用户类中,我有这样的东西:从数据库功能中分离代码
function checkLogin($email,$password,$remember=false){
$password = $this->__encrypt($password);
$query = "SELECT uid FROM Users WHERE email=? AND pw=?";
$result = $this->db->q($query,array($email,$password));
if(sizeof($result) == 1){
$row = $result->fetchRow(MDB2_FETCHMODE_ASSOC);
$uid = $row['uid'];
}else{
return false;
}
/* Rest of the login script */
}
我想要做的是找出减少内联SQL的最佳技术。我明白,一种方法是在User中为每个用户使用的查询编写函数(如下所示),但这可能会导致相当多的函数。
function checkLogin($email,$password,$remember=false){
$password = $this->__encrypt($password);
$uid = $this->do_verify_login_query($email,$password);
/* Rest of the login script */
}
function do_verify_login_query($email,$encpw){
$query = "SELECT uid FROM Users WHERE email=? AND pw=?";
$result = $this->$db->q($query,array($email,$encpw));
if(sizeof($result) == 1){
$row = $result->fetchRow(MDB2_FETCHMODE_ASSOC);
return $row['uid'];
}else{
return false;
}
}
所以......我的问题。管理典型数据库应用程序使用的大量查询的最佳技术是什么?我描述的方式是否是处理这种情况的正确方法?或者,在DB类中注册一个查询列表,并将每个传递到DB查询函数的唯一ID(例如USER_CHECKLOGIN)关联起来呢?这种方法也可以有助于安全性,因为它会限制只能在列表中注册的查询,但在编写所有类功能时还需要记住一点。思考?
存储过程是否需要内联SQL语句才能执行它们,因为它们只存在于数据库中?或者当我说使用存储过程时,我不明白你的意思吗? – cmptrgeekken 2008-11-13 03:52:14
MySQL实际上只是添加了存储过程,而且我读过的语法并不像在SQL Server中那样灵活。海事组织,存储过程是真正无用的,除非你需要编写一个广泛或复杂的查询。 – Kevin 2008-11-13 04:03:10