[php] nieuw item in sessie-array vervangt het vorige

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Thomzh
  • Registratie: Oktober 2007
  • Laatst online: 17-11-2024
Hoi,

Ondanks het snelle sluiten van mijn vorige topic probeer ik het opnieuw met een ander vraagje. Ik loop tegen een php-probleempje aan. Googlen leverde niks op. Ik heb een testcase gemaakt, te vinden op klik :) .

De vraag,

Ik wil een phpsessie gebruiken. Daarin moet $_POST informatie komen. Nu is het de bedoeling dat de eerste keer dat het formulier verzonden wordt deze opgeslagen wordt onder $_SESSION[1], de volgende keer onder $_SESSION[2], etc.

Nu gebeurt het volgende: $_SESSION[2] wordt wel gemaakt, maar dan verdwijnt $_SESSION[1].

Hieronder mijn phpcode, wat doe ik verkeerd?

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
<? //testcase
if(!isset($_SESSION)) {
    session_start();
}
$_SESSION[$_POST['nummer']] = $_POST;

$print = '<pre>';
$print .= print_r($_SESSION, true);
$print .= '<hr />';
$print .= print_r($_POST, true);
$print .= '</pre>';



if(!isset($_POST['nummer'])) {
    $_POST['nummer'] = 1;
} else {
    $_POST['nummer']++;
}

?>
<html>
    <body>
        <form method="post" action="testcase.php">
            <input type="text" readonly="readonly" name="nummer" value="<?= $_POST['nummer'] ?>" />
            <input type="text" name="Tekst" />
            <input type="submit" />
        </form>
        <?= $print ?>
    </body>
</html>

Acties:
  • 0 Henk 'm!

  • _eXistenZ_
  • Registratie: Februari 2004
  • Laatst online: 23:46
code:
1
$_SESSION[$_POST['nummer']] = $_POST;
Dat maakt een array van bijv nummer 1, dit is denk ik sowieso ongewenst gedrag.

Je moet gewoon
code:
1
$_SESSION[] = $_POST
doen, dit is wel een erg basic vraag...

[ Voor 26% gewijzigd door _eXistenZ_ op 17-05-2010 19:48 ]

There is no replacement for displacement!


Acties:
  • 0 Henk 'm!

  • Thomzh
  • Registratie: Oktober 2007
  • Laatst online: 17-11-2024
Nee, dat is wel de bedoeling. Achter elk nummer moet een array komen.
edit1:
Dat heb ik geprobeerd, hielp niet.
edit2:
zie testcase, het is nu met $_SESSION[] =

[ Voor 42% gewijzigd door Thomzh op 17-05-2010 19:51 ]


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Het probleem is dat je session_start niet altijd aanroept. Kijk daarvoor eens in de documentatie: http://php.net/manual/en/function.session-start.php

“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.”


Acties:
  • 0 Henk 'm!

  • Manuel
  • Registratie: Maart 2008
  • Laatst online: 11-09 06:33
