2012-02-23 25 views
1

我正在本地開發Codeigniter中的統計信息站點。我有一個像本地主機/網站名稱/播放/ show_profile/PlayerNameCodeigniter:從url中放置變量的位置

我現在有一個網址如下:

<?php if (! defined('BASEPATH')) exit('No direct script access allowed'); 

class Player extends CI_Controller 
{ 

    public function __construct() 
    { 
    parent::__construct(); 
    $this->load->model('player_model'); 
    $player_name = $this->uri->segment(3); 
    } 


    public function index() 
    { 
     echo "index"; 
    } 

    public function show_profile($player_name) 

    { 

     $data['player_stats'] = $this->player_model->get_stats($player_name); 
     $this->load->view('player/player_stats', $data); 
    } 

} 

?> 

這工作,但我的問題是關於$ PLAYER_NAME變量。 __construct中有$player_name = $this->uri->segment(3);,因此它可用於所有類方法。這是我應該這樣做的方式嗎?

這是安全嗎?

回答

4

所有的拳頭,存在因爲它會被覆蓋在構造函數中分配的變量沒有任何意義。當你傳遞一個像localhost/sitename/player/show_profile/PlayerName這樣的URL時,任何通過該方法(即PlayerName)的get都將被設置爲參數。因此,你的變量在

public function show_profile($player_name){ 

已經設置,當你到你的方法代碼。

其次,我同意彼得:

protected $player_name; 

爲使得它在全球範圍內控制訪問。但是,我不同意在構造函數中設置它。如果在此控制器中有另一個方法傳遞該地點的變量,那麼您將在那裏獲取錯誤的數據。將它設置爲你調用的方法:

public function show_profile($player_name){ 

    $this->player_name = $player_name; 

    $data['player_stats'] = $this->player_model->get_stats($player_name); 
    $this->load->view('player/player_stats', $data); 
} 
+0

那麼'$ this-> uri-> segment(3)呢? – Motive 2012-02-23 19:04:31

+0

我已更新我的帖子。你不需要它,如果你堅持你原來的方法原型 – Birdman 2012-02-23 19:06:11

+0

哦,我沒有意識到,CI通過這些方法。很高興知道!謝謝您的幫助。 – Motive 2012-02-23 19:13:06

1

你可以做的是定義一個名爲$ player_name的類變量,並在構造函數中將其設置爲segment(3)。

class Player extends CI_Controller 

{

protected $player_name; 

public function __construct() { 
    parent::__construct(); 
    $this->load->model('player_model'); 
    $this->player_name = $this->uri->segment(3); 
} 

public function index() { 
    echo "index"; 
} 

public function (show_profile) { 

    $data['player_stats'] = $this->player_model->get_stats($this->player_name); 
    $this->load->view('player/player_stats', $data); 
} 

}

這樣將能夠在任何地方訪問$ play_name變量的類。

您也可以使用$ this-> uri-> uri_to_assoc(n)方法檢查它是否已設置,並檢查密鑰/值是否設置爲()http://codeigniter.com/user_guide/ libraries/uri.html

彼得