PDA

Bekijk Volledige Versie : variabel check probleem bij formulier (PHP)



Matthijs de Z
13/02/05, 14:45
Hallo,

Ik heb een PHP script gemaakt met een formulier er in. Het formulier is
gewoon in HTML en buiten de PHP code gesloten (dus einde ?> dan HTML en dan
weer <?php)

De PHP pagina moet de gegevens van een contactforumulier verzenden. Nu heb
ik het volgende idee proberen uit te werken (flink ingekort voor het
voorbeeld):

<?php
if($status="verstuurd")
{
VERSTUUR DE GEGEVENS
}
else
{
Geef het formulier weer met onder andere dit als HTML code:
<form action="http://localhost/tf/bevestiging-1.php" method="post">
en
<input name="status" type="hidden" value="verstuurd">
</form>
}

Het vervelende is dat als ik op de submit knop beuk, ik weer teruggestuurd
word naar het formulier. De if($status="verstuurd") voorwaarde zit $status
dus blijkbaar niet als verstuurd. Ook als ik
http://localhost/tf/bevestiging-1.php?status=nietverzonden intype in de
adresbalk, kom ik gewoon weer bij het formulier. Ik heb ook
if($status=="verstuurd") geprobeerd, omdat dat volgens mij de correct manier
zou moeten zijn. Aangezien $status="verstuurd" het toewijzen van een waarde
aan een variabele is en if($status="verstuurd") het controleren of $status
gelijk is aan "verstuurd"
Maar toch werkt het niet. Iemand een idee?
Groeten,

Matthijs

Rene Pijlman
13/02/05, 14:55
Matthijs de Z:
>Het vervelende is dat als ik op de submit knop beuk, ik weer teruggestuurd
>word naar het formulier. De if($status="verstuurd") voorwaarde zit $status
>dus blijkbaar niet als verstuurd.

Dit lijkt me een gevalletje van register_globals die (terecht) off staat.
Zie http://nl3.php.net/register_globals

--
René Pijlman

Wat wil jij leren? http://www.leren.nl

Matthijs de Z
13/02/05, 15:05
> >Het vervelende is dat als ik op de submit knop beuk, ik weer
teruggestuurd
> >word naar het formulier. De if($status="verstuurd") voorwaarde zit
$status
> >dus blijkbaar niet als verstuurd.
>
> Dit lijkt me een gevalletje van register_globals die (terecht) off staat.
> Zie http://nl3.php.net/register_globals

Ik heb in PHP.ini.conf REGISTER_GLOBALS = on gedaan en in het PHP script het
volgende

<?php
DEFINE('REGISTER_GLOBALS','on');
if($status=="verstuurd")
{
verstuur
}
else
{
Geef het formulier weer met onder andere dit als HTML code:
<form action="http://localhost/tf/bevestiging-1.php" method="post">
en
<input name="status" type="hidden" value="verstuurd">
</form>
}

Dan nog behoud ik hetzelfde probleem. Ik draai phpdev423 op windows98.
Groeten,

Matthijs

Rene Pijlman
13/02/05, 15:15
Matthijs de Z:
>if($status=="verstuurd")

En $_POST['status'] ?
http://nl3.php.net/manual/en/language.variables.external.php

Als dat niet lukt, wat staat er in $_POST?

--
René Pijlman

Wat wil jij leren? http://www.leren.nl

Matthijs de Z
13/02/05, 15:35
> En $_POST['status'] ?
> http://nl3.php.net/manual/en/language.variables.external.php
>
> Als dat niet lukt, wat staat er in $_POST?

Bedankt voor je antwoord. Ik ga dit vanavond eens even bekijken. Ik moet nu
onverwacht weg. Je hoort de afloop.
Groeten,

Matthijs

Matthijs de Z
13/02/05, 21:45
> Matthijs de Z:
> >if($status=="verstuurd")
>
> En $_POST['status'] ?
> http://nl3.php.net/manual/en/language.variables.external.php
>
> Als dat niet lukt, wat staat er in $_POST?

Zo, net getest en dat werkt inderdaad. Bedankt voor de gouden tip.
Groeten,

