[php] form fields makkelijk uitlezen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • BKJ
  • Registratie: April 2000
  • Laatst online: 18-09 14:52
ben bezig met een projectje. Daarin zit een invulformulier met 24(!) velden. Nu kan ik wel dit doen:

PHP:
1
2
3
$plaats = $_POST['plaats'];
    $straat = $_POST['straat'];
    $postcode = $_POST['postcode']; etc etc etc


Maar kan dit ook makkelijker? In 1x alles herkennen en dan alles opslaan in de variabele die gelijk is met de fieldname? (registere_globals staat off)

[ Voor 6% gewijzigd door BKJ op 05-10-2004 18:12 ]

Kamer huren


Acties:
  • 0 Henk 'm!

Verwijderd

Alles staat in principe in een array in $_POST.

Je zou die stap voor stap kunnen doorlopen in een loop mbv foreach.

Acties:
  • 0 Henk 'm!

Verwijderd

http://nl2.php.net/extract

Het is overigens wel handig om te weten waar je variabelen vandaan komen, dus ik zou het gewoon zo laten :)

[ Voor 69% gewijzigd door Verwijderd op 05-10-2004 17:37 ]


Acties:
  • 0 Henk 'm!

  • bakakaizoku
  • Registratie: Januari 2002
  • Laatst online: 17-09 10:27
Waarom zet je het in een nieuwe variable ?

Als het om het escapen etc gaat, dan kun je dat makkelijk met een foreach loop doen. Is het om in een string (bijv. sql te gooien) dan kun je hem altijd nog tussen { } zetten..

bijv.

PHP:
1
2
3
4
5
6
7
<?
foreach ($_POST as $tmp => $waarde) {
   $_POST[$tmp] = addslashes($waarde); }
}

$query = "insert into table values('{$_POST['bla']}', etc');";
?>

PSN: bakakaizoku - WoW: Thiccblonde (GM of Phoenix Ascension) @ Twisting-Nether


Acties:
  • 0 Henk 'm!

  • BKJ
  • Registratie: April 2000
  • Laatst online: 18-09 14:52
Dus als ik bv wil checken of een van de variabelen leeg is:

PHP:
1
foreach ($_POST as $tmp as $waarde) {if (strlen($waarde)==0) {error("Niet alle velden zijn goed ingevuld");die;}}

[ Voor 12% gewijzigd door BKJ op 05-10-2004 17:43 ]

Kamer huren


Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

hitchhacker schreef op 05 oktober 2004 @ 17:42:
Dus als ik bv wil checken of een van de variabelen leeg is:

PHP:
1
2
foreach ($_POST as $tmp as $waarde) { if (strlen($waarde)==0) { 
   error("Niet alle velden zijn goed ingevuld");die;}}
en wat met variabelen die niet meegestuurd zijn ;)
mattttt schreef op 05 oktober 2004 @ 17:34:
PHP:
1
$query = "insert into table values('{$_POST['bla']}', etc');";
waarom niet gewoon duidelijk code gebruiken :?
PHP:
1
$query = "insert into table values('".$_POST['bla']."', etc');";

[ Voor 10% gewijzigd door Erkens op 05-10-2004 17:45 ]


Acties:
  • 0 Henk 'm!

  • BKJ
  • Registratie: April 2000
  • Laatst online: 18-09 14:52
Erkens schreef op 05 oktober 2004 @ 17:45:
[...]

en wat met variabelen die niet meegestuurd zijn ;)


[...]
Ik neem aan dat de veldjes die leeg blijven wel meegestuurd worden in de aanroep? Dus bv:
code:
1
?bla1=&bla2=&bla3=gevuld

Kamer huren


Acties:
  • 0 Henk 'm!

Verwijderd

Je kunt ook per variable checken of de waarde a) gezet is en b) een goed formaat heeft. Nadeel; is veel werk met 24 velden. Voordeel; je formulier zit goed dicht.
Door sessies te zetten kun je de goede data van de gebruiker bewaren en opnieuw in het formulier plaatsen.

