我正在開發面向對象的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