Matthijs

Rene Pijlman
13/02/05, 22:05
Matthijs de Z:
>> En $_POST['status'] ?

>Zo, net getest en dat werkt inderdaad.

Dit is bovendien een betere oplossing dan register_globals aanzetten, want
die hoort uit te staan i.v.m. veiligheidsrisico's.

--
René Pijlman

Wat wil jij leren? http://www.leren.nl

Matthijs de Z
13/02/05, 22:25
> Dit is bovendien een betere oplossing dan register_globals aanzetten, want
> die hoort uit te staan i.v.m. veiligheidsrisico's.

OK, zet ik die ook weer uit.
Groeten,

Matthijs

Erick T. Barkhuis
13/02/05, 22:45
Rene Pijlman [on Sun, 13 Feb 2005 22:01:04 +0100] wrote:
> Matthijs de Z:
> >> En $_POST['status'] ?
>
> >Zo, net getest en dat werkt inderdaad.
>
> Dit is bovendien een betere oplossing dan register_globals aanzetten, want
> die hoort uit te staan i.v.m. veiligheidsrisico's.

Ik hoor hier zelden het advies om voorin het script uit te voeren:
extract ($_POST, EXTR_PREFIX_SAME, "AlternatieveNaam");

Is daar wellicht iets mee mis? Volgens mij heb je hiermee geen
veiligheidsproblemen, maar wel de voordelen van de (nagebootste)
register_globals.

--
Erick

"I think animal testing is a terrible idea; they get all nervous and give the wrong answers."

Rene Pijlman
13/02/05, 23:05
Erick T. Barkhuis:
>Ik hoor hier zelden het advies om voorin het script uit te voeren:
> extract ($_POST, EXTR_PREFIX_SAME, "AlternatieveNaam");

Dit kende ik nog niet.

>Is daar wellicht iets mee mis?

Een nadeel lijkt me in ieder geval dat je niet weet hoe je variabelen
komen te heten, want als ik het goed begrijk kunnen ze met deze methode
een prexix krijgen.

Nog een lezenswaardig citaat uit de PHP manual:

"Warning
Do not use extract() on untrusted data, like user-input ($_GET, ...). If
you do, for example, if you want to run old code that relies on
register_globals temporarily, make sure you use one of the non-overwriting
extract_type values such as EXTR_SKIP and be aware that you should extract
$_SERVER, $_SESSION, $_COOKIE, $_POST and $_GET in that order."

>Volgens mij heb je hiermee geen veiligheidsproblemen, maar wel de
>voordelen van de (nagebootste) register_globals.

Wat zijn volgens jou die voordelen?

--
René Pijlman

Wat wil jij leren? http://www.leren.nl

Erick T. Barkhuis
14/02/05, 06:55
Rene Pijlman [on Sun, 13 Feb 2005 22:59:19 +0100] wrote:
> Erick T. Barkhuis:

