php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Doc Bug #43313 getopt() doesn't handle unknown parameters
Submitted: 2007-11-16 15:18 UTC Modified: 2009-12-25 00:27 UTC
Votes:2
Avg. Score:3.0 ± 0.0
Reproduced:2 of 2 (100.0%)
Same Version:1 (50.0%)
Same OS:1 (50.0%)
From: RQuadling at GMail dot com Assigned:
Status: Closed Package: Documentation problem
PHP Version: 5CVS-2008-11-11 OS: *
Private report: No CVE-ID:
 [2007-11-16 15:18 UTC] RQuadling at GMail dot com
Description:
------------
getopt() stops processing at the first unknown parameter.

I'm not sure if this is ...

a php bug - getopt should return them as is

or ...

a doc bug - getopt() will cease operation at the first hurdle.



My preference is to return them as is. Maybe a third param to the function to collect unknown parameters. This would provide backward compatibility if the function didn't die when an unknown parameter was reached.




The code is a simple test to examine the command line.

Run this with this parameter

-a 1

and then with these

broken -a 1


Reproduce code:
---------------
<?php
var_dump($_SERVER['argv'], getopt('a:b', array('apple=', 'bag')));
?>

Expected result:
----------------
array(3) {
  [0]=>
  string(17) "C:\phpargtest.php"
  [1]=>
  string(2) "-a"
  [2]=>
  string(1) "1"
}
array(1) {
  ["a"]=>
  string(1) "1"
}

array(4) {
  [0]=>
  string(17) "C:\phpargtest.php"
  [1]=>
  string(6) "broken"
  [2]=>
  string(2) "-a"
  [3]=>
  string(1) "1"
}
array(1) {
  [0]=>
  string(6) "broken"
  ["a"]=>
  string(1) "1"
}


Actual result:
--------------
array(3) {
  [0]=>
  string(17) "C:\phpargtest.php"
  [1]=>
  string(2) "-a"
  [2]=>
  string(1) "1"
}
array(1) {
  ["a"]=>
  string(1) "1"
}

array(4) {
  [0]=>
  string(17) "C:\phpargtest.php"
  [1]=>
  string(6) "broken"
  [2]=>
  string(2) "-a"
  [3]=>
  string(1) "1"
}
array(0) {
}

Patches

Add a Patch

Pull Requests

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2009-03-31 15:41 UTC] hradtke@php.net
I have a patch for this bug.  Actually, I am not sure this is even a bug.  POSIX says that getopt should break on the first non-option.  Also, the php_getopt() function needs to break on the first non-option.  Consider the following: php -n test.php -a 1 -b 2

That being said, the getopt() userspace function can be made to work both ways.  I have a patch to allow php_getopt() to ignore unknown parameters.  

One question: Should getopt() have its prototype changed to: array getopt  ( string $options  [, array $longopts, bool posix ] ) ? It would default to true if not specified (for BC).  Setting it to false would make it ignore non-options.


 [2009-04-01 11:34 UTC] jani@php.net
Let's stick with the POSIX way. And document it as is.
 [2009-04-01 13:44 UTC] rquadling@php.net
The main problem is that you don't get any feedback to say that 
userland getopt() HAS encountered an unknown parameter.

If you have supplied a set of parameters to getopt() and one is 
mistyped at the command line, you only get the valid ones to the left 
of the mistyped one.

I'm happy that that array returned should only contain valid 
parameters.

What I would like to have is the broken parameter and any remaining 
parameters to be returned as an additional array.

Ideally, skipping broken parameters, but I think that would actually 
cause more headaches.

Having to process $argc manually to determine if all the supplied 
parameters have been parsed appropriately completely negates the use 
of getopt().



 [2009-12-16 22:40 UTC] svn@php.net
Automatic comment from SVN on behalf of seld
Revision: http://svn.php.net/viewvc/?view=revision&revision=292224
Log: Adds a note about unknown parameters ending getopt() parsing, fixes bug #43313
 [2009-12-16 22:42 UTC] j dot boggiano at seld dot be
I fixed this as far as the doc is concerned, but I still agree that having a third "array &$rest" argument would be useful. I'll let others decide whether this ought to be closed or not.
 [2009-12-17 12:10 UTC] svn@php.net
Automatic comment from SVN on behalf of seld
Revision: http://svn.php.net/viewvc/?view=revision&revision=292247
Log: Fixes SQL query in example #2 of mysql_stat, fixes bug #43313
 [2009-12-17 12:13 UTC] seld@php.net
Disregard last commit message, I forgot to change the bug number sorry.
 [2009-12-25 00:27 UTC] kalle@php.net
Lets close this, if the need for a third parameter for getopt() is there, then post a FR instead :)
 
PHP Copyright © 2001-2014 The PHP Group
All rights reserved.
Last updated: Sun Apr 20 20:02:01 2014 UTC