我认为你的主要想法是将用户处理(会话)与数据库查询分开,这在我看来是件好事。
但是,实际的实现情况并非如此,因为登录会将要发送到数据库的数据转义,即使该方法的其余部分与数据库无关。不要说你的数据库查询取决于全局资源的工作。当我在,我也建议你使用PDO。
此外,您的属性$ _email和$ _password是在私有范围内,但是要被受保护的方法访问。这可能会导致问题。属性和方法应具有等效的可见性。
现在,我可以看到您的UserService需要三件事:数据库处理程序,电子邮件和密码。把它放在构造函数中是有意义的。
以下是我将如何做:
class UserService
{
protected $_email; // using protected so they can be accessed
protected $_password; // and overidden if necessary
protected $_db; // stores the database handler
protected $_user; // stores the user data
public function __construct(PDO $db, $email, $password)
{
$this->_db = $db;
$this->_email = $email;
$this->_password = $password;
}
public function login()
{
$user = $this->_checkCredentials();
if ($user) {
$this->_user = $user; // store it so it can be accessed later
$_SESSION['user_id'] = $user['id'];
return $user['id'];
}
return false;
}
protected function _checkCredentials()
{
$stmt = $this->_db->prepare('SELECT * FROM users WHERE email=?');
$stmt->execute(array($this->email));
if ($stmt->rowCount() > 0) {
$user = $stmt->fetch(PDO::FETCH_ASSOC);
$submitted_pass = sha1($user['salt'] . $this->_password);
if ($submitted_pass == $user['password']) {
return $user;
}
}
return false;
}
public function getUser()
{
return $this->_user;
}
}
然后使用它:
$pdo = new PDO('mysql:dbname=mydb', 'myuser', 'mypass');
$userService = new UserService($pdo, $_POST['email'], $_POST['password']);
if ($user_id = $userService->login()) {
echo 'Logged it as user id: '.$user_id;
$userData = $userService->getUser();
// do stuff
} else {
echo 'Invalid login';
}