On Thu, 2002-01-24 at 13:42, Rasmus Lerdorf wrote: > I think the real answer here is to treat these as read-only arrays. ie. > never use them on the left side of the '=' and you will never run into > problems. Or if you do, be consistent and use the same array all the > time. You are writing your code with the assumption that these two arrays > are the same. Where does this assumption come from? Hopefully not the > documentation. > > -Rasmus
No, they are properly--if lightly--documented on the following pages: http://www.php.net/manual/en/language.variables.predefined.php http://www.php.net/release_4_1_0.php Robert, the $HTTP_*_VARS have, indeed, been deprecated, and this is noted in the manual. Torben > On Thu, 24 Jan 2002, 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!)" > > > > ?> > > > > -- > > 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] > > > > > -- > PHP Development 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] > > -- Torben Wilson <[EMAIL PROTECTED]> http://www.thebuttlesschaps.com http://www.hybrid17.com http://www.inflatableeye.com +1.604.709.0506 -- 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]