判断某个功能应该是私有还是公开的标准是什么或者是什么。
我总是在没有声明功能的情况下进行编码,所以它被视为公共但它运行良好。不过我在指南上读到了这个,
在某些情况下,您可能希望某些功能对公共访问隐藏。要将函数设为私有,只需添加下划线作为名称前缀,它将不会通过URL请求提供。例如,如果你有这样的函数:
控制器中的公共访问功能如何?
我在每个控制器上都有这行代码。
if ( ! defined('BASEPATH')) exit('No direct script access allowed');
这会阻止用户直接通过控制器并通过网址访问该功能吗?
我尝试过测试它,虽然我把这行代码放在视图页面上,如果有人试图直接访问视图,它们就会被发送掉。
私有函数出错,而我可以访问声明/假设为public的函数。
功能的标准是什么?必须'私人的。访问数据库等功能?或有价值的数据?喜欢用户输入的信息(敏感信息,如帐户详细信息/用户名密码)?
或者我应该将所有内容保密,以便用户无法直接访问这些功能?
示例:
我已经设置了一个名为' Main'
的默认控制器 public function index(){
if($this->input->cookie('cookie',TRUE)){
}
else
$this->load->view('login');
}
检查cookie是否存在(如果用户已登录)。如果我将索引功能设置为私有,每当我访问root / main文件夹时,它都无法访问。所以我把它设置为公开。我的推理合乎逻辑/合理吗?
public function login(){
$this->form_validation->set_rules('username', 'Username', 'required|callback_check_account');
$this->form_validation->set_rules('password', 'Password', 'required');
if($this->form_validation->run() == FALSE){
$this->load->view('login'); //i tried using redirect, but it does not pass the error message for validation
}else{
}
}
我将登录功能声明为public。由于所需的数据是通过登录表单提交的,因此在调用时也无法从回调函数访问。
public function check_account($username){
$data = array('username' => $username, 'password' => $_POST['password']);
$result = $this->LoginModel->validate_account($data);
if(empty($result)){
$this->form_validation->set_message('check_account' , 'account does not exist');
$this->form_validation->set_message('required' , '');
return FALSE;
} else if($result == 'invalid'){
$this->form_validation->set_message('check_account' , 'password does not match');
$this->form_validation->set_message('required' , '');
return FALSE;
} else if($result){
$isLoggedin = array( 'username' => $result['username'] , 'type' => $result['status'] , 'is_loggedin' => TRUE);
$this->session->set_userdata($isLoggedin);
return TRUE; }
}
我宣布它是公开的,因为如果我宣称它是私有的,我的回调会导致致命的错误。用户可以通过链接/Main/check_account/username
型号:
function validate_account($data){
$this->db->select('username,password')->where('username' , $data['username']);
$query = $this->db->get('admin')->result_array();
if(!empty($query)){
foreach($query as $row){
if($data['password'] != $row['password']){
return 'invalid'; }
else $query = array('username' => $row['username'] , 'password' => $row['password'] , 'status' => 'administrator');
return $query; }
} else {
$this->db->select('username,password')->where('username' , $data['username']);
$query = $this->db->get('user_mst')->result_array();
if(!empty($query)){
foreach($query as $row){
if($data['password'] != $row['password']){
return 'invalid'; }
else $query['status'] = 'user'; return $query; }
} }
}
EDITED:更改了回调函数以检查输入的用户名是否存在(如果没有显示)
'帐户不存在'
,如果返回无效,则显示
&#39;密码与<#39;
不符
如果它返回$ query,我设置会话,加上帐户状态,因为我只为管理员和用户创建了1个登录。我仍然不知道我将如何使用
&#39;类型&#39;
在我的会话中,但我只是把它放在那里,如果用户是管理员或用户,则无需检查会话,因此他们无法访问彼此的页面。
答案 0 :(得分:0)
如果您不希望check_account是控制器的操作,则应使用
public function _check_account($value) { ... }
你调用这样的回调:
$this->form_validation->set_rules('username', 'Username', 'required|callback__check_account');
请注意,'callback'和'check'之间有两个下划线'_'。此外,提交的表单字段的值将是您的回调参数。