我有一个简单的数据库,包含用户数据表,控制器数据表和user_controller表,它们具有controllerID和userId。
在我的PHP OOP(第一次)实现中,我有一个类User和一个类Controller。
用户的功能很简单 - 他可以登录并注销并查看所有控制器的表格。 我有一个管理员用户,可以看到所有用户及其控制器,他可以添加/删除/编辑控制器给用户,也可以添加\ delete \ edit用户。
实现了Login功能(DB类,用户类和助手类)
我的问题是我应该如何以及在何处构建向用户添加控制器的功能。 Controller具有id(唯一),名称(不唯一)和密码。
用户私人字段为:
private $_db,
$_data, //all of this user data
$_sessionName,
$_cookieName,
$_isLoggedIn;
和控制器类:
private $_db,
$_data; //all of this controller data
我尝试在控制器中实现Create:
public function create($fields = array()){
if(!$this->_db->insert('controllers',$fields)){
throw new Exception("Problem creating new controller");}}
并在用户中使用createController:
public function addController($pass,$controller_name,$lat='',$lon=''){
if ($pass && $controller_name){
$controller = new Controller();
$salt = Hash::salt(32);
try{
$controller->create(array(
'pass' => Hash::make($pass,$salt),
'salt' => $salt,
'controller_name' => $controller_name,
'lat' => $lat,
'lon' => $lon
));
//if success then we update user-controller table
$controller_id = $controller->find($controller_name)->data()->id;
$userID = $this->data()->ID;
$fields = array(
'UserID' => $userID,
'ControllerID' => $controller_id
);
if(!$this->_db->insert('user_controllers',$fields)){
throw new Exception("Problem creating controller for user");
}
}
catch(Exception $e){
throw new Exception('There was a problem creating new controller');
}
} else {
throw new Exception('No name or password had been given');
}
一般情况下都有效。但是有几个问题:
控制器的ID是由DB自动创建的,所以当我创建它时我不知道它。我后来无法通过名字找到控制器,因为我可以拥有许多具有此名称的控制器
我不确定这是处理用户与控制器之间关系的正确方法
我无法实施"告诉我所有的控制器"为用户。
请告诉我实现此关系的正确方法是什么,以及如何创建用户的createController和ShowControllers?
答案 0 :(得分:0)
你的结构似乎是正确的。你需要一个用户表,一个控制器表和一个user_controller表来映射两者之间的关系(用户有很多控制器)。
解决问题的方法:
插入数据时,需要检索要在映射关系中使用的新记录的插入ID。我在你的例子中不确定你是否自己或其他地写过这个MVC结构;它看起来有点像CodeIgniter。如果是CI应用程序,here's an example of how to get the last insert ID。如果是定制应用,您可以使用$mysqli->insert_id
(mysqli)或$pdo->lastInsertId();
for PDO.
您正在做的事情是正确的。
在"告诉我所有的控制器"对于用户场景,您将查询user_controller表以获取所有控制器关系的列表,并且您将使用连接(内部可能适合强制成功连接)。您指定要在选择字段中返回controller.*
,并且您最终会得到每个控制器的记录并忽略用户控制器字段(如果您不需要它们)。示例SQL查询可能如下所示:
SELECT controller.* FROM user_controller UC INNER JOIN controller ON controller.id = user_controller.controller_id WHERE user_controller.user_id = [YOUR_USER_ID_HERE]