[PHP] Update van foreach loop werkt niet goed

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Matthijs1982
  • Registratie: Augustus 2005
  • Laatst online: 02-06-2021
Ik gebruik onderstaande code om een winkelwagen te tonen. Dit werkt allemaal goed. Alleen wil ik in de winkelwagen de aantallen kunnen updaten.
Dit gaat niet goed. Alleen het aantal van het laatst toegevoegde product wordt aangepast als ik dit update.

Een print_r op de winkelwagen met 3 producten geeft het volgende:
Array ( [151] => Array ( [aantal] => 1 [variant] => 82 ) [355] => Array ( [aantal] => 1 [variant] => ) [205] => Array ( [aantal] => 2 [variant] => ) )

Array ( [151] => Array ( [aantal] => 1 [variant] => 82 ) [355] => Array ( [aantal] => 1 [variant] => ) [205] => Array ( [aantal] => 2 [variant] => ) )

Array ( [151] => Array ( [aantal] => 1 [variant] => 82 ) [355] => Array ( [aantal] => 1 [variant] => ) [205] => Array ( [aantal] => 2 [variant] => ) )

Ik heb al geprobeerd om de aantallen met unset eerst uit de sessie te verwijderen en daarna de aantallen in de sessie weer opnieuw te vullen met de geposte aantallen, maar dat had ook geen effect.

Ik gebruik onderstaande code:

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
$Productnummer=$_POST['Productnummer'];
$variant = $_POST["variant"];

if ($_POST['aantal'] == "" || $_POST['aantal'] == '0'){ 
$aantal = '1'; 
} 

else { 
$aantal = $_POST["aantal"]; 
} 

$_SESSION['winkelwagen'][$Productnummer]=array('aantal'=>$aantal, 'variant'=>$_POST['variant']);

