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]