[PHP] $_SERVER["argv"] Problem

Dieses Thema im Forum "Webentwicklung" wurde erstellt von Atkaz, 9. April 2011 .

  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 ) ==  &&  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
     
  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" )
     
  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
     
  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 )
     
  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...
     
  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)
     
  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)
     
  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)
     
  9. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.