foreach( $_SESSION['winkelwagen'] as $nummer => $info ){
    $Productnummer = $nummer;
    $aantal        = $info['aantal']; 
    $variant       = $info['variant'];

$bg = ($i++ % 2) ? "rij_tabel1" : "rij_tabel2"; 
echo "<tr class=\"".$bg."\" height=\"35\">
    <td><center><input type=\"text\" name=\"aantal\" value=\"".$aantal."\" size=\"5\" maxlength=\"5\"></center></td>
    <td>&nbsp; ".$merk."<input type=\"hidden\" name=\"Productnummer\" value=\"".$Productnummer."\"><br />&nbsp; <i>".$variantomschrijving."</i><input type=\"hidden\" name=\"variant\" value=\"".$variant."\"></td>
    <td width=\"100\">&nbsp; &euro; ".$verkoopprijs2."</td>
    <td width=\"100\">&nbsp; &euro; ".$subtotaal2."</td>
    <td class=\"verwijderknop\"><center><a href=\"http://www.test.nl/verwijderen/".$productnummer."\"><img src=\"http://www.test.nl/afbeeldingen/button_verwijderen.gif\" alt=\"".$merk." verwijderen\" border=\"0\" /></a></center></td>
  </tr>";

[ Voor 4% gewijzigd door Matthijs1982 op 16-09-2008 14:20 ]


Acties:
  • 0 Henk 'm!

  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
ff snel gekeken, maar moet:
code:
1
$_SESSION['winkelwagen'][$Productnummer] = ...


niet zijn:
code:
1
$_SESSION['winkelwagen'][$_POST["Productnummer"]]


?

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Heb je je code al eens gewoon lekker ouderwets gedebugged?
Debuggen: Hoe doe ik dat?

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Matthijs1982
  • Registratie: Augustus 2005
  • Laatst online: 02-06-2021
Die $_POST["Productnummer"] heb ik toegevoegd. Die stond er boven, maar die had ik per ongeluk niet mee gekopieerd.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Matthijs1982 schreef op dinsdag 16 september 2008 @ 14:21:
Die $_POST["Productnummer"] heb ik toegevoegd. Die stond er boven, maar die had ik per ongeluk niet mee gekopieerd.
En nu? Is het opgelost?

'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.


Acties:
  • 0 Henk 'm!

  • Matthijs1982
  • Registratie: Augustus 2005
  • Laatst online: 02-06-2021
@ NME: Nee, die had ik al in het script er boven staan, maar vergeten in GOT te posten.

Met error_reporting krijg ik de melding:
Notice: Undefined variable: Productnummer in /var/www/html/winkelwagen.php on line 122

Alleen in de array is deze overal gevuld. Via een formulier met hidden fields post de winkelwagen naar zichzelf. Alleen wordt de waarde aantal niet meegenomen. Deze verandert alleen bij het laatst toegevoegde product. Het lijkt erop dat alle waardes standaard 1 worden en dat alleen de laatste waarde onthouden wordt.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

...en welke regel is regel 122? Als je inderdaad, zoals Edwardvb al zegt, die regel aangepast hebt, dan kun je deze foutmelding niet op regel 12 van het stukje code dat je gepost hebt krijgen en zit de fout dus ergens anders.

Als je zo spaarzaam blijft met uitleg geven kunnen wij je niet helpen. Je bent daar ook al eerder op gewezen.

[ Voor 40% gewijzigd door NMe op 16-09-2008 15:09 ]

'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.


Acties:
  • 0 Henk 'm!

  • Matthijs1982
  • Registratie: Augustus 2005
  • Laatst online: 02-06-2021
De regel 122 is deze regel

PHP:
1
$_SESSION['winkelwagen'][$_POST["Productnummer"]]=array('aantal'=>$_POST["aantal"], 'variant'=>$_POST['variant']);


De variabele Productnummer wordt eerder nog niet gebruikt. Het zit dus in deze code. Als ik echter de waardes echo, wordt het productnummer voor alle producten goed getoond. Ook zijn alle producten goed te zien in het winkelmandje.

In het winkelmandje gebruik ik 3 waardes, namelijk de variabele productnummer, aantal en variant.
De variant is bijv. de kleur (zwart, wit of zilver) van het product.

Dit werkt allemaal goed, alleen de variabele aantal wordt niet goed opgepakt. Deze blijft steeds hetzelfde voor alle producten, behalve voor het laatst toegevoegde product.

Als ik error reporting(E_ALL) aanzet, krijg ik alleen de melding:
Notice: Undefined variable: Productnummer in /var/www/html/winkelwagen.php on line 122

Deze regel is dus de regel zoals ik die hierboven heb neergezet. Het lijkt alsof er in de foreach loop alleen de laatst toegevoegde variabele aantal wordt bijgewerkt.

Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

De code die in bovenstaande post staat kan niet de foutmelding opleveren die eronder staat.

Ga echo'en, ga print_r'en, ga debuggen!

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Acties:
  • 0 Henk 'm!

  • Noork
  • Registratie: Juni 2001
  • Niet online
Bestaat het productnummer sowieso? Doe eens een print_r($_POST);

En ik zou ook eens stoppen met het gebruiken van enkele en dubbele aanhalingstekens door elkaar. En consequent zijn in het gebruik van hoofdletters bij variabelen je gebruikt nl. Productnummer, met hoofdletter maar aantal met een kleine letter. Het wordt zo'n zooitje anders.

Acties:
  • 0 Henk 'm!

  • Matthijs1982
  • Registratie: Augustus 2005
  • Laatst online: 02-06-2021
een print_r op $_POST geeft:
Array ( [aantal] => 2 [Productnummer] => 490 [variant] => [winkelwagen_edit_x] => 58 [winkelwagen_edit_y] => 6 [winkelwagen_edit] => Winkelwagen_bijwerken )

Er wordt dus inderdaad alleen het laatste product gepost. Dit is dus het probleem.

Weet iemand hoe ik deze producten allemaal kan posten i.p.v. alleen het laatst toegevoegde product?
Ik zit hier al een hele tijd mee en kom er niet uit.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

CodeCaster schreef op dinsdag 16 september 2008 @ 15:29:
De code die in bovenstaande post staat kan niet de foutmelding opleveren die eronder staat.
^^ wat hij zegt. Die foutmelding komt niet overeen met je code.
Matthijs1982 schreef op dinsdag 16 september 2008 @ 15:46:
Er wordt dus inderdaad alleen het laatste product gepost. Dit is dus het probleem.
Dan klopt je formulier niet.

'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.


Acties:
  • 0 Henk 'm!

  • Matthijs1982
  • Registratie: Augustus 2005
  • Laatst online: 02-06-2021
OK, Bedankt.

Wat er fout is, is dat alle input velden aantal als name hebben.
Als ik deze aantal1, aantal2, aantal3 noem worden ze uniek en kan ik wel unieke waardes posten.

Ik ga ermee aan de slag.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Je constatering klopt maar je oplossing is fout. Geef ze voor de gein eens de naam aantal[] (of in jouw geval liever: aantal[<productnummer>]. ;)

'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.


Acties:
  • 0 Henk 'm!

  • Matthijs1982
  • Registratie: Augustus 2005
  • Laatst online: 02-06-2021
@NME: Als ik dat doe verschijnt er 'Array' in mijn input field aantal.

Dit is de print_r van $_POST, waarbij ik 1 product in de winkelwagen heb staan en het aantal 3 heb gegeven:
Array ( [aantal] => Array ( [360] => 3 [182] => 3 ) [Productnummer] => 182 [variant] => 13 [winkelwagen_edit_x] => 81 [winkelwagen_edit_y] => 5 [winkelwagen_edit] => Winkelwagen_bijwerken )

[ Voor 13% gewijzigd door Matthijs1982 op 16-09-2008 16:29 ]


Acties:
  • 0 Henk 'm!

  • Noork
  • Registratie: Juni 2001
  • Niet online
Komaan zeg. Dit is nu gewoon een zaak van je html formulier goed zetten en hierna de array goed uitlezen. Topics genoeg zou ik zeggen:

[PHP]checkboxes
[php] Probleem met checkbox waarden

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Het ís ook een array, wat had je anders verwacht? :)

Als je het iets intuïtiever wil zien, noem dan je input "producten[<productnummer>][aantal]". Je hebt dan een array waar per productnummer een aantal in zit. Als je al je andere inputs ook op die manier opstelt heb je één groot associatief array waar je mee kan werken. Je zal dan wel je code iets moeten aanpassen.

'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.


Acties:
  • 0 Henk 'm!

  • Matthijs1982
  • Registratie: Augustus 2005
  • Laatst online: 02-06-2021
OK, ik ga er mee aan de slag.
Bedankt voor jullie hulp!!
Pagina: 1