以獲取$type這個參數為例:
一:通過傳統方法:$_GET, $_POST
$type = intval($_GET['type'])
這種方法需要自己寫過濾規則,保證數據安全。
二:在Action中通過$this->_get或$this->_post,$this->param
這種方法:第一個參數是獲取的參數;第二個參數為處理函數,可以為用逗號分隔的多個函數,默認為默認處理函數;第三個參數是默認值。
如:
$mod = $this->_get('mod', 'trim'); $type = $this->_get('type', 'trim', 'login');
Tp中的魔術處理方法:
/** * 魔術方法 有不存在的操作的時候執行 * @access public * @param string $method 方法名 * @param array $args 參數 * @return mixed */ public function __call($method,$args) { if( 0 === strcasecmp($method,ACTION_NAME.C('ACTION_SUFFIX'))) { if(method_exists($this,'_empty')) { // 如果定義了_empty操作 則調用 $this->_empty($method,$args); }elseif(file_exists_case($this->view->parseTemplate())){ // 檢查是否存在默認模版 如果有直接輸出模版 $this->display(); }elseif(function_exists('__hack_action')) { // hack 方式定義擴展操作 __hack_action(); }else{ _404(L('_ERROR_ACTION_').':'.ACTION_NAME); } }else{ switch(strtolower($method)) { // 判斷提交方式 case 'ispost' : case 'isget' : case 'ishead' : case 'isdelete' : case 'isput' : return strtolower($_SERVER['REQUEST_METHOD']) == strtolower(substr($method,2)); // 獲取變量 支持過濾和默認值 調用方式 $this->_post($key,$filter,$default); case '_get' : $input =& $_GET;break; case '_post' : $input =& $_POST;break; case '_put' : parse_str(file_get_contents('php://input'), $input);break; case '_param' : switch($_SERVER['REQUEST_METHOD']) { case 'POST': $input = $_POST; break; case 'PUT': parse_str(file_get_contents('php://input'), $input); break; default: $input = $_GET; } if(C('VAR_URL_PARAMS') && isset($_GET[C('VAR_URL_PARAMS')])){ $input = array_merge($input,$_GET[C('VAR_URL_PARAMS')]); } break; case '_request' : $input =& $_REQUEST; break; case '_session' : $input =& $_SESSION; break; case '_cookie' : $input =& $_COOKIE; break; case '_server' : $input =& $_SERVER; break; case '_globals' : $input =& $GLOBALS; break; default: throw_exception(__CLASS__.':'.$method.L('_METHOD_NOT_EXIST_')); } if(!isset($args[0])) { // 獲取全局變量 $data = $input; // 由VAR_FILTERS配置進行過濾 }elseif(isset($input[$args[0]])) { // 取值操作 $data = $input[$args[0]]; $filters = isset($args[1])?$args[1]:C('DEFAULT_FILTER'); //第二個參數為處理函數,可以為用逗號分隔的多個函數,默認為默認處理函數 if($filters) {// 2012/3/23 增加多方法過濾支持 $filters = explode(',',$filters); foreach($filters as $filter){ if(function_exists($filter)) { $data = is_array($data)?array_map($filter,$data):$filter($data); // 參數過濾 } } } }else{ // 變量默認值 $data = isset($args[2])?$args[2]:NULL; } Log::record('建議使用I方法替代'.$method,Log::NOTICE); return $data; } }
三、通過I方法獲取
/** * 獲取輸入參數 支持過濾和默認值 * 使用方法: * <code> * I('id',0); 獲取id參數 自動判斷get或者post * I('post.name','','htmlspecialchars'); 獲取$_POST['name'] * I('get.'); 獲取$_GET * </code> * @param string $name 變量的名稱 支持指定類型 * @param mixed $default 不存在的時候默認值 * @param mixed $filter 參數過濾方法 * @return mixed */ function I($name,$default='',$filter=null) { if(strpos($name,'.')) { // 指定參數來源 list($method,$name) = explode('.',$name,2); }else{ // 默認為自動判斷 $method = 'param'; } switch(strtolower($method)) { case 'get' : $input =& $_GET;break; case 'post' : $input =& $_POST;break; case 'put' : parse_str(file_get_contents('php://input'), $input);break; case 'param' : switch($_SERVER['REQUEST_METHOD']) { case 'POST': $input = $_POST; break; case 'PUT': parse_str(file_get_contents('php://input'), $input); break; default: $input = $_GET; } if(C('VAR_URL_PARAMS') && isset($_GET[C('VAR_URL_PARAMS')])){ $input = array_merge($input,$_GET[C('VAR_URL_PARAMS')]); } break; case 'request' : $input =& $_REQUEST; break; case 'session' : $input =& $_SESSION; break; case 'cookie' : $input =& $_COOKIE; break; case 'server' : $input =& $_SERVER; break; case 'globals' : $input =& $GLOBALS; break; default: return NULL; } // 全局過濾 // array_walk_recursive($input,'filter_exp'); if(C('VAR_FILTERS')) { $_filters = explode(',',C('VAR_FILTERS')); foreach($_filters as $_filter){ // 全局參數過濾 array_walk_recursive($input,$_filter); } } if(empty($name)) { // 獲取全部變量 $data = $input; $filters = isset($filter)?$filter:C('DEFAULT_FILTER'); if($filters) { $filters = explode(',',$filters); foreach($filters as $filter){ $data = array_map($filter,$data); // 參數過濾 } } }elseif(isset($input[$name])) { // 取值操作 $data = $input[$name]; $filters = isset($filter)?$filter:C('DEFAULT_FILTER'); if($filters) { $filters = explode(',',$filters); foreach($filters as $filter){ if(function_exists($filter)) { $data = is_array($data)?array_map($filter,$data):$filter($data); // 參數過濾 }else{ $data = filter_var($data,is_int($filter)?$filter:filter_id($filter)); if(false === $data) { return isset($default)?$default:NULL; } } } } }else{ // 變量默認值 $data = isset($default)?$default:NULL; } return $data; }