Voorbeeld:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
// error handling
// --------------------------------------------------------------------------
$errors = array();

/**
 * Start - Form input checks
 */

// lev_naam
if(!isSet($_POST['lev_naam']) OR
$_POST['lev_naam'] == "" OR 
!ereg("^[a-zA-Z0-9& _-]+$", $_POST['lev_naam'])) {
    $errors[] = 'Naam leverancier';
}

// lev_nummer
if(isSet($_POST['lev_nummer']) AND
$_POST['lev_nummer'] != "" AND
!ereg("^[a-zA-Z0-9& _-]+$", $_POST['lev_nummer'])) {
    $errors[] = 'Klantnummer';
}

/**
 * Eind - Form input checks
 */

// zijn er errors? -> Ja, functie aanroepen en sessies zetten
if(isSet($errors) AND (count($errors) >= 1))
{
        
    $_SESSION['data']['page'] = $_GET['page'];

    for($veld=0; $veld<count($velden); $veld++) {
        $_SESSION['data']['fields'][$velden[$veld]] = $_POST[$velden[$veld]];
    }
            
    error_handling("index.php?page=".$_GET['page']."", $errors);

} else
{

    echo 'Verder gaan.';

}


In de functie error handling heb ik tevens een exit() zitten, maar dat hangt van je pagina af en is niet altijd nuttig/op zijn plaats.

Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

hitchhacker schreef op 05 oktober 2004 @ 17:51:
[...]


Ik neem aan dat de veldjes die leeg blijven wel meegestuurd worden in de aanroep? Dus bv:
code:
1
?bla1=&bla2=&bla3=gevuld
nooit iets aannemen als het om userinput gaat :)

Acties:
  • 0 Henk 'm!

  • BKJ
  • Registratie: April 2000
  • Laatst online: 18-09 14:52
Verwijderd schreef op 05 oktober 2004 @ 17:52:
Je kunt ook per variable checken of de waarde a) gezet is en b) een goed formaat heeft. Nadeel; is veel werk met 24 velden. Voordeel; je formulier zit goed dicht.
Door sessies te zetten kun je de goede data van de gebruiker bewaren en opnieuw in het formulier plaatsen.

Voorbeeld:


In de functie error handling heb ik tevens een exit() zitten, maar dat hangt van je pagina af en is niet altijd nuttig/op zijn plaats.
Ik test al veel met javascript op juistheid. Voorbeeld:
code:
1
2
3
4
5
6
7
8
9
10
if(!theForm.postcode.value == '')
    {
    var azip=/\d{4}[a-z]{2}/i;
    if (!azip.test(theForm.postcode.value))
        {
            alert(" Vul een geldige postcode in.\n (Bijvoorbeeld 1234AA)");
            theForm.postcode.focus();
            return false;
        }
    }


Bij geen JS aan geef ik gewoon de foutmelding: Niet alle velden zijn goed ingevuld....

Kamer huren


Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

hitchhacker schreef op 05 oktober 2004 @ 17:54:
[...]


Ik test al veel met javascript op juistheid. Voorbeeld:
Allemaal leuk en aardig hoor, maar je moet _nooit_ vergeten om alles nogmaals te checken aan de server kant (daar waar je de data gaat verwerken) immers, ik kan zo de boel faken waardoor jij denkt dat de data gechecked is door mijn browser, maar vervolgens loopt je applicatie erop stuk in het minst erge geval :)

Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
extract is idd een goede oplossing, maar dit is ook wel het vermelden waard:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php

$arr = array('var1' => 1, 'var2' => 2);

foreach ( $arr as $index => $value )
{
    ${$index} = $value;
}

print $var1;
print $var2;

?>

Dan weet je in ieder geval dat dit ook mogelijk is.

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

