#1 9. April 2011 $_SERVER["argv"] Problem Hallo leute, hab mal ne Frage zu $_SERVER['argv']. Kann mir einer erklären was dieser befehl genau macht. Wenn eine url wie "http://localhost/controller/..." ecingebe bekomme ich ja als array $argv[0]=cl=controller/... zurück. ICh versuche mich gerade im Script vom Codeignitor zurechtzufinden und versteh nicht wirklich was die folgende Fuktion jetzt versucht zu erreichen. PHP: URI . php function _fetch_uri_string () { if ( strtoupper ( $this -> config -> item ( 'uri_protocol' )) == 'AUTO' ) { // Arguments exist, it must be a command line request [ B ]if ( ! empty( $_SERVER [ 'argv' ])) { $this -> uri_string = $this -> _parse_cli_args (); return; }[/ B ] // Let's try the REQUEST_URI first, this will work in most situations if ( $uri = $this -> _detect_uri ()) { $this -> uri_string = $uri ; return; } // Is there a PATH_INFO variable? // Note: some servers seem to have trouble with getenv() so we'll test it two ways $path = (isset( $_SERVER [ 'PATH_INFO' ])) ? $_SERVER [ 'PATH_INFO' ] : @ getenv ( 'PATH_INFO' ); if ( trim ( $path , '/' ) != '' && $path != "/" . SELF ) { $this -> uri_string = $path ; return; } // No PATH_INFO?... What about QUERY_STRING? $path = (isset( $_SERVER [ 'QUERY_STRING' ])) ? $_SERVER [ 'QUERY_STRING' ] : @ getenv ( 'QUERY_STRING' ); if ( trim ( $path , '/' ) != '' ) { $this -> uri_string = $path ; return; } // As a last ditch effort lets try using the $_GET array if ( is_array ( $_GET ) && count ( $_GET ) == 1 && trim ( key ( $_GET ), '/' ) != '' ) { $this -> uri_string = key ( $_GET ); return; } // We've exhausted all our options... $this -> uri_string = '' ; } else { $uri = strtoupper ( $this -> config -> item ( 'uri_protocol' )); if ( $uri == 'REQUEST_URI' ) { $this -> uri_string = $this -> _detect_uri (); return; } elseif ( $uri == 'CLI' ) { $this -> uri_string = $this -> _parse_cli_args (); return; } $this -> uri_string = (isset( $_SERVER [ $uri ])) ? $_SERVER [ $uri ] : @ getenv ( $uri ); } // If the URI contains only a slash we'll kill it if ( $this -> uri_string == '/' ) { $this -> uri_string = '' ; } } Sorry bin Wirtschaftsstudent...kenne mich daher mit solchen Sachen wie z.B. die Kommandozeile etc. nicht wirklich aus. mfg atkaz + Multi-Zitat Zitieren
#2 9. April 2011 AW: $_SERVER["argv"] Problem argv ist im grunde nur bei cli-programmen wichtig, dort werden die parameter die du nach -- an dein script übergiebst gespeichert. Code: php -f script.php -- foo bar baz dann sieht argv so aus: Code: array ( 0 => "script.php", 1 => "foo", 2 => "bar", 3 => "baz" ) + Multi-Zitat Zitieren
#3 9. April 2011 AW: $_SERVER["argv"] Problem danke erstmal für die Antwort. Ich habe nun mal eine Frage zu der o.g. Funktion von CodeIgnitor wenn die Funktion nun aufgerufen wird wird erstmal überprueft ob argv leer ist, wenn nicht wird die fct. _parse_cli_args aufgerufen _parse_cli_args: PHP: private function _parse_cli_args () { $args = array_slice ( $_SERVER [ 'argv' ], 1 ); return $args ? '/' . implode ( '/' , $args ) : '' ; } wenn ich jetzt z.B. das Script wie folg aufrufe: http://localhost/controller ist argv ja: Code: array(1) { [0]=> string(13) "cl=controller" } also ist argv nicht leer, so dass die Funktion _parse_cli_args aufgerufen wird. Da array_slice aber erst ab dem argv[1] anfängt zu zählen und dieser index nicht existiert ist die ausgabe = '' was hat das ganze denn für einen Sinn? Vielleicht übersehe ich einfach etwas, würd mich freuen wenn mir das einer mal kurz erläutern würde, komm da irgendwie nicht weiter. mfg atkaz + Multi-Zitat Zitieren
#4 9. April 2011 AW: $_SERVER["argv"] Problem wenn du dein php-script über die konsole aufrufst, dann ist der erste wert in argv der pfad zum script und alle nachfolgenden die parameter wie ich oben schon beschrieben hatte, sorry das hätte ich vielleicht dazusagen sollen. wenn du dein script über http aufrufst ist argv irrelevant, da dort nur der komplette query-string an index 0 zu finden ist. vergleich: $_SERVER['QUERY_STRING'] die code-stelle PHP: if (!empty( $_SERVER [ 'argv' ])) ist fehlerhaft, das sollte man vielleicht mal als bug melden besser wäre: PHP: if (isset( $_SERVER [ 'argv' ][ 1 ])) oder PHP: if ( $_SERVER [ 'argc' ] > 1 ) + Multi-Zitat Zitieren
#5 9. April 2011 AW: $_SERVER["argv"] Problem hmm...das erklärt natürlich Einiges... Danke für die erklärung hab nun denn Sinn des ganzen verstanden... + Multi-Zitat Zitieren
#6 9. April 2011 AW: $_SERVER["argv"] Problem hm? PHP: var_dump ( empty( $_SERVER [ 'argv' ]), empty( $_SERVER [ 'argc' ]), empty( $_SERVER ) ); Code: bool(true) bool(true) bool(false) + Multi-Zitat Zitieren
#7 9. April 2011 AW: $_SERVER["argv"] Problem ok "nie" stimmt wohl nicht ganz, aber bei der verwendung von php soll es ab und zu vorkommen, dass findige programmierer parameter via GET übergeben (hab ich mir sagen lassen ) uri: http://localhost/argv.php?was=ist&das=denn PHP: var_dump (empty( $_SERVER [ 'argv' ])); var_dump (isset( $_SERVER [ 'argv' ][ 1 ])); // richtige abfrage Code: bool(false) bool(false) + Multi-Zitat Zitieren
#8 10. April 2011 AW: $_SERVER["argv"] Problem War bei mir trotzdem Code: bool(true) bool(true) Nach einer kurzen Suche auf php.net weiß ich jetzt auch wieso: PHP: Beschreibung der php.ini-Direktiven des Sprachkerns - Manual Mit register_argc_argv auf "on": Code: bool(false) bool(false) + Multi-Zitat Zitieren