Form data opslaan in een array en printen

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Matthijs Lenting

Matthijs Lenting

07/10/2014 17:34:21
Quote Anchor link
Hallo,

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)
PHP script in nieuw venster Selecteer het PHP script
1
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>
?>



# opdracht3.10b.php
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
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
 
PHP hulp

PHP hulp

24/11/2024 16:24:58
 
Frits Katoen

Frits Katoen

07/10/2014 20:07:01
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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();
}

?>

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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>


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
 
Matthijs Lenting

Matthijs Lenting

07/10/2014 21:16:45
Quote Anchor link
Hartstikke bedankt, Frits! Je helpt me echt enorm. Als ik het zo bekijk zie ik ook pas hoe simpel het eigenlijk kan zijn. Ik zat al na te denken hoe ik twee knopjes elk iets kon laten doen als erop geklikt werd en het kan zo simpel met isset(), maar het is totaal niet tot me doorgedrongen.

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?
 
Frank Nietbelangrijk

Frank Nietbelangrijk

07/10/2014 22:23:30
Quote Anchor link
Hoi Matthijs,

$_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.
 
Frits Katoen

Frits Katoen

07/10/2014 22:26:19
Quote Anchor link
PHP is wat betreft heel flexibel en daardoor soms ook heel verwarrend.

In PHP kan ik een variabele definieren als array en daar later zonder problemen een int van maken/aan toewijzen.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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
?>

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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
$_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
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$cijfers
= array();
?>

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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
array_push($cijfers, 4);
array_push($cijfers, 5);
array_push($cijfers, 6);
?>

Hiermee voeg je elk cijfer toe aan het einde van het array.
Een verkorte versie van bovenstaande code is
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
$cijfers
[] = 4;
$cijfers[] = 5;
$cijfers[] = 6;
?>

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
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$_SESSION
['cijfers'] = $_POST['cijfer'];
?>

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
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$_SESSION
['cijfers'][] = $_POST['cijfer'];
?>


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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
echo '<pre>'.print_r($_SESSION, true).'</pre>';
?>

Gewijzigd op 07/10/2014 22:37:23 door Frits Katoen
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.