Verwijder de:
PHP:
1
if(!isset($_SESSION)) {
en plaatst session_start() gewoon bovenaan de pagina, zoals @Woy ook reeds zegt.

Acties:
  • 0 Henk 'm!

  • Thomzh
  • Registratie: Oktober 2007
  • Laatst online: 17-11-2024
Beide tips ben ik ook op internet tegen gekomen, en ze werkten niet. Ik heb ze nu wel toegepast in het php bestand. Dus hieronder even een update.

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
<? //testcase
session_start();

$_SESSION[] = $_POST;
$print = '<pre>';
$print .= print_r($_SESSION, true);
$print .= '<hr />';
$print .= print_r($_POST, true);
$print .= '</pre>';



if(!isset($_POST['nummer'])) {
    $_POST['nummer'] = 1;
} else {
    $_POST['nummer']++;
}

?>
<html>
    <body>
        <form method="post" action="testcase.php">
            <input type="text" readonly="readonly" name="nummer" value="<?= $_POST['nummer'] ?>" />
            <input type="text" name="Tekst" />
            <input type="submit" />
        </form>
        <?= $print ?>
    </body>
</html>

Acties:
  • 0 Henk 'm!

  • Manuel
  • Registratie: Maart 2008
  • Laatst online: 11-09 06:33
Dan doen we het toch even op een andere manier?
$_SESSION["form"][] = $_POST;

Verder lijkt me dit niet de manier om je testcases te posten, het werkt namelijk best frustrerend om steeds te wachten totdat je het bestand hebt geüpdatet. Verder zou ik graag willen weten waarom je de hele tijd alle formulieren wilt opslaan in een sessie, wat heeft dat voor meerwaarde?

PS: Verwijder die shorttags. (hopelijk wordt het binnenkort uit toch nog deprecated)

Ondertussen ook eens even op mijn servertje geprobeerd en daar krijg ik gewoon de gewenste output met wat ik voorstel (Debian Lenny en PHP 5.3.2):
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
<?php //testcase
session_start();

$_SESSION['form'][] = $_POST;
$print = '<pre>';
$print .= print_r($_SESSION, true);
$print .= '<hr />';
$print .= print_r($_POST, true);
$print .= '</pre>';



if(!isset($_POST['nummer'])) {
    $_POST['nummer'] = 1;
} else {
    $_POST['nummer']++;
}

?>
<html>
    <body>
        <form method="post" action="test.php">
            <input type="text" readonly="readonly" name="nummer" value="<?php echo $_POST['nummer'] ?>" />
            <input type="text" name="Tekst" />
            <input type="submit" />
        </form>
        <?php echo $print ?>
    </body>
</html>


Output:
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
(
    [form] => Array
        (
            [0] => Array
                (
                    [nummer] => 1
                    [Tekst] => test
                )

            [1] => Array
                (
                    [nummer] => 2
                    [Tekst] => Nummero 2
                )

            [2] => Array
                (
                    [nummer] => 3
                    [Tekst] => Werkt nu wel?
                )

        )

)

[ Voor 129% gewijzigd door Manuel op 17-05-2010 20:24 . Reden: added ]


Acties:
  • 0 Henk 'm!

  • SvMp
  • Registratie: September 2000
  • Niet online
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
<? //testcase
session_start();

i f (isset($_POST['nummer'])) {
   $i=intval($_POST['nummer'])+1;
} else {
   $i=1;    
}


$_SESSION[$i] = $_POST;
$print = '<pre>';
$print .= print_r($_SESSION, true);
$print .= '<hr />';
$print .= print_r($_POST, true);
$print .= '</pre>';


?>
<html>
    <body>
        <form method="post" action="testcase.php">
            <input type="text" readonly="readonly" name="nummer" value="<?= $i ?>" />
            <input type="text" name="Tekst" />
            <input type="submit" />
        </form>
        <?= $print ?>
    </body>
</html>


Wellicht geeft bovenstaande werkwijze beter resultaat. Ik heb de shorttags maar even gelaten voor wat ze zijn maar die moeten er idd uit.

Acties:
  • 0 Henk 'm!

  • Thomzh
  • Registratie: Oktober 2007
  • Laatst online: 17-11-2024
De oplossing van Manuel werkt uitstekend. Hartelijk dank.

Ter interesse: waarom geen shorttags?

Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

_eXistenZ_ schreef op maandag 17 mei 2010 @ 19:45:
Je moet gewoon
code:
1
$_SESSION[] = $_POST
doen, dit is wel een erg basic vraag...
Lijkt me handig, iets in je sessievariabelen stoppen maar vervolgens niet weten met welke index je het aan kan spreken. ;)

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

  • Gamebuster
  • Registratie: Juli 2007
  • Laatst online: 01-08 10:05
PS: Verwijder die shorttags. (hopelijk wordt het binnenkort uit toch nog deprecated)
offtopic:
Ik vind die shorttags erg handig. Ze moeten ze standaard maken ipv deprecated.

code:
1
2
<?=html($string)?>
<?php echo html($string); ?>

offtopic:
Vind ik de 1e toch beter.
NMe schreef op maandag 17 mei 2010 @ 20:57:
[...]

Lijkt me handig, iets in je sessievariabelen stoppen maar vervolgens niet weten met welke index je het aan kan spreken. ;)
PHP:
1
2
3
4
5
6
<?php
$_SESSION[] = $_POST
$index = count($_SESSION)-1;
$laatstePostData = $_SESSION[$index];
// $_POST == $_SESSION[$index]
?>


Overigens moet je dan geen named keys aanmaken; dan zal je een methode moeten maken die alleen numerieke keys telt.
Thomzh schreef op maandag 17 mei 2010 @ 20:52:
De oplossing van Manuel werkt uitstekend. Hartelijk dank.

Ter interesse: waarom geen shorttags?
Shorttags staat niet op alle servers ingeschakeld, maar zover ik weet: de meeste wel. Bovendien kan je het in php.ini aanzetten.

Overigens, je kan hiermee alle shorttags vervangen door normale:
code:
1
2
3
4
5
$filename = 'bestandje.php';

$contents = file_get_contents($filename)'
$contents = str_replace($contents, '<?=','<?php echo ');
file_put_contents($filename, $contents);


Wel backups maken voordat je dit over je scripts gooit; dit scriptje werkt niet 100% van de gevallen en vervangt alleen "<?=" en niet "<?"

