我发生了一些非常奇怪的事情。
看起来我有2个活动记录查询冲突并混合表名和where语句。
我正在使用Codeigniter,我正在尝试将会话存储在数据库中。我希望能够从该会话中检索用户信息。
我已将控制器扩展为将userdata和sessionId存储在我可以在任何地方使用的变量中:
class MY_Controller extends CI_Controller {
public $User = false;
public $UserLoopCount = 0;
public $SessionId = false;
public function __construct() {
parent::__construct();
$this->SessionId = $this->session->userdata('session_id');
$this->User = $this->user_model->user($this->SessionId);
}
}
我的所有数据库表都有一个名为“AccountId”的字段,用于说明数据所属的用户帐户。
在我的所有用户数据库查询中,我正在应用以下函数:
public function accountLock($alias=false) {
$user = $this->user_model->user();
echo $this->User;
if($user) {
$alias === false ? $this->db->where("AccountId =", "{$user->AccountId}") : $this->db->where("{$alias}.AccountId =", "{$user->AccountId}");
} else {
return false;
}
}
确保始终将“AccountID = $ AccountId”添加到用户查询中。
此功能:
$user = $this->user_model->user();
应该从数据库中获取userdata,这样我就可以在查询的where语句中访问AccountId,例如获取用户要查看的记录。
它曾经这样做:
return array_shift($this->session->userdata('user_data');
因此,对于数据库,我将其切换为:
return $user = $this->get_user_by_session_id($sessionId)->user_data;
这就是事情开始变得怪异的地方。如果我通过URL正常加载页面一切正常。一旦我通过Ajax这样做,我就会遇到查询。
此查询中的where语句最终在需要获取用户数据的原始查询中,它还通过混合表名来影响该查询的JOIN:
public function get_user_by_session_id($sessionId) {
$this->db->start_cache();
$this->db->where("session_id =", $sessionId); // THIS WHERE STATEMENT ENDS UP IN ORIGINAL QUERY THAT CALLED TO GET THE USER INFO
$query = $this->db->get("active_users");
$this->db->stop_cache();
$this->db->flush_cache();
echo $this->db->last_query();
return $query->num_rows() > 0 ? $query->row() : false;
}
我在这里做错了什么?