Just a correction on that. It started as two points, then grew into 4..
I should proof read more often ;)
Mike
Mike Eheler wrote:
> I disagree based simply on two points:
>
> a) Ideally, the $HTTP_POST/GET and $_POST/$_GET vars should be treated
> as "read only".
>
> b) There is no good reason to mix the two. Consistancy is the ideal. If
> you are working on an existing project, and you have the implied need to
> assign values to keys to request variables, then continue to use
> $HTTP_GET_VARS. There is no reason to *not* use $_GET/POST if you're
> working on a new project, and even less of a reason to MIX
> $HTTP_POST/GET and $_POST/GET.
>
> c) What would you expect to happen if you altered a request variable
> that was stuffed in $_REQUEST?
>
> d) $GLOBALS['HTTP_POST_VARS']['my_form_var'] is waaaaaaay too long. When
> I code, I want to complete it as quickly as I can, while maintaining
> quality. Things get too complex when I have to use 40 characters just to
> access a single variable.
>
> Of course, that's just one LAMP's opinion.
>
> Mike
>
> Robert Ames wrote:
>
>> This is the second time in as many weeks that we have been bitten by the
>> fact that $_POST != $HTTP_POST_VARS; Attached is a real-world example of
>> why it is currently bad practice to use the _POST variables.
>>
>> I cannot recommend that anyone use $_POST[..] in their scripts.
>> $GLOBALS['HTTP_POST_VARS'][..] is a much safer, portable, and sane
>> solution, unless $HTTP_POST_VARS is marked as depracated, scheduled to be
>> phased out.
>>
>> For those new to the problem, $_GET and $HTTP_GET_VARS are two totally
>> separate arrays which happen to hold the same data at the beginning of
>> script execution. After script execution has begun, it is VERY DANGEROUS
>> to modify the data contained in either of these arrays, because changes
>> in one are not propagated to the other.
>>
>> The simplest example script is:
>> <?php
>> echo $_GET['test'];
>> echo $HTTP_GET_VARS['test'];
>> $_GET['test'] = 'changed.';
>> echo $_GET['test'];
>> echo $HTTP_GET_VARS['test'];
>> ?>
>>
>> ...The second set of echo statements will print two different values.
>>
>> The situation is worse when you are trying to integrate the usage of
>> $_GET/$_POST into scripts which already make use of $HTTP_*_VARS.
>>
>> The following script is my real-world example of a difficult to trace
>> logic bug caused by $_POST != $HTTP_POST_VARS.
>>
>> The situation is that we have a form with a radio button toggling between
>> two input elements as follows.
>>
>> PRICING:
>> --------
>> ( ) Fixed: $[______]
>> ( ) Negot: $[______]
>>
>> The radio field is named "option", and the two input fields are named
>> "asking1" and "asking2" respectively. On the back end, we store whether
>> the user selected "fixed" or "negotiable", and then 'push' asking1 or
>> asking2 into a variable called "asking_price". We don't care which field
>> they type the price into, but asking1 and asking2 must be named
>> differently so that the browser will not stomp asking prices over each
>> other when posting the information.
>>
>> Our function "gpc" stands for "Get/Post/Cookie", and is very similar to
>> the new $_REQUEST array, except that it returns FALSE if nothing was
>> posted, preventing us from having to do: if(
>> isset($_REQUEST['blah']) ) $result = $_REQUEST['blah'];
>>
>> (because we run with E_NOTICE & E_ALL, and have register_globals
>> turned off)
>> ...instead, we can say:
>> $result = gpc('blah');
>>
>> ...anyway, we've been using PHP for a while now (since well before 4.1
>> ;^), and already have many many scripts and libraries which use the
>> HTTP_*_VARS method of accessing things. It is unsafe to use $_GET and
>> $HTTP_GET_VARS in the same environment.
>>
>> My proposed solutions again:
>>
>> 1) Temporary workaround: $HTTP_GET_VARS =& $_GET;
>> 2) Throw an E_NOTICE if $HTTP_*_VARS or $_* is used as the left-hand side
>> of an assignment. (ie: officially discourage changing $HTTP_*_VARS)
>> 3) Propagate any changes made to $_GET over to $HTTP_GET_VARS and
>> $_REQUEST.
>>
>> #1 works for the most part, but changes is $_GET are not propagated into
>> $_REQUEST, which opens the door for more data inconsistency issues.
>>
>> #2 could possibly be implemented by making $HTTP_*_VARS and $_* into
>> constants... forcing them to be read only.
>>
>> #3 sounds like it would be annoying to implement, but would make it
>> easiest for end-users to use PHP, and have some nice things happen
>> 'magically'.
>>
>> --Robert
>> (crossposting to php.general because I'm sure other people might be
>> running into this problem as well).
>>
>>
>> <?PHP
>>
>> ## example script
>>
>> /* return the user-submitted value of $varname, or false if not found */
>> function gpc( $varname )
>> {
>> if( isset( $GLOBALS['HTTP_GET_VARS'][$varname] ) )
>> return( $GLOBALS['HTTP_GET_VARS'][$varname];
>> elseif( isset( $GLOBALS['HTTP_POST_VARS'][$varname] ) )
>> return( $GLOBALS['HTTP_POST_VARS'][$varname];
>> elseif( isset( $GLOBALS['HTTP_COOKIE_VARS'][$varname] ) )
>> return( $GLOBALS['HTTP_COOKIE_VARS'][$varname];
>> else
>> return( FALSE );
>> }
>>
>> $option = gpc('price_option');
>> if ( $option == 'fixed' )
>> {
>> $_POST['asking_price'] = isset($_POST['asking1']) ?
>> $_POST['asking1'] : '';
>> }
>> elseif ( $option == 'negotiable' )
>> {
>> $_POST['asking_price'] = isset($_POST['asking2']) ?
>> $_POST['asking2'] : '';
>> }
>>
>> $price = gpc('asking_price');
>>
>> echo "User chose $option, with a price of $price";
>> echo "(but we really only changed ${_POST['asking_price']}, so gpc()
>> doesn't know that!)"
>>
>> ?>
>>
>
>
--
Now my EMOTIONAL RESOURCES are heavily committed to 23% of the SMELTING
and REFINING industry of the state of NEVADA!!
--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
To contact the list administrators, e-mail: [EMAIL PROTECTED]