[PHP] Probleem met array en post

Pagina: 1
Acties:

  • squaddie
  • Registratie: Februari 2000
  • Nu online
Inleiding: Met PHP en een MySQL-database produceer ik een lijst met namen met een bijbehorende checkbox. De bezoekers van de pagina mogen uit die lijst 5 kiezen dmv de checkbox. Na het klikken van de submit-button wordt met een javascriptje gecontroleerd of het er ook 5 zijn, als het er geen 5 zijn komt er een waarschuwing en blijft de pagina staan. Als het er 5 zijn dan wordt dmv van een post de 5 waardes aan volgende.php gegeven die deze verwerkt.

De HTML-pagina (Gestript van niet terzake doende PHP & HTML code)
code:
1
2
3
4
5
6
7
<form method="post" action="volgende.php"
onsubmit="return checkbox_checker()" name="checkbox_form">
<input type="checkbox" value="1" name="optie">
<input type="checkbox" value="2" name="optie">
<input type="checkbox" value="3" name="optie">
<input type="submit" value="Submit">
</form>


Het javascript
code:
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
<script type="text/javascript">
  function checkbox_checker()
  {
    var checkbox_choices = 0;
    var max = 5;
    for (counter = 0; counter < checkbox_form.optie.length; counter++)
    {
      if (checkbox_form.optie[counter].checked)
         checkbox_choices++;
    }
    if (checkbox_choices > max )
    {
      msg="Je hebt " + checkbox_choices + " keuzes gemaakt.\n"
      msg=msg + "Verwijder " + (checkbox_choices-max) + " keuzes!"
      alert(msg)
      return (false);
    }
    else if (checkbox_choices < max )
    {
      alert("Maak " + max + " keuzes. \n Je hebt er " + checkbox_choices + " gemaakt.")
      return (false);
    }
    if (checkbox_choices == max )
      return (true);
  }
  </script>


Stukje uit volgende.php
code:
1
2
3
$keuze;
for($i=0; $i<sizeof($_POST['optie']); $i++)
  $keuze[$i] = $_POST['optie'][$i];


Probleem: Volgende.php ontvangt maar een (1) waarde, terwijl ik gelezen heb (ik dacht hier op GoT) dat als je meerdere objecten dezelfde naam geeft, dan wordt het beschouwt als een array en zou de hele array in een keer over moeten komen.

Nu heb ik wel een oplossing gevonden om meerdere waardes over te zenden, namelijk door achter optie [] te zetten, hiermee geef je aan dat het een array is en komt het ook zo over. Echter dan werkt het javascript niet meer en ondanks alle pogingen krijg ik dat script niet op een andere manier werkend.

Ik zou ook alle checkboxen van een unieke naam kunnen voorzien, maar het nadeel hiervan is dat in volgende.php alle namen moet afgaan of deze in de post zitten. En als de uiteindelijke lijst uit ruim 200 items bestaat, waarvan er maar 5 in de post zitten is dit geen efficiente operatie en in mijn opinie een lelijke vorm van programmeren.

Ook de variable declareren in volgende.php als array ($keuze[] = array();) geeft niet het gewenste resultaat.

Ik ben van mening dat de post niet goed gaat en dat ik (samen met jullie) daar als eerste moeten kijken voor een oplossing en als dat niet mogelijk is dan kijken of het script aangepast kan worden. Vandaar dat ik hem ook in dit gedeelte van het forum plaats.

For the record: GoT-search and Google are used...

There are never enough hours in a day, but always too many days before saturday.


  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 21:45
Als ik jouw was zou ik de checkboxes een nummertje meegeven, dan kun je er zowel in JS als PHP vrij makkelijk doorheenlopen. Dan bedoel ik dus '<input type="checkbox" name="name1" value="1" />' etc.

Wat je ook zou kunnen doen is de checkbox een id of een class geven. In hun naam behouden ze dan de array-notatie name="name[]", aleen vraag je dan de status op met getElementById of met GetElementsByClass OID. Weest creatief :)

[ Voor 19% gewijzigd door T-MOB op 05-11-2004 02:15 ]

Regeren is vooruitschuiven


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 19-05 21:24

NMe

Quia Ego Sic Dico.

Het PHP deel van je code is gewoon in orde. PHP kan er niets aan doen dat je één veldnaam gebruikt voor meerdere inputvelden. Logisch dat er dan maar één overgestuurd wordt. :)

De oplossing: als je nou eens in Javascript niet naar de checkboxes kijkt. :)

Ff uitleggen: je maakt gewoon een integer aan die me met 1 ophoogt wanneer je een checkbox aanvinkt, en met 1 verlaagt wanneer je er een uitvinkt. Op die manier hoef je onsubmit alleen maar die variabele te vergelijken met 5, en dan ben je klaar. Kun je verder gewoon option[] gebruiken als naam voor je checkboxes.

