2

ちょっと変わった問題があるので、我慢してください。_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);          
            }       

}

したがって、私の問題は、無効な URI セグメントを入力するたびに、つまりデータベースに見つからない場合、空白のページが返されることです。一連の条件ステートメントを試しましたが、基本的には次のアルゴリズムが必要です。

if $profile_name = FOUND (in DB)
display page
else 
redirect to error page

私が言ったように、有効な DB user_name を受け入れるようにすることはできますが、無効なものを使用すると、空白のページが表示されます。セグメント(2,0)関数に0引数を含めたためだと思いました。感想を聞かせてください...どうもありがとうございました!

PSなぜ私がルーティング機能を使用していないのか疑問に思っている場合に備えて、ルーティングでこれをすべて行うことができるかどうかはわかりませんでした(とにかくDBに対してチェックしてください).

4

2 に答える 2

3

foreach の直前に、これを挿入します。

if (!$query->num_rows()) {
    $this->load->helper('url');
    redirect('error_page_uri_here');
}
于 2011-02-12T01:15:53.963 に答える
2

その位置にセグメントが見つからない場合、URI クラスは FALSE を返すため、0 を返す必要はありません (これは 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);       

}

もう 1 つの質問ですが、カスタム ルーティング ルールを設定し、ルーティング先のメソッドでユーザー DB チェックを行うことで、これを簡単に行うことができます ( _remapの名前を実際のメソッドに変更し、 *fetch_user($username)と呼びましょう)。 *議論のため)

routes.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);       

}
于 2011-02-12T01:06:40.170 に答える