Michali schreef op 05 oktober 2004 @ 17:57:
extract is idd een goede oplossing, maar dit is ook wel het vermelden waard:
PHP:
1
    ${$index} = $value;

Dan weet je in ieder geval dat dit ook mogelijk is.
niet dat je zoiets moet gebruiken :X
jammer dat dit mogelijk is met php ;(

sommige mensen willen gewoon geen goed onderhoudbare code....

Acties:
  • 0 Henk 'm!

  • X-Lars
  • Registratie: Januari 2004
  • Niet online

X-Lars

Just GoT it.

Ik zag iets met sessions staan net. Dat is echt niet nodig als je in de HTML gewoon dit doet (sorry voor de layoutvern**king), althans voor je form-verwerking:
PHP:
1
<input type="text" name="veld" id="veld" value="<?=isset($_POST['veld']) ? $_POST['veld'] : '';?>" />

Acties:
  • 0 Henk 'm!

  • Fuzzillogic
  • Registratie: November 2001
  • Laatst online: 01-07 22:34
X-Lars schreef op 05 oktober 2004 @ 18:03:
Ik zag iets met sessions staan net. Dat is echt niet nodig als je in de HTML gewoon dit doet (sorry voor de layoutvern**king), althans voor je form-verwerking:
PHP:
1
<input type="text" name="veld" id="veld" value="<?=isset($_POST['veld']) ? $_POST['veld'] : '';?>" />
Doe dan gelijk gewoon
PHP:
1
<input type="text" name="veld" id="veld" value="<?= $_POST['veld'];?>" />

Netter is natuurlijk nog htmlentities() te gebruiken. Overigens kan ik het gebruik van een template engine zéér aanraden: PHP en HTML in 1 bestand is echt pure ellende als het aankomt op onderhoud.

Om te controleren of alle variabelen gezet zijn kun je ze in 1 keer aan isset() voeren. Dat is een language-construct en geen functie. empty() is een nettere variant van strlen()==0.

Acties:
  • 0 Henk 'm!

  • Jerry
  • Registratie: September 2001
  • Laatst online: 09-04-2022

Jerry

Who?

Ik gebruik zoiets:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// Haal veldnamen uit database
$fields = mysql_list_fields("dbnaam", "tabelnaam");
$columns = mysql_num_fields($fields);

// alle veldnamen in een array
for ($i = 0; $i < $columns; $i++)
{
    $fieldnames[$i] = mysql_field_name($fields, $i);
}

for($i = 0; $i < $columns; $i++)
{
    $temp = addslashes($_POST[$fieldnames[$i]]);
    $test_array[$i] = $temp;
}


En om ze dan in een db te gooien:
PHP:
1
2
// Maak query om gegevens in tabel te stoppen 
$query = "INSERT INTO tabelnaam (".implode(", ", $fieldnames).") VALUES ('".implode("','", $test_array)."')";


Uiteraard zitten hier nog geen checks ingebakken + soz voor layout :X

Specs
Youtube celebrity
D3 Crusader


Acties:
  • 0 Henk 'm!

Verwijderd

Nexxennium schreef op 05 oktober 2004 @ 18:12:
[...]

Doe dan gelijk gewoon
PHP:
1
<input type="text" name="veld" id="veld" value="<?= $_POST['veld'];?>" />
Zet je error_reporting is op E_ALL :)

Acties:
  • 0 Henk 'm!

  • Fuzzillogic
  • Registratie: November 2001
  • Laatst online: 01-07 22:34
Ja en welke hosting-provider heeft dat? Juist, geen. Ik ben voorstander van netjes programmeren, maar in dit soort gevallen opt ik toch voor de KISS oplossing.

Acties:
  • 0 Henk 'm!

  • BKJ
  • Registratie: April 2000
  • Laatst online: 18-09 14:52
Mr_UnAnimouS schreef op 05 oktober 2004 @ 18:45:
Ik gebruik zoiets:

PHP:
1
...


En om ze dan in een db te gooien:
PHP:
1
...