[ Voor 78% gewijzigd door Gamebuster op 17-05-2010 21:06 ]

Let op: Mijn post bevat meningen, aannames of onwaarheden


Acties:
  • 0 Henk 'm!

  • Manuel
  • Registratie: Maart 2008
  • Laatst online: 11-09 06:33
Gamebuster schreef op maandag 17 mei 2010 @ 20:57:
[...]

offtopic:
Ik vind die shorttags erg handig. Ze moeten ze standaard maken ipv deprecated.
Daar ben ik het dus niet mee eens, ik vind het een pain-in-the-arse om eerlijk te zijn. Als ik mijn server opnieuw installeer en dan ga ik de standaard pakketten voor mijn webserver compilen dan zit ik standaard al met de short_tags op Off. Wat nou als me source dan in èèn keer publiek wordt omdat ik het als nog in de public_html heb gezet, dan zou ik in feite zo kunnen worden ontslagen omdat ik voorheen lui was.

Hoeveel moeite is het nou werkelijk om <?php te gebruiken in plaats van <?, dat lijkt me toch echt geen verschil hebben. Verder gebruik ik in feite maar een keer in een bestand een opening-tag voor mijn PHP bestand en vanaf daar regel ik de rest. (Dat is dus een van de voordelen van de presentatie van de logica scheiden. :))

Een quote van dit artikel:
"As noted by Rune Kaagaard and Philip Olson in the comments, support for short tags is still a subject of discussion. Whether it will be turned off by default or supported in PHP 6 also depends on the package maintainers of each distribution (looks like Ubuntu is going for the strict approach)."

Acties:
  • 0 Henk 'm!

  • Gamebuster
  • Registratie: Juli 2007
  • Laatst online: 01-08 10:05
Manuel schreef op maandag 17 mei 2010 @ 21:47:
[...]

Daar ben ik het dus niet mee eens, ik vind het een pain-in-the-arse om eerlijk te zijn. Als ik mijn server opnieuw installeer en dan ga ik de standaard pakketten voor mijn webserver compilen dan zit ik standaard al met de short_tags op Off. Wat nou als me source dan in èèn keer publiek wordt omdat ik het als nog in de public_html heb gezet, dan zou ik in feite zo kunnen worden ontslagen omdat ik voorheen lui was.

Hoeveel moeite is het nou werkelijk om <?php te gebruiken in plaats van <?, dat lijkt me toch echt geen verschil hebben. Verder gebruik ik in feite maar een keer in een bestand een opening-tag voor mijn PHP bestand en vanaf daar regel ik de rest. (Dat is dus een van de voordelen van de presentatie van de logica scheiden. :))

Een quote van dit artikel:
"As noted by Rune Kaagaard and Philip Olson in the comments, support for short tags is still a subject of discussion. Whether it will be turned off by default or supported in PHP 6 also depends on the package maintainers of each distribution (looks like Ubuntu is going for the strict approach)."
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
<?php if($web->getLocalUser() instanceof AnonymousUser) { ?>
<div class="sidebar-section">
<form action="<?=html($_QUERY)?>" method="post">

    <div class="field">
        <label for="loginNickname"><?=html(LabelNickname)?></label>
        <input type="text" id="loginNickname" name="nickname"/>
    </div>

    <div class="field">
        <label for="loginPassword"><?=html(LabelPassword)?></label>
        <input type="password" id="loginPassword" name="password"/>
    </div>

    <div class="field">
        <input type="checkbox" id="loginRemember" name="cookie"
               value="true"/>
        <label for="loginRemember"><?=html(LabelRememberLogin)?></label>
    </div>

    <div class="field">
        <button type="submit"><?=html(LabelDoLogin)?></button>
    </div>

</form>
</div>
<?php } ?>


Je kan geen <?php= gebruiken: daar gaat het mij om.

[ Voor 4% gewijzigd door Gamebuster op 17-05-2010 22:19 ]

Let op: Mijn post bevat meningen, aannames of onwaarheden


Acties:
  • 0 Henk 'm!

  • Manuel
  • Registratie: Maart 2008
  • Laatst online: 11-09 06:33
Dat heb je toch helemaal niet nodig indien je alles van elkaar scheidt? Neem even Smarty als voorbeeld, je doet {$var} en dan maakt die er intern dit van: <?php echo $var; ?>. (Inline-html gecombineerd met PHP is voor mij altijd een no-go)

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Print je SessionID dan eens op je test pagina. Ik heb het idee dat je toch elke keer een nieuwe session start. Want hij zal de waarde echt niet overschrijven als je een andere key gebruikt.

“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.”

Pagina: 1