http://qs321.pair.com?node_id=665151

lepetitalbert has asked for the wisdom of the Perl Monks concerning the following question:

Dear Monks,

I have a script :

if ( $mode eq "add" ) { # print add page form } if ( $mode eq "save" ) { # save add form infos }

At the end of the add page form :

print hidden( 'mode' , 'save' );

But the output is :

<input type="hidden" name="mode" value="add" />

which is the value of the 'mode' param from the 'previous script call' (is this english ?)

if I replace

print hidden( 'mode' , 'save' );

with

<input type=hidden name=mode value=save />

it works.

I suspected the param value is stored someway and tried :

$query -> delete('mode'); $query -> delete_all();

but my mode is still set to 'add'.

How can I fix this ?

Thanks.

Have a nice day.

"There is only one good, namely knowledge, and only one evil, namely ignorance." Socrates

Replies are listed 'Best First'.
Re: Cannot clear cgi param (if it's really what I need to do)
by moritz (Cardinal) on Jan 30, 2008 at 16:21 UTC
    When you clear the data from a particular CGI object, $query, you should call the method hidden on that object. Don't use the sub form.

    I think

    my $query = new CGI; $query->delete_all(); print $query->hidden(mode => 'save');
    should work (not tested, though).

      Hi moritz

      Yes works :)

      Besten Dank !

      Have a nice day.

      "There is only one good, namely knowledge, and only one evil, namely ignorance." Socrates
Re: Cannot clear cgi param (if it's really what I need to do)
by kyle (Abbot) on Jan 30, 2008 at 17:10 UTC

    According to the CGI documentation (under "CREATING FILL-OUT FORMS"), you have to tell it that you really mean for the parameter to be what you asked it to be. (I have found this behavior annoying frequently, but it is documented.)

    use CGI; my $cgi = CGI->new(); $cgi->param( 'mode', 'orig' ); print $cgi->hidden( 'mode', 'second arg' ), "\n"; print $cgi->hidden( -name => 'mode', -default => 'default', ), "\n"; print $cgi->hidden( -name => 'mode', -default => 'forced', -override => 1 ), "\n"; __END__ <input type="hidden" name="mode" value="orig" /> <input type="hidden" name="mode" value="orig" /> <input type="hidden" name="mode" value="forced" />

      Hi kyle,

      I came accross the '-override', but as I

      print hidden(); instead of print $cgi->hidden()

      it has no effect.

      Thank you.

      Have a nice day

      "There is only one good, namely knowledge, and only one evil, namely ignorance." Socrates

        This does not appear to be the case.

        BEGIN { $ENV{QUERY_STRING} = 'mode=orig'; $ENV{REQUEST_METHOD} = 'GET'; } use CGI qw( hidden ); print hidden( 'mode', 'second arg' ), "\n"; print hidden( -name => 'mode', -default => 'default', ), "\n"; print hidden( -name => 'mode', -default => 'forced', -override => 1 ), "\n"; __END__ <input type="hidden" name="mode" value="orig" /> <input type="hidden" name="mode" value="orig" /> <input type="hidden" name="mode" value="forced" />

        Perhaps your code is doing something different from what you think it's doing?