Form data opslaan in een array en printen
Ik doe momenteel een IT-opleiding en daar hoort helaas een stukje PHP bij. Totaal niet mijn ding, maar ik moet me er nog even zien doorheen te bijten. Met de meeste simpele opdrachten ben ik uren bezig en dat kan niet de bedoeling zijn, dus vandaar dat ik hier even vraag.
De opdracht is heel simpel. Ik moet een formuliertje maken waarin je een cijfer in kunt voeren. Dan heb je twee knopjes: een 'volgende'-knop en een 'klaar'-knop. Met de volgende-knop ga je naar een volgend invoerscherm en daar kun je weer een getal invoeren. Dit kun je in principe oneindig blijven doen. Met de klaar-knop print je alle getallen getallen die ingevoerd zijn van hoog naar laag.
Mijn idee was om met de volgende-knop het cijfer op te slaan in een array en de klaar-knop de array te laten printen, maar codetechnisch kan ik dat nog niet voor elkaar spelen. Ik staar me er dusdanig blind op dat ik ook niks meer kan verzinnen. Onderstaand is wat ik heb, ik probeer hier één ingevoerd cijfer te printen:
# opdracht3.10.php
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
<?php
session_start();
if (isset($_POST['submit'])) {
$_SESSION['cijfers'] = $_POST['cijfers'];
}
<form action="opdracht3.10b" method="post">
<input type="text" name="cijfers[]"/>
<input type="submit" name="submit" value="Klaar!" />
</form>
?>
session_start();
if (isset($_POST['submit'])) {
$_SESSION['cijfers'] = $_POST['cijfers'];
}
<form action="opdracht3.10b" method="post">
<input type="text" name="cijfers[]"/>
<input type="submit" name="submit" value="Klaar!" />
</form>
?>
# opdracht3.10b.php
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
<?php
session_start();
foreach(isset($_POST['cijfers']) as $value)
{
echo $value;
}
?>
session_start();
foreach(isset($_POST['cijfers']) as $value)
{
echo $value;
}
?>
Maar ik krijg de melding dat wat ik probeer te printen geen array is. Iemand die me een beetje op weg kan helpen?
Gewijzigd op 07/10/2014 17:34:52 door Matthijs Lenting
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
27
28
29
30
31
32
33
34
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
<?php
session_start();
// als er op volgende is gedrukt
if(isset($_POST['volgende'])){
// checken of er een cijfer is ingevuld, anders niet in sessie opslaan
// je wilt het cijfer opslaan in een array, in het element met index 'cijfers' dus er moet nog [] achter
if(ctype_digit($_POST['cijfer'])){
echo 'Het cijfer '.$_POST['cijfer'].' is toegevoegd';
$_SESSION['cijfers'][] = $_POST['cijfer'];
}
else{
// geen cijfer, dus ff melden
echo '<p>Dit is geen cijfer</p>';
}
}
// als er op 'klaar' is gedrukt
if(isset($_POST['klaar'])){
// de opgeslagen cijfers in de sessie weergeven
// wel even checken of de 'cijfers'-index in de sessie bestaat, of het een array is en of de array waarden bevat
if(array_key_exists('cijfers', $_SESSION) && is_array($_SESSION['cijfers']) && count($_SESSION['cijfers'])>0){
// array doorlopen en cijfers weergeven
foreach($_SESSION['cijfers'] as $cijf){
echo $cijf.'<br />';
}
}
else{
// er ware nog geen cijfers aanwezig in de sessie
echo '<p>(nog) geen cijfers ingevoerd';
}
// als er op klaar is gedrukt, ook de sessie variabele weer leegmaken zodat je weer opnieuw kunt beginnen met cijfers verzamelen
$_SESSION['cijfers'] = array();
}
?>
session_start();
// als er op volgende is gedrukt
if(isset($_POST['volgende'])){
// checken of er een cijfer is ingevuld, anders niet in sessie opslaan
// je wilt het cijfer opslaan in een array, in het element met index 'cijfers' dus er moet nog [] achter
if(ctype_digit($_POST['cijfer'])){
echo 'Het cijfer '.$_POST['cijfer'].' is toegevoegd';
$_SESSION['cijfers'][] = $_POST['cijfer'];
}
else{
// geen cijfer, dus ff melden
echo '<p>Dit is geen cijfer</p>';
}
}
// als er op 'klaar' is gedrukt
if(isset($_POST['klaar'])){
// de opgeslagen cijfers in de sessie weergeven
// wel even checken of de 'cijfers'-index in de sessie bestaat, of het een array is en of de array waarden bevat
if(array_key_exists('cijfers', $_SESSION) && is_array($_SESSION['cijfers']) && count($_SESSION['cijfers'])>0){
// array doorlopen en cijfers weergeven
foreach($_SESSION['cijfers'] as $cijf){
echo $cijf.'<br />';
}
}
else{
// er ware nog geen cijfers aanwezig in de sessie
echo '<p>(nog) geen cijfers ingevoerd';
}
// als er op klaar is gedrukt, ook de sessie variabele weer leegmaken zodat je weer opnieuw kunt beginnen met cijfers verzamelen
$_SESSION['cijfers'] = array();
}
?>
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
<form action="" method="post">
<!-- cijfers is geen array, maar een textveld waar je een cijfer invult, dus geen cijfers[] maar cijfer -->
<input type="text" name="cijfer"/>
<!-- De 'volgende' knop -->
<input type="submit" name="volgende" value="Volgende" />
<!-- klaar! -->
<input type="submit" name="klaar" value="Klaar!" />
</form>
<!-- cijfers is geen array, maar een textveld waar je een cijfer invult, dus geen cijfers[] maar cijfer -->
<input type="text" name="cijfer"/>
<!-- De 'volgende' knop -->
<input type="submit" name="volgende" value="Volgende" />
<!-- klaar! -->
<input type="submit" name="klaar" value="Klaar!" />
</form>
Ik hoop dat het met het commentaar erbij enigszins duidelijk wordt?
Code is niet getest, dus kan een fout geven
Edit:
inmiddels ook even getest en na verbetering van enkele typos moet het nu werken
Gewijzigd op 07/10/2014 20:22:35 door Frits Katoen
Een klein stukje snap ik nog niet helemaal. Waarom is het dit:
$_SESSION['cijfers'][] = $_POST['cijfer']
En niet dit:
$_SESSION['cijfers'] = $_POST['cijfer'][]
In mijn gedachtegang komt na de '=' juist hetgeen je wilt dat het is. Het is een beetje lastig uit te leggen wat ik bedoel, maar ik zat net bijvoorbeeld van alles te proberen met $_SESSION['cijfers'] = array(). Hier probeer ik dan aan te geven dat die sessie met cijfers een array moet zijn, terwijl in jouw code de array al gemaakt(?) wordt voordat er iets aan toegewezen is (want het komt voor de '='). Snap je ongeveer wat ik probeer te vragen?
$_SESSION is ook een array net als $_POST trouwens.
je kunt op twee manieren een element toevoegen aan een array.
De eerste is door de naam van het element op te geven:
$arr['1'] = 'iets';
$arr['2'] = 'nogiets';
$arr['naam'] = 'nogietsanders';
maar je kunt ook de de naam achterwege laten.
We krijgen dan een nummerieke array.
$arr[] = 'iets'; // wordt $arr[0]
$arr[] = 'nogiets'; // wordt $arr[1]
$arr[] = 'weeriets'; // wordt $arr[2]
etc.
In PHP kan ik een variabele definieren als array en daar later zonder problemen een int van maken/aan toewijzen.
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?php
$cijfers = array(); // hiermee geef je aan dat $cijfers een array is
// als je daarna bijvoorbeeld dit doet
$cijfers = 4;
// is $cijfers in één keer een int met waarde 4 ipv een leeg array
?>
$cijfers = array(); // hiermee geef je aan dat $cijfers een array is
// als je daarna bijvoorbeeld dit doet
$cijfers = 4;
// is $cijfers in één keer een int met waarde 4 ipv een leeg array
?>
Elke andere programmeertaal gaat over z'n nek als je bovenstaande uitvoert maar PHP heeft daar geen probleem mee.
$_SESSION is hierop een uitzondering (een zogenaamde predefined variable http://php.net/manual/en/reserved.variables.php)
Dit is een array en dien je ook als zodanig te behandelen. Wil je een variabele toewijzen aan $_SESSION zul je een index/key moeten gebruiken
Code (php)
1
2
3
4
5
2
3
4
5
<?php
$_SESSION = 4; // FOUT!
$_SESSION['cijfer'] = 4;
$_SESSION['username'] = 'Willem';
?>
$_SESSION = 4; // FOUT!
$_SESSION['cijfer'] = 4;
$_SESSION['username'] = 'Willem';
?>
Hierdoor kun je dus behoorlijk veel gegevens in je sessie bewaren.
Nu even weer terug naar de basics van arrays:
Een array definieer je met
Als je een item aan dit array wilt toevoegen kun je gebruik maken van de functie array_push(). Toevoegen van cijfers 4,5 en 6 doe je dan als volgt:
Hiermee voeg je elk cijfer toe aan het einde van het array.
Een verkorte versie van bovenstaande code is
Door de toevoeging van [] aan de variabele maak je er een array van (als het dat niet is) en voeg je het cijfer toe.
Op het moment dat je het formulier verstuurd bevat $_POST['cijfer'] het getal dat je ingevoerd hebt (niet $_POST['cijfer'][]).
Als je deze toewijst op de volgende manier
maak je van $_SESSION['cijfers'] een int met de waarde van $_POST['cijfer'].
Elke keer dat je in het formulier een cijfer invult en het formulier verstuurd wordt deze sessie-waarde dus overschreven met het nieuwe getal ipv dat het toegevoegd wordt!
Wat je wilt is dat $_SESSION['cijfers'] een array is waar het cijfer elke keer aan toegevoegd wordt. Dit regel je dus door die [] toe te voegen
Edit:
Misschien is het handig dat je de inhoud van je $_SESSION ook even weergeeft op het scherm, dan heb je enig idee hoe de gegevens opgeslagen worden. Dit kun je bijvoorbeeld doen door onderaan het php gedeelte (dus boven je form) de volgende code toe te voegen:
Misschien is het handig dat je de inhoud van je $_SESSION ook even weergeeft op het scherm, dan heb je enig idee hoe de gegevens opgeslagen worden. Dit kun je bijvoorbeeld doen door onderaan het php gedeelte (dus boven je form) de volgende code toe te voegen:
Gewijzigd op 07/10/2014 22:37:23 door Frits Katoen