[PHP] Waarde van object property aanpassen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
Ik ben bezig met een script waarmee gebruikers eenvoudig HTML formulieren kunnen maken, en ook kunnen aangeven welke items verplicht (mandatory) zijn. De items van elk form worden opgeslagen in een MySQL database. De code hieronder is onderdeel van deze functionaliteit:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
  $result = db_query('SELECT * FROM {form_items} WHERE fid = %d', $fid);
  while ($item = db_fetch_object($result)) {
    $items[] = $item;
  }
 
  if ($_POST['action'] == 'Verzenden') {
    $edit = $_POST['edit'];
    foreach ($items as $item) {
      $item->value = $edit['submitted'][$item->name];
      if (empty($edit['submitted'][$item->name]) && $item->mandatory) {
        form_set_error($item->name, "'$item->name' is een verplicht veld");
      }
    }
  }
  
  print_r($items);

Achtereenvolgens haal ik de items van form met id $fid op uit de database en stop deze objecten in een array $items. Vervolgens haal ik alle items door een loop en controleer ik of verplichte items wellicht niet zijn ingevuld (de betreffende variabele in $edit is dan leeg). Als het item wel ingevuld is, ken ik in regel 9 de gesubmitte waarde toe aan $item->value.

Als ik het form volledig invul, zou een print_r($items) dus een array met objecten moeten opleveren waar de property "value" een waarde heeft. Echter, "value" is altijd leeg. Als ik print_r($item) toevoeg onderaan de foreach loop (dus tussen regel 12 en 13), heeft elk object wel een waarde voor "value", bijvoorbeeld:
code:
1
2
3
4
5
6
7
8
9
10
11
stdClass Object (
    [fid] => 17
    [cid] => 6
    [name] => Naam
    [description] => Vul uw voor en achternaam in
    [value] => Marieke
    [type] => textfield
    [options] => 
    [multiple] => 0
    [mandatory] => 1
)

Echter, bij de print_r in regel 16 is value weer gewoon leeg:
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
Array (
    [0] => stdClass Object (
            [fid] => 17
            [cid] => 6
            [name] => Naam
            [description] => Vul uw voor en achternaam in
            [value] => 
            [type] => textfield
            [options] => 
            [multiple] => 0
            [mandatory] => 1
        )
    [1] => stdClass Object (
            [fid] => 17
            [cid] => 9
            [name] => Uw vraag
            [description] => Eventueel extra contactinformatie
            [value] => 
            [type] => textarea
            [options] => 
            [multiple] => 0
            [mandatory] => 1
        )

        // etc...

Ik heb geen idee hoe dit kan. Wellicht is het niet echt netjes om objecten in een array te stoppen, maar toch wil ik het graag op deze manier. Immers, later in mijn code heb ik een functie die (nu althans) alleen objecten als input accepteert. Wie kan mij vertellen waarom de waarde van elke "value" weer uit het object verdwijnt?

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


Acties:
  • 0 Henk 'm!

  • yiko
  • Registratie: September 2003
  • Laatst online: 20-04 20:19
Door $item->value aan te passen, pas je niet de value aan van een item uit je $items array, maar wel de value van een kopie hiervan.
Als je werkt met PHP5 kan je de foreach aanpassen om te werken met een reference
PHP:
1
2
3
foreach ($items as & $item) {
// ...
}

En anders moet je de juiste item uit je array gaan aanpassen:
PHP:
1
2
3
foreach ($items as $index => $item) {
      $items[$index]->value = $edit['submitted'][$item->name];
}

Acties:
  • 0 Henk 'm!

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
Beide oplossingen werken perfect, dank je! :)

[ Voor 4% gewijzigd door Reveller op 22-05-2006 19:46 ]

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."