Overigens gaat mijn voorkeur uit naar de methode die je hier wil gebruiken, en het zal ongetwijfeld ook kunnen. Ik ben alleen niet zo'n Javascript genie. :)
T-MOB schreef op 05 november 2004 @ 02:14:
Als ik jouw was zou ik de checkboxes een nummertje meegeven, dan kun je er zowel in JS als PHP vrij makkelijk doorheenlopen. Dan bedoel ik dus '<input type="checkbox" name="name1" value="1" />' etc.
Ik ben het met TS eens dat dat ranzig is. Het kan gewoon met arrays, dus waarom niet?

[ Voor 22% gewijzigd door NMe op 05-11-2004 02:24 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 21:45
NMe84 schreef op 05 november 2004 @ 02:22:
Het PHP deel van je code is gewoon in orde. PHP kan er niets aan doen dat je één veldnaam gebruikt voor meerdere inputvelden. Logisch dat er dan maar één overgestuurd wordt. :)

De oplossing: als je nou eens in Javascript niet naar de checkboxes kijkt. :)

Ff uitleggen: je maakt gewoon een integer aan die me met 1 ophoogt wanneer je een checkbox aanvinkt, en met 1 verlaagt wanneer je er een uitvinkt. Op die manier hoef je onsubmit alleen maar die variabele te vergelijken met 5, en dan ben je klaar. Kun je verder gewoon option[] gebruiken als naam voor je checkboxes.

Overigens gaat mijn voorkeur uit naar de methode die je hier wil gebruiken, en het zal ongetwijfeld ook kunnen. Ik ben alleen niet zo'n Javascript genie. :)
[...]

Ik ben het met TS eens dat dat ranzig is. Het kan gewoon met arrays, dus waarom niet?
Ach ranzig... soms moeten dingen gewoon werken... ;)
Jouw oplossing is trouwens een stuk fijner dan die van mij. Als TS een functie gaat schrijven die dit zou doen zou hij kunnen kijken naar zoiets:
code:
1
2
3
4
5
6
7
8
9
10
11
12
<script type="text/javascript">
var counter = 0;

function check(checked)
{
 if (checked) { counter++ } else { counter--}
}
</script>

<form etc>
 <input type="checkbox" name="check[]" onclick="check(this.checked)">
</form>


Wanneer je submit hoef je dan alleen de waarde van 'counter' uit te lezen, wat neer komt op de oplossing van NME84...

[ Voor 20% gewijzigd door T-MOB op 05-11-2004 03:06 ]

Regeren is vooruitschuiven


  • UltimateB
  • Registratie: April 2003
  • Niet online

UltimateB

Pomdiedom

edit:

Niet dronken posten...

[ Voor 109% gewijzigd door UltimateB op 05-11-2004 04:47 ]

"True skill is when luck becomes a habit"
SWIS


Verwijderd

Volgens mij zouden zo alledrie de checkbox waardes binnen moeten komen:

code:
1
2
3
4
5
6
7
<form method="post" action="volgende.php"
onsubmit="return checkbox_checker()" name="checkbox_form">
<input type="checkbox" value="1" name="optie[]">
<input type="checkbox" value="2" name="optie[]">
<input type="checkbox" value="3" name="optie[]">
<input type="submit" value="Submit">
</form>


Edit: OK, maar dan werkt je Javascript niet meer. Sorry, over het hoofd gezien.
Tja, het is toch echt de enige manier om alle waardes in php te krijgen, zonder er verschillende namen aan te geven.

[ Voor 41% gewijzigd door Verwijderd op 05-11-2004 09:57 ]


  • _Sunnyboy_
  • Registratie: Januari 2003
  • Laatst online: 14-01 22:23

_Sunnyboy_

Mooooooooooooooooo!

Dit kan ook wel met de javascript werken hoor, maar dan moet je anders naar je opties verwijzen. Zo bijvoorbeeld:

code:
1
2
3
var opties  = checkbox_form.elements['optie[]'];

for (counter = 0; counter < opties.length; counter++)

[ Voor 15% gewijzigd door _Sunnyboy_ op 05-11-2004 12:06 ]

Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life


  • squaddie
  • Registratie: Februari 2000
  • Nu online
Ik heb het nu wel werkend met de oplossing van NMe84 en T-MOB, hiervoor uiteraard mijn dank.

@_Sunnyboy_ ikke ben geen javascript expert en als je dan al een paar uurtjes aan het knoeien bent, dan kijk je over dat soort dingetjes heen.

There are never enough hours in a day, but always too many days before saturday.


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 19:40

gorgi_19

Kruimeltjes zijn weer op :9

Meer Javascript dan PHP, gezien de laatste posts :) Vandaar een schopje naar Webdesign & Graphics :)

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Verwijderd

HTML:
1
<input name="optie[]" type="checkbox" />

JavaScript:
1
checkbox_form.elements['optie[]'].etcetera...
Pagina: 1