[Gebruik van de extract()-functie

> Een nadeel lijkt me in ieder geval dat je niet weet hoe je variabelen
> komen te heten, want als ik het goed begrijk kunnen ze met deze methode
> een prefix krijgen.

Dat is waar.
Ik gebruik het veelal bij verwerking van html-formulieren, waarbij ik
uiteraard weet hoe de namen van de velden luiden (tenzij iemand die gaat
zitten manipuleren)
Zolang je de namen wat handig kiest zul je geen botsingen krijgen met
variabele-namen die je al in je script gebruikt.

> Nog een lezenswaardig citaat uit de PHP manual:
>
> "Warning
> Do not use extract() on untrusted data, like user-input ($_GET, ...). If
> you do, for example, if you want to run old code that relies on
> register_globals temporarily, make sure you use one of the non-overwriting
> extract_type values such as EXTR_SKIP and be aware that you should extract
> $_SERVER, $_SESSION, $_COOKIE, $_POST and $_GET in that order."

Het tweede deel van deze aanwijzingen (de voolgorde) had ik nog niet eens
gelezen. Goed om te weten.
Het eerste deel geeft aan waarvoor ik het gebruik, en op welke manier.


> >Volgens mij heb je hiermee geen veiligheidsproblemen, maar wel de
> >voordelen van de (nagebootste) register_globals.
>
> Wat zijn volgens jou die voordelen?

Behoud van werkende, wat oudere code, ook als register_globals uit staat.
Door toevoeging van de extract() worden de variabelen weer netjes gevuld
zoals dat het geval was voor de register_globals-wijziging in PHP.

Alternatief zou zijn om overal waar dat van toepassing is in de code
aanpassingen te maken: $variabelenaam vervangen door
$_POST['variabelenaam'].
Afgezien van het edit-werk, vereist dit - vermoed ik - ook meer test- en
herstelwerk...vooral als je te maken hebt met scripts die je al een hele
tijd niet meer hebt bekeken, en de documentatie....ehhh...avontuurlijk
genoemd kan worden.

--
Erick

"Talk is cheap because supply exceeds demand."

Matthijs de Z
14/02/05, 11:15
> Ik hoor hier zelden het advies om voorin het script uit te voeren:
> extract ($_POST, EXTR_PREFIX_SAME, "AlternatieveNaam");

Dit is echt heel handig! Werkt perfect.
Enige vraag die me nog rest (kon ik niet op php.net vinden) is, waar staat
"AlternatieveNaam" voor en wat kun je daar mee?
Groeten,

Matthijs

Rene Pijlman
14/02/05, 11:25
Matthijs de Z:
>Enige vraag die me nog rest (kon ik niet op php.net vinden) is, waar staat
>"AlternatieveNaam" voor en wat kun je daar mee?

Dat staat op php.net in de beschrijving van de functie extract().

--
René Pijlman

Wat wil jij leren? http://www.leren.nl

Matthijs de Z
14/02/05, 11:25
> >Enige vraag die me nog rest (kon ik niet op php.net vinden) is, waar
staat
> >"AlternatieveNaam" voor en wat kun je daar mee?
>
> Dat staat op php.net in de beschrijving van de functie extract().

Thanks, ik zocht op $_POST, EXTR_PREFIX_SAME.
Mazzel,

Matthijs

Rene Pijlman
14/02/05, 11:35
Erick T. Barkhuis:
>Rene Pijlman:
>[Gebruik van de extract()-functie
>> Wat zijn volgens jou die voordelen?
>
>Behoud van werkende, wat oudere code, ook als register_globals uit staat.

Ah ja. Al behoud je natuurlijk ook een deel van de nadelen van
register_globals. Zo zou het veiligheidsprobleem dat geïllustreerd wordt
in "Example 29-1" op http://nl3.php.net/register_globals na zo'n extract
nog steeds bestaan.

Overigens staat hier een compleet lapje code dat nodig schijnt te zijn om
register_globals=on te simuleren (aldaar ten onrechte emuleren genoemd):
http://nl3.php.net/manual/en/faq.misc.php#faq.misc.registerglobals

--
René Pijlman

Wat wil jij leren? http://www.leren.nl

Marcel
18/02/05, 12:25
> <?php
> if($status="verstuurd")
> {
> VERSTUUR DE GEGEVENS
> }
> else
> {
> Geef het formulier weer met onder andere dit als HTML code:
> <form action="http://localhost/tf/bevestiging-1.php" method="post">
> en
> <input name="status" type="hidden" value="verstuurd">
> </form>
> }
>

Ik weet het niet hoor maar in het voorbeeld gebruik je

if($status="verstuurd")

dat moet zijn:

if($status=="verstuurd")

Dan heb je alle andere omslachtigheden hier beschreven niet eens nodig....

Marcel

Matthijs de Z
18/02/05, 15:55
> Ik weet het niet hoor maar in het voorbeeld gebruik je
>
> if($status="verstuurd")
>
> dat moet zijn:
>
> if($status=="verstuurd")
>
> Dan heb je alle andere omslachtigheden hier beschreven niet eens nodig....

Bedankt voor je reactie, maar ik schreef al eerder dat ik dat ook reeds had
geprobeerd. Maar dat gaf niet het gewenste resultaat. De tip van Rene deed
het wel.
Mazzel,

Matthijs