我正在开发一个面向对象的PHP网站,我正在尝试确定从系统其余部分抽象数据库功能的最佳方法.现在,我有一个DB类来管理系统使用的所有连接和查询(它几乎是MDB2的接口).但是,在使用这个系统时,我意识到我的代码中到处都有很多SQL查询字符串.例如,在我的User类中,我有这样的东西:
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中为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拉出到单独的函数中是一个不错的开始.您可以做的其他一些事情:
为数据库访问代码创建单独的类.这将有助于确保您没有在所有PHP文件中散布的SQL函数.
从外部文件加载SQL.这完全分离了您的SQL代码和PHP代码,使其更易于维护.
尽可能使用存储过程.这将完全从PHP代码中删除SQL,并通过降低外部SQL执行的风险来帮助提高数据库安全性.