Условная ошибка сегмента URI - Codeigniter - PullRequest
2 голосов
/ 12 февраля 2011

У меня какая-то странная проблема, так что терпите меня.Я использую функцию _remap для реализации протокола example.com/user/username в своем URI и использую следующий код:

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

Как я уже сказал, я могу заставить его принять действительное имя_БД user_name, но с неверным оно будетпросто отобразить пустую страницу.Я подумал, что это потому, что я включил аргумент 0 в функцию сегмента (2,0).Дайте мне знать, что вы думаете ... Большое спасибо всем!

PS На всякий случай, если вам интересно, почему я не использую функции маршрутизации, я не был уверен, смогу ли я сделать все это с маршрутизацией (проверкаэто против БД в любом случае).

Ответы [ 2 ]

3 голосов
/ 12 февраля 2011

Как раз перед вашим foreach, вставьте это:

if (!$query->num_rows()) {
    $this->load->helper('url');
    redirect('error_page_uri_here');
}
2 голосов
/ 12 февраля 2011

Вам не нужно возвращать 0, так как класс URI вернет FALSE, если в этой позиции не найден сегмент (что так же хорошо, как и возвращение 0)

 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) * для обсуждения)

В вашем rout.php, добавьте это в конце:

$route['user/(:any)'] = "user/fetch_user";

Ссылка на маршрутизацию URI

Ваша новая функция 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);       

}
...