我有一个奇怪的问题,所以请耐心等待。我正在使用_remap函数在我的URI中实现example.com/user/username协议,我使用以下代码:
function _remap()
{
//URI Segment I am retrieving (this part works for me)
$profile_name = $this->uri->segment(2,0);
// Query the DB where user_name (column in DB) == $profile_name
$query = $this->db->get_where('users', array('user_name' => $profile_name));
// Load user data when URI segment is retrieved, load page
foreach($query->result() as $row){
$this->load->view('user_view', $data);
}
}
所以我的问题是,每当我输入一个INVALID URI段,即在数据库中找不到它时,它只返回一个空白页。我尝试了一堆条件语句,但基本上我想要这个算法:
if $profile_name = FOUND (in DB)
display page
else
redirect to error page
就像我说的,我能够让它接受有效的DB user_name,但是如果它有效,它只会显示一个空白页面。我想是因为我在segment(2,0)函数中包含了0参数。让我知道你的想法......非常感谢!
P.S。万一你想知道我为什么不使用路由功能,我不确定我是否可以通过路由完成所有这些(无论如何都要检查它)。
答案 0 :(得分:3)
在你的foreach之前,插入:
if (!$query->num_rows()) {
$this->load->helper('url');
redirect('error_page_uri_here');
}
答案 1 :(得分:2)
您不需要返回0,因为如果在该位置找不到任何段(这与返回0一样好),URI类将返回FALSE
function _remap()
{
//URI Segment I am retrieving (this part works for me)
$profile_name = $this->uri->segment(2);
if(!$profile_name){
redirect('error_page');
}
// Query the DB where user_name (column in DB) == $profile_name
$query = $this->db->get_where('users', array('user_name' => $profile_name));
// Load user data when URI segment is retrieved, load page
/*
* Assuming $query returns false if no records are found.
* Or else substitute with another condition
*/
if($query){
foreach($query->result() as $row){
$this->load->view('user_view', $data);
}
}else
show_error('msg goes here', 404);
}
现在回答您的另一个问题,您可以通过设置自定义路由规则以及在路由到的方法中执行用户数据库检查来轻松完成此操作(因此您需要将 _remap 重命名为实际方法,为了讨论,我们称之为 * fetch_user($ username)*
在你的routes.php中,最后添加:
$route['user/(:any)'] = "user/fetch_user";
您的新fetch_users功能:
function fetch_user($username)
{
// first check if $username has a value or not. We don't want to run a query if this is null.
if(!$username)
redirect('to_some_page')
$query = $this->db->get_where('users', array('user_name' => $username));
/*
* Assuming $query returns false if no records are found.
* Or else substitute with another condition
*/
if($query){
foreach($query->result() as $row){
$this->load->view('user_view', $data);
}
}else
show_error('msg goes here', 404);
}