Uiteraard zitten hier nog geen checks ingebakken + soz voor layout :X
Dan moeten dus alle velden PRECIES gelijk zijn aan de velden in de DB èn de volgorde moet gelijk zijn.....

[ Voor 45% gewijzigd door BKJ op 05-10-2004 20:41 ]

Kamer huren


Acties:
  • 0 Henk 'm!

  • blizt
  • Registratie: Januari 2003
  • Laatst online: 11-12-2024

blizt

Wannabe-geek

Nexxennium schreef op 05 oktober 2004 @ 19:55:
Ja en welke hosting-provider heeft dat? Juist, geen.
Wat bedoel je hier nu? Welke hosting-provider error_reporting op E_ALL heeft? Ok, misschien niet veel ... Maar veel mensen die ik ken doen het zelf wel in hun script (in de config-file ofzo) - ik ook trouwens.

United we stand, and divided we fall


Acties:
  • 0 Henk 'm!

Verwijderd

Nexxennium schreef op 05 oktober 2004 @ 19:55:
Ja en welke hosting-provider heeft dat? Juist, geen. Ik ben voorstander van netjes programmeren, maar in dit soort gevallen opt ik toch voor de KISS oplossing.
Je zou dan toch moeten begrijpen dat een hosting provider helemaal niet alle fouten moet laten zien. E_ALL is er voor developers, niet voor productie-machines.

Als je bij het ontwikkelen werkelijk alle errors, warnings en notices hebt weggewerkt met netjes programmeren, weet je in elk geval dat daar geen problemen meer door kunnen ontstaan.
Nexxennium schreef op 05 oktober 2004 @ 18:12:

Doe dan gelijk gewoon
PHP:
1
<input type="text" name="veld" id="veld" value="<?= $_POST['veld'];?>" />

Netter is natuurlijk nog htmlentities() te gebruiken.
Het is niet alleen netter, je bent gewoon een prutser als je het niet gebruikt. :)
Overigens kan ik het gebruik van een template engine zéér aanraden: PHP en HTML in 1 bestand is echt pure ellende als het aankomt op onderhoud.
PHP is prima als template engine te gebruiken. Je hoeft niet de code die data verzamelt, verwerkt en output in dezelfde bestanden te stoppen. Dat moet je gewoon netjes in fasen afhandelen, dan gaat het helemaal prima, ook zonder zelfgemaakte of geleende template engine. Feitelijk doe je daarmee haast hetzelfde.
Om te controleren of alle variabelen gezet zijn kun je ze in 1 keer aan isset() voeren. Dat is een language-construct en geen functie. empty() is een nettere variant van strlen()==0.
empty en strlen()==0 zijn twee verschillende dingen. De empty "functie" is een combinatie van isset en het kijken of er een waarde uit te halen is die evalueert als "true" of een niet-lege array en dergelijke.

[ Voor 4% gewijzigd door Verwijderd op 05-10-2004 20:51 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Erkens schreef op 05 oktober 2004 @ 18:00:
[...]

niet dat je zoiets moet gebruiken :X
jammer dat dit mogelijk is met php ;(

sommige mensen willen gewoon geen goed onderhoudbare code....
Wat is hier erg aan dan? Je krijgt zo toch de variabelen die je wilt simpel en kort in je script?

Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

Verwijderd schreef op 06 oktober 2004 @ 09:54:
[...]


Wat is hier erg aan dan? Je krijgt zo toch de variabelen die je wilt simpel en kort in je script?
Het is gewoon ranzig en je weet nooit precies welke variabele je gebruikt. Lees eens over een paar maanden deze code nogmaals door en je ziet wat ik bedoel ;)
Maar als je het wilt, ik hou je niet tegen hoor, ik hoop alleen dat ik nooit te maken krijg met zulke baggercode :) Daarnaast maakt het misbruik van variabelen op deze manier erg makkelijk fouten in de hand. Maar ga gerust je gang...

Acties:
  • 0 Henk 'm!

  • pierre-oord
  • Registratie: April 2002
  • Laatst online: 10-02 23:00
edit:
Alles was overbodig en al verteld in dit topic door anderen :)

[ Voor 94% gewijzigd door pierre-oord op 06-10-2004 10:39 ]


Acties:
  • 0 Henk 'm!

Verwijderd

X-Lars schreef op 05 oktober 2004 @ 18:03:
Ik zag iets met sessions staan net. Dat is echt niet nodig als je in de HTML gewoon dit doet (sorry voor de layoutvern**king), althans voor je form-verwerking:
PHP:
1
code...
Vaak wordt de foutmelding op de pagina getoond waar tevens het formulier op staat.

Echter, wil je met een nieuwe pagina werken om je fouten op te tonen dan is het zetten van sessies aardig noodzakelijk. Zeer zeker als je met meerdere stappen werkt en de gebruiker de mogelijkheid wilt geven om een aantal stappen terug te gaan.

[ Voor 14% gewijzigd door Verwijderd op 06-10-2004 12:45 ]


Acties:
  • 0 Henk 'm!

  • X-Lars
  • Registratie: Januari 2004
  • Niet online

X-Lars

Just GoT it.

Verwijderd schreef op 06 oktober 2004 @ 11:42:
[...]


Vaak wordt de foutmelding op de pagina getoond waar tevens het formulier op staat.

Echter, wil je met een nieuwe pagina werken om je fouten op te tonen dan is het zetten van sessies aardig noodzakelijk. Zeer zeker als je met meerdere stappen werkt en de gebruiker de mogelijkheid wilt geven om een aantal stappen terug te gaan.
Daar heb je natuurlijk wel gelijk in. Ik heb dat ook ooit eens gehad, maar toen opgelost met hidden fields. Sessions lijkt me wel handiger op het eerste gezicht.

Acties:
  • 0 Henk 'm!

  • Vae Victis
  • Registratie: April 2001
  • Laatst online: 07-09 06:15

Vae Victis

Dark Lord of the Sith

Verwijderd schreef op 06 oktober 2004 @ 09:54:
[...]


Wat is hier erg aan dan? Je krijgt zo toch de variabelen die je wilt simpel en kort in je script?
PHP:
1
2
3
4
5
6
7
8
9
<?
...
$admin = false ;
foreach ( $_POST as $index => $value )
{
    ${$index} = $value;
} 
...
?>

Je ziet daar toch hopelijk een leak inzitten?
$_POST en $_GET vars kun je met je client gewoon beinvloeden.

Acties:
  • 0 Henk 'm!

Verwijderd

Vae Victis schreef op 06 oktober 2004 @ 11:55:
[...]

PHP:
1
2
3
4
5
6
7
8
9
<?
...
$admin = false ;
foreach ( $_POST as $index => $value )
{
    ${$index} = $value;
} 
...
?>

Je ziet daar toch hopelijk een leak inzitten?
$_POST en $_GET vars kun je met je client gewoon beinvloeden.
Michali doet:
PHP:
1
2
3
4
5
6
$arr = array('var1' => 1, 'var2' => 2);

foreach ( $arr as $index => $value )
{
    ${$index} = $value;
}

Dit lijkt me gewoon een handige manier (dus een array die aangeeft welke variabelen je wel en welke je niet wilt). Wat jij doet == register_globals..

Hela nu bekijk ik het nog eens goed... Bedoelt hij hier $arr als $_POST? Dat zou idd smerig zijn.. Ik had eerder in gedachten:
PHP:
1
2
3
$arr = array ('var1', 'var2');
foreach ($arr as $val)
   $$val = $_REQUEST[$val];


oid.

[ Voor 6% gewijzigd door Verwijderd op 06-10-2004 13:49 . Reden: /me moet de syntax van foreach leren :X ]

Pagina: 1