Heim  >  Artikel  >  Backend-Entwicklung  >  PHP-Framework – thinkPHP-URL-Variable abrufen, nicht $_GET[]-Variable?

PHP-Framework – thinkPHP-URL-Variable abrufen, nicht $_GET[]-Variable?

WBOY
WBOYOriginal
2016-12-01 00:57:011192Durchsuche

Wenn ich „URL_PARAMS_BIND_TYPE“=>1 einschalte, erlaubt //der Parameterübergabemodus die sequentielle Übergabe von Parametern, d. h. die URL schreibt keine Variablennamen

Besuchen

http://localhost/yb1/Home/Get...

Warum gibt es nichts?

Wie kann man $_GET[""] in thinkPHP einen Wert zuweisen?

<code>    public function test($id  ,$name )
    {
        echo $_GET["id"] . "-" . $_GET["name"];
    } 
    </code>

Antwortinhalt:

Wenn ich „URL_PARAMS_BIND_TYPE“=>1 einschalte, erlaubt //der Parameterübergabemodus die sequentielle Übergabe von Parametern, d. h. die URL schreibt keine Variablennamen

Besuchen

http://localhost/yb1/Home/Get...

Warum gibt es nichts?

Wie kann man $_GET[""] in thinkPHP einen Wert zuweisen?

<code>    public function test($id  ,$name )
    {
        echo $_GET["id"] . "-" . $_GET["name"];
    } 
    </code>

Zu diesem Zeitpunkt müssen Sie Code schreiben, um diese magischen Probleme zu erklären.
Schauen Sie nach unten (von ThinkPHPLibraryThinkDispatcher.class.php Zeile 211):

<code>        $depr   =   C('URL_PATHINFO_DEPR');
        $paths  =   explode($depr,trim($_SERVER['PATH_INFO'],$depr));

        if(!defined('BIND_CONTROLLER')) {// 获取控制器
            if(C('CONTROLLER_LEVEL')>1){// 控制器层次
                $_GET[$varController]   =   implode('/',array_slice($paths,0,C('CONTROLLER_LEVEL')));
                $paths  =   array_slice($paths, C('CONTROLLER_LEVEL'));
            }else{
                $_GET[$varController]   =   array_shift($paths);
            }
        }
        // 获取操作
        if(!defined('BIND_ACTION')){
            $_GET[$varAction]  =   array_shift($paths);
        }
        // 解析剩余的URL参数
        $var  =  array();
        if(C('URL_PARAMS_BIND') && 1 == C('URL_PARAMS_BIND_TYPE')){
            // URL参数按顺序绑定变量
            $var    =   $paths;
        }else{
            preg_replace_callback('/(\w+)\/([^\/]+)/', function($match) use(&$var){$var[$match[1]]=strip_tags($match[2]);}, implode('/',$paths));
        }
        $_GET   =  array_merge($var,$_GET);
    }</code>

Der Code schneidet zunächst die Pfadinformationen in der URL aus, die den Getpost/test/2/xxx-Teil darstellen, und in der vorherigen Phase des Erhaltens des Controllers wird Getpost/test entfernt, und schließlich wird der Prozess der Bindung von URL-Parametern durchgeführt paths-Daten werden direkt var zugewiesen und dann im Array $_GET zusammengeführt. Daher gibt es nur Werte im Array $_GET, nicht jedoch den Hauptschlüssel des Hosts, da dies bei TP nicht der Fall ist Wissen Sie, welchen Schlüssel Sie binden möchten.


Bezüglich der Bindung schauen Sie sich weiterhin den Code an:
Schauen Sie nach unten (von ThinkPHPLibraryThinkApp.class.php Zeile 136):

<code>            switch($_SERVER['REQUEST_METHOD']) {
                case 'POST':
                    $vars    =  array_merge($_GET,$_POST);
                    break;
                case 'PUT':
                    parse_str(file_get_contents('php://input'), $vars);
                    break;
                default:
                    $vars  =  $_GET;
            }
            $params =  $method->getParameters();
            $paramsBindType     =   C('URL_PARAMS_BIND_TYPE');
            foreach ($params as $param){
                $name = $param->getName();
                if( 1 == $paramsBindType && !empty($vars) ){
                    $args[] =   array_shift($vars);
                }elseif( 0 == $paramsBindType && isset($vars[$name])){
                    $args[] =   $vars[$name];
                }elseif($param->isDefaultValueAvailable()){
                    $args[] =   $param->getDefaultValue();
                }else{
                    E(L('_PARAM_ERROR_').':'.$name);
                }   
            }
            // 开启绑定参数过滤机制
            if(C('URL_PARAMS_SAFE')){
                $filters     =   C('URL_PARAMS_FILTER')?:C('DEFAULT_FILTER');
                if($filters) {
                    $filters    =   explode(',',$filters);
                    foreach($filters as $filter){
                        $args   =   array_map_recursive($filter,$args); // 参数过滤
                    }
                }                        
            }
            array_walk_recursive($args,'think_filter');
            $method->invokeArgs($module,$args);</code>

Das Obige ist der Code zum Binden von Parametern. Wenn URL_PARAMS_BIND_TYPE wahr ist, werden die Pfadparameter nacheinander zu den Parametern der Funktion angezeigt und dann werden invokeArgs verwendet, um Werte zuzuweisen

Kannst du es nicht einfach machen?

<code>$_GET['id'] = 1001;
$_GET['name'] = 'develop';</code>

dump($_REQUEST); Schauen Sie, vor dem Wert muss ein Parametername in der Form /id/23

stehen

Beispiel: http://192.168.45.3:8125/home...

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn