[PHP] Omgaan met formulierarrays

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Dark Wanderer
  • Registratie: September 2003
  • Laatst online: 11-08-2024
Ik heb een probleem waar ik maar niet uit kom.

Het is als volgt. Ik heb een pagina met een database erachter (mssql), en daarop staat een agenda. Ik wil nu alleen een pagina maken, waarmee ik een formulier render waarop alle afspraken staan, met daarop de titel, en de contactpersoon. Dit is al gelukt, ik krijg mijn formulier netjes op mijn scherm (de naam van het veld titel is dus name="titel[]").

Alleen na het submitten, weet ik niet hoe ik met de data om moet gaan. Ik heb in het formulier de id mee laten nemen als hidden veld zodat de computer een aanknopingspunt heeft met welke afspraak hij bezig is.

Ik heb nu deze code na het submitten:
code:
1
2
3
4
5
6
foreach ($_POST as $key => $value) {
 echo $key; echo $value;
}

Maar dit geeft een uitkomst die er zo uitziet:
goGO!titelArraycontactpersoonArray


go is de submitknop, en andere zijn dus arrays, maar hoe spreek ik al deze arrays aan in dezelfde lus (dus dat ik de mssql database kan updaten met èèn lus)?

hand·te·ke·ning (de ~ (v.))


Acties:
  • 0 Henk 'm!

  • WalterTamboer
  • Registratie: December 2003
  • Laatst online: 13-01-2017
PHP:
1
2
foreach ( $_POST[ 'title' ] as $key => $value )
    echo $key . ' - ' . $value . '<br />';


PHP:
1
print_r( $_POST );


of

PHP:
1
var_dump( $_POST );


helpt ook om dit soort dingen uit te zoeken ;)

[ Voor 21% gewijzigd door WalterTamboer op 26-09-2005 11:11 ]


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Value is dan een Array. Die spreek je net zo aan zoals je de Post ook aanspreekt. Gewoon een foreach lus binnen je foreach lus.

Handiger is trouwens om ipv titel[] titel[id] te gebruiken. De key is dan niet nikszeggend, maar de bijbehorende id.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • Dark Wanderer
  • Registratie: September 2003
  • Laatst online: 11-08-2024
Ok, ik ben nu iets wijzer geworden, maar ik heb nog steeds niet de oplossing.

Ik weet dat het niet de manier is hier op GOT, maar als iemand snel een stukje voorbeeldcode kan geven, ben ik er erg mee geholpen. Ik wil dus de velden titel en contactpersoon updates van alle punten in de agenda, en deze komen uit de arrays titel[] en contactpersoon[] welke gepost zijn (die dus weer ik de array $_POST[]. Hoe flikker ik dit in een mssql db? Ik heb echt geen idee

Help me, plz

GRTN Marco

hand·te·ke·ning (de ~ (v.))


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

D'r zit wel een hele grote stap tussen 'het niet uit kunnen lezen van arrays' en 'het compleet invoeren in een mssql database'

Wat lukt je precies niet? Het is hier inderdaad niet de bedoeling dat hier complete stukken code voor je gepost worden. Zodra dit topic daarheen gaat gaat hij op slot.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • Dark Wanderer
  • Registratie: September 2003
  • Laatst online: 11-08-2024
Het is denk ik meer de achterliggende gedachte die ik niet snap. Nog een keer op opzet:

Je hebt als het ware een tabel van 3 bij een x aantal
[id hidden] [titel] [contactpersoon]
en zo dus een x aantal hiervan
ik heb dus dan de arrays $_POST['id'][], $_POST['titel'][] en $_POST['contactpersoon'][] lijkt me, en deze moeten allemaal geupdate worden in de database. Het is zeker dat iedere array een gelijke aantal waarden in zich heeft. Dus kan ik het dan niet zo oplossen?


code:
1
2
3
4
5
6
7
8
9
10
$teller=0;
while($_POST['id']){
    mssql_qeury
    ("UPDATE agenda SET
    titel='{$_POST['titel'][$teller]}', 
    contactpersoon='{$_POST['contactpersoon'][$teller]}' 
    WHERE id='{$_POST['id'][$teller]}'
    ");
    $teller++;
}


Of is dit niet mogelijk?

[ Voor 10% gewijzigd door Dark Wanderer op 26-09-2005 11:46 ]

hand·te·ke·ning (de ~ (v.))


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Heb je dat al geprobeert? Desnoods door de query af te drukken ipv uit te voeren?

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • Dark Wanderer
  • Registratie: September 2003
  • Laatst online: 11-08-2024
Janoz schreef op maandag 26 september 2005 @ 11:59:
Heb je dat al geprobeert? Desnoods door de query af te drukken ipv uit te voeren?
Het wil wel, maar ik krijg een infinite loop. Weet iemand hoe je een while lus door laat gaan zolang er waarden in een array zitten?

hand·te·ke·ning (de ~ (v.))


Acties:
  • 0 Henk 'm!

Verwijderd

In de code die je in je openingspost gezet had, doe je dat al.
Met "foreach" dus.

Acties:
  • 0 Henk 'm!

  • Dark Wanderer
  • Registratie: September 2003
  • Laatst online: 11-08-2024
Verwijderd schreef op maandag 26 september 2005 @ 12:13:
In de code die je in je openingspost gezet had, doe je dat al.
Met "foreach" dus.
Nee dus, dat kan misschien ook wel, maar ik ben er inmiddels zelf ook al uit, en ik heb het zo gedaan, en dat werkt voor mij perfect. Op de plaats van de echo gooi ik dan de update query.

code:
1
2
3
4
5
6
$teller=0;
$aantalwaarden=count($_POST['datum']);
while($teller <= $aantalwaarden){
   echo $_POST['datum'][$teller]; echo'<br>';
   $teller++;
}


Iedereen bedankt voor de hulp!

hand·te·ke·ning (de ~ (v.))


Acties:
  • 0 Henk 'm!

  • Cavorka
  • Registratie: April 2003
  • Laatst online: 27-03-2018

Cavorka

Internet Entrepreneur

Omdat je loopt over de verkeerde array... daarom krijg je die Array meldingen vanuit php terug, omdat je dus (in de code in je eerste post) effectief print $_POST['datum'] doet en dat is een array of zichzelf.

Je zou dus dit moeten doen:
PHP:
1
2
3
4
5
6
foreach($_POST['datum'] AS $index => $value) {
   print $_POST['datum'][$index] . "<br />" ;
   print $_POST['titel'][$index] . "<br />" ;
   print $_POST['contactpersoon'][$index] . "<br />" ;
   (..etc..)
}

[ Voor 57% gewijzigd door Cavorka op 26-09-2005 12:29 ]

the-blueprints.com - The largest free blueprint collection on the internet: 50000+ drawings.


Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Dan zou ik het wel zo doen:
PHP:
1
2
3
4
5
6
7
$indices = array_keys($_POST['datum']);
foreach( $indices AS $index ) {
   print $_POST['datum'][$index] . "<br />" ;
   print $_POST['titel'][$index] . "<br />" ;
   print $_POST['contactpersoon'][$index] . "<br />" ;
   (..etc..) 
}

Anders zit je met een ongebruikte variable $value. Kun je natuurlijk wel gebruiken, maar dan vind ik het zo toch netter. Iets consequenter per regel.

edit:
ff indexes gefixed :>

[ Voor 34% gewijzigd door Michali op 26-09-2005 17:33 ]

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

indices ;)
(hoewel het beide toegestaan is, wordt het woord index in deze context louter vervormd naar indices)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Wat bedoel je met "consequenter per regel"?

Ikzelf zou niet voor die oplossing kiezen. Daarnaast heeft de TS de $value wel binnen de lus nodig (Hij wordt immers uiteindelijk voor het updaten van records gebruikt, en niet voor simpel afdrukken).

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Ik bedoel dat $value in princiepe exact dezelfde waarde heeft als $_POST['datum'][$index]. Stel dat je dit gedaan zou hebben:
PHP:
1
2
3
4
5
6
foreach( $_POST['datum'] AS $index => $value ) {
   print $value . "<br />" ;
   print $_POST['titel'][$index] . "<br />" ;
   print $_POST['contactpersoon'][$index] . "<br />" ;
   (..etc..) 
}

Dan wijkt de eeste regel af van de rest. Vandaar dat dit minder consequent is. Als je deze vorm beter vindt, dan zou ik $_POST['datum'][$index] niet direct meer gebruiken, anders is $value overbodig en zou ik toch voor mijn versie gaan. Gebruik van zowel $value als $_POST['datum'][$index] is nog slechter imo.

Waarom zou je verder dan niet voor die oplossing kiezen? Het is imo ook nog eens iets informatiever. Je geeft er duidelijk mee aan dat je indexes gebruikt die op een bepaalde set input arrays slaat en niet enkel op die van $_POST['datum']. Dat is ook een van de redenen waarom ik er wel voor zou kiezen.

[ Voor 28% gewijzigd door Michali op 26-09-2005 17:41 ]

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ik zou je array eerst ordenen naar een wat handiger formaat, door de gegevens bij elkaar te stoppen (dus ipv $arr['datum'][0] en $arr['title'][0] gebruik je $arr[0]['datum'] en $arr[0]['title'], zodat je een foreach lus kunt gebruiken)

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function CreateEntry($datum, $titel, $persoon)
{
   return array
   (
      'datum' => $datum,
      'titel' => $titel,
      'contactpersoon' => $persoon
   );
}

$entries = array_map("CreateEntry", $_POST['datum'], $_POST['titel'], $_POST['contactpersoon']);
print_r($entries);

foreach($entries as $entry)
    echo "op " . $entry['datum'] .  " is " . $entry['titel'] . " aangemaakt door " . $entry['contactpersoon'] . "\n";

[ Voor 4% gewijzigd door .oisyn op 26-09-2005 18:31 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Dark Wanderer
  • Registratie: September 2003
  • Laatst online: 11-08-2024
Ik ben er inmiddels achtergekomen dat je met [] een hoop gekloot hebt. Ik heb maar de id nummer van elk record gebruikt, nu werkt het wel perfect. Het is zo kut gegaan omdat ik nog helemala n00b was op het gebied van formulieren met arrays, en weet nu wel hoe het moet!


Iedereen bedankt!
:) :) :) :) :)

hand·te·ke·ning (de ~ (v.))


Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
.oisyn schreef op maandag 26 september 2005 @ 18:30:
Ik zou je array eerst ordenen naar een wat handiger formaat, door de gegevens bij elkaar te stoppen (dus ipv $arr['datum'][0] en $arr['title'][0] gebruik je $arr[0]['datum'] en $arr[0]['title'], zodat je een foreach lus kunt gebruiken)

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function CreateEntry($datum, $titel, $persoon)
{
   return array
   (
      'datum' => $datum,
      'titel' => $titel,
      'contactpersoon' => $persoon
   );
}

$entries = array_map("CreateEntry", $_POST['datum'], $_POST['titel'], $_POST['contactpersoon']);
print_r($entries);

foreach($entries as $entry)
    echo "op " . $entry['datum'] .  " is " . $entry['titel'] . " aangemaakt door " . $entry['contactpersoon'] . "\n";
Dat is idd nog een stuk netter. array_map heb ik zelf nog nooit gebruikt, wel leuk om er een voorbeeld van te zien.

Noushka's Magnificent Dream | Unity

Pagina: 1