php session werkt niet correct op 2e pagina
Ik heb 2 pagina's waarbij een waarde die op de ene wordt berekend weergegeven moet worden op de andere pagina.
Als ik het test met een vaste waarde dan werkt het prima.
pagina 1:
pagina 2:
Nu probeer ik het met het onderstaande te doen in de 1e pagina
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
<?php
session_start();
$default_besparing = 0.00;
$besparing_dakisolatie = 0.00;
$row = $besparing->fetch_row();
$besparing_ses = $row[0];
$besparing_dakisolatie = number_format($default_besparing + $besparing_ses, 2, ",", ".");
$_SESSION['besparen'] = $besparing_dakisolatie;
?>
session_start();
$default_besparing = 0.00;
$besparing_dakisolatie = 0.00;
$row = $besparing->fetch_row();
$besparing_ses = $row[0];
$besparing_dakisolatie = number_format($default_besparing + $besparing_ses, 2, ",", ".");
$_SESSION['besparen'] = $besparing_dakisolatie;
?>
Op de 2e pagina heb ik dan
De waarde wordt nu pas weergegeven nadat de pagina vernieuwd wordt en dat is vervelend als je iets uitrekent en daarna de pagina moet vernieuwen om het resultaat te zien.
Iemand een idee wat ik fout doe?
Alvast bedankt.
Gewijzigd op 11/08/2020 01:51:47 door Roy B
Je kan toch onder aan je derde script die sessie gewoon echo'en?
Maar ik wil het op een andere pagina ook zien.
Ik heb een index.php en daar heb ik een tabel waar ik deze waarde in weer wil geven.
Deze waarde komt van een ander php bestand. De waarde heb ik verder ook nog nodig om een totaal bedrag uit te rekenen.
Op deze testsite kun je het zelf zien.
http://www.eenwebsitemetwordpress.nl/wp-content/themes/breno-child/besparingscalculator
De waarden onder de tabel worden met ajax weergegeven. Deze code heeft een andere forumgebruiker voor me gemaakt. Daar zie je wat het moet zijn. Misschien dat het ook het ajax resultaat gefilterd kan worden, maar van ajax heb ik helemaal geen verstand :(
Je wilt dus de waarde die uit de calculator komt in een sessie opslaan?
Deze sessie wil ik gebruiken om het bedrag dat je spaart weer te geven in de tabel.
Er komen nog meer rijen in de tabel met andere isolatie opties en dan wil ik met sessies de bedragen die gespaard worden weergeven en dan onderaan de tabel optellen om zo het totaal weer te geven.
Weet niet of dit de beste oplossing is, maar kwam op internet steeds weer op sessies uit.
Je kan de waarde die uit de berekening komt via een AJAX-request naar een PHP script sturen, die het vervolgens in een sessie plaatst.
Ok, ik snap wat je bedoelt. Denk alleen niet dat ik het voor elkaar ga krijgen met AJAX maar ga een poging doen. Zal eens googlen op AJAX request.
https://www.phphulp.nl/php/forum/topic/2e-dropdown-vullen-op-basis-van-de-1e-dropdown/103650/#750562
Het enige wat moet gebeuren is in bestand isolatie_calc.php bovenaan een session_start() toe te voegen en verderop $_SESSION['besparen'] . Of wat er verder moet worden onthouden.
Adoptive Solution op 11/08/2020 12:08:53:
De pagina gebruikt dezelfde code die ik hier heb gedumpt. (Hint. Kijk in de broncode)
https://www.phphulp.nl/php/forum/topic/2e-dropdown-vullen-op-basis-van-de-1e-dropdown/103650/#750562
Het enige wat moet gebeuren is in bestand isolatie_calc.php bovenaan een session_start() toe te voegen en verderop $_SESSION['besparen'] . Of wat er verder moet worden onthouden.
https://www.phphulp.nl/php/forum/topic/2e-dropdown-vullen-op-basis-van-de-1e-dropdown/103650/#750562
Het enige wat moet gebeuren is in bestand isolatie_calc.php bovenaan een session_start() toe te voegen en verderop $_SESSION['besparen'] . Of wat er verder moet worden onthouden.
Dat heb ik ook op dit moment.
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
<?php
session_start();
$default_besparing = 0.00;
$besparing_dakisolatie = 0.00;
$row = $besparing->fetch_row();
$besparing_ses = $row[0];
$besparing_dakisolatie = number_format($default_besparing + $besparing_ses, 2, ",", ".");
$_SESSION['besparen'] = $besparing_dakisolatie;
?>
session_start();
$default_besparing = 0.00;
$besparing_dakisolatie = 0.00;
$row = $besparing->fetch_row();
$besparing_ses = $row[0];
$besparing_dakisolatie = number_format($default_besparing + $besparing_ses, 2, ",", ".");
$_SESSION['besparen'] = $besparing_dakisolatie;
?>
maar als ik dan op de index pagina de sessie start en een echo doe dan wordt de waarde alleen weergegeven als ik de pagina vernieuw.
In jouw code wordt met AJAX alles weergegeven met <p id="resultaat"></p>.
Dit zijn op dit moment 3 waarden die er dan weergegeven worden. Kan ik die ook apart van elkaar uitlezen/gebruiken? Want dan zou het ook op die manier kunnen.
Gewijzigd op 11/08/2020 13:01:36 door - Ariën -
Als er nu 2.99 uit je waarde komt, dan stop jij "2,99" in je session.
Zou je dat ergens anders willen gebruiken om bijvoorbeeld de dakisolatie bij de muurisolatie (3,99) op te tellen, dan blijk dat samen 5 op te leveren en waarschijnlijk verwacht jij dan 6,98
Roy Bulten op 11/08/2020 01:51:03:
De waarde wordt nu pas weergegeven nadat de pagina vernieuwd wordt en dat is vervelend als je iets uitrekent en daarna de pagina moet vernieuwen om het resultaat te zien.
Dit zou niets uit moeten maken, dus waarschijnlijk gaat er iets anders fout.
Maak je gebruik van frames?
Misschien zit er een spellingsfout ergens? Dump de gehele inhoud van $_SESSION eens?
Het lijkt mij ook een goed ontwerpprincipe om weergave van een pagina en verwerking van een formulier in twee afzonderlijke acties te stoppen, en in het laatste geval dien je direct een refresh te doen naar een weergavepagina zodat je niet blijft hangen op een "verwerkpagina". Oftewel volg het POST/redirect/GET patroon.
En als je direct/interactief het resultaat nodig hebt gebruik dan AJAX, je kunt dan in de achtergrond in een script dingen uitrekenen en direct retourneren, en tevens in een sessie opslaan voor later gebruik.
Maar voordat je dit doet lijkt het mij belangrijk om uit te zoeken wat er misgaat.
Thomas van den Heuvel op 11/08/2020 15:51:51:
Dit zou niets uit moeten maken, dus waarschijnlijk gaat er iets anders fout.
Maak je gebruik van frames?
Misschien zit er een spellingsfout ergens? Dump de gehele inhoud van $_SESSION eens?
Maak je gebruik van frames?
Misschien zit er een spellingsfout ergens? Dump de gehele inhoud van $_SESSION eens?
Ik heb geen frames en ik zie ook geen spelfouten in de code.
Als ik Print_r ($_SESSION); doe dan krijg ik eerst Array() te zien, vernieuw ik de pagina dan zie ik
[$indexwaardeisolatietest] was ik mee aan het testen of deze wel werkt, maar ook niet. Dus van index naar isolatie_calc.php gaat goed, maar de andere kant op niet. Staar me er nu een beetje blind op, zie gewoon niet wat er mis gaat. Erg frustrerend...
Mijn reactie nog gelezen?
Roy Bulten op 11/08/2020 21:49:09:
Array ( [$indexwaardeisolatietest] => 2.11 [besparen] => 793,00 )
Een sessie zou alleen indexen of (sub)arrays moeten bevatten lijkt mij.
Gewijzigd op 11/08/2020 22:13:45 door Thomas van den Heuvel
- Ariën - op 11/08/2020 21:50:56:
Mijn reactie nog gelezen?
Heb ze allemaal gelezen en op internet gezocht en dingen geprobeerd. Waardeer ook alle hulp van jullie kant. Maar begrijp sommige zaken niet. Ik ben meer van het grafische werk en probeer met te verbreden door dit zulk dingen zelf te proberen. Op isolatie_calc en op isolatie wordt het id met een $_POST binnen gehaald.
if( $_POST['id'] )
{
$id = $_POST['id'];
........
Kom er nog niet uit wat er dan nog meer gedaan moet worden met $_POST. Als ik de waardes direct in een $_SESSION zet of met een $_POST erin zet, de uitkomst is hetzelfde voor wat ik zie.
Toevoeging op 11/08/2020 22:19:42:
Thomas van den Heuvel op 11/08/2020 22:12:32:
Uhm, heb je dat letterlijk geknipt en geplakt van je scherm, want er staat:
Een sessie zou alleen indexen of (sub)arrays moeten bevatten lijkt mij.
Roy Bulten op 11/08/2020 21:49:09:
Array ( [$indexwaardeisolatietest] => 2.11 [besparen] => 793,00 )
Een sessie zou alleen indexen of (sub)arrays moeten bevatten lijkt mij.
Dat is een spelfout :)
Maar ik heb het in de code wel zonder de $.
De enige kanttekening die ik kan maken is dat je eigenlijk eerst zou moeten controleren of variabelen bestaan voordat je ze probeert te gebruiken.
$_SESSION en alle andere PHP-variabelen bestaan alleen aan de webserverkant. Het geproduceerde (HTML-)document is enkel de output hiervan, een webbrowser heeft hier geen weet van. Dit document is ook een momentopname van de toestand van de variabelen op de webserver op dat moment.
Dus als je een script #1 zou hebben:
Code (php)
En een script #2:
En je opent script #1 in browsertab A dan zie je hierin 'nothing here yet'.
Open je vervolgens in browsertab B script #2 dan bevat $_SESSION['test'] nu de waarde 'whatever'.
Maar als je dan terugschakelt naar tab A dan is de tekst op je scherm niet ineens veranderd naar 'whatever'. Hiertoe zou je de pagina moeten verversen om script #1 opnieuw uit te voeren zodat de nieuwe uitvoer geproduceerd wordt.
Vergelijk dit met een analoge brievenbus. De enige manier om na te gaan of deze post bevat is de brievenbus controleren. Als een extern proces vervolgens post aflevert zal de brievenbus je hier niet automagisch van op de hoogte stellen. Je zult daartoe de brievenbus opnieuw moeten inspecteren.
Zo ook in jouw code; de enige manier om te controleren of er iets is veranderd is... door te controleren of er iets is veranderd. Tenzij je van push notifications gebruik maakt ofzo, maar dat lijkt mij niet echt van toepassing op dit vraagstuk. De normale richting is "pull", oftewel je trekt zelf alle informatie binnen, niemand anders zal je hier automatisch over informeren.
Gewijzigd op 12/08/2020 11:12:39 door Thomas van den Heuvel
Thomas van den Heuvel op 12/08/2020 11:07:02:
Zo ook in jouw code; de enige manier om te controleren of er iets is veranderd is... door te controleren of er iets is veranderd.
Ik begrijp wel wat je bedoelt, maar ik krijg het niet vertaald naar code. Kun je iets meer zeggen over hoe ik het kan controleren? Als ik een startpunt heb dan kom ik misschien zelf verder.
Zie nu ook de volgende melding op de index pagina:
Notice: Undefined index: besparen
Dat heeft met de $_SESSION["besparen"]; te maken.
Dat is alleen de 1e keer als je de pagina opent. Als je een waarde kiest en dan de pagina vernieuwd dan zie je gewoon de waarde.
Gewijzigd op 12/08/2020 22:14:47 door Roy B
Roy Bulten op 12/08/2020 20:47:40:
Zie nu ook de volgende melding op de index pagina:
Notice: Undefined index: besparen
Dat heeft met de $_SESSION["besparen"]; te maken.
Dat is alleen de 1e keer als je de pagina opent. Als je een waarde kiest en dan de pagina vernieuwd dan zie je gewoon de waarde.
Notice: Undefined index: besparen
Dat heeft met de $_SESSION["besparen"]; te maken.
Dat is alleen de 1e keer als je de pagina opent. Als je een waarde kiest en dan de pagina vernieuwd dan zie je gewoon de waarde.
Zie mijn vorige reactie; controleer op het bestaan van de variabele mbv isset().
Heb je trouwens gecontroleerd of je geen last hebt van caching in je browser? Zorg dat deze tijdens ontwikkeling uit staat.
En zet het melden + weergeven van foutmeldingen aan mbv bovenaan je code:
Code (php)
1
2
3
4
5
2
3
4
5
<?php
error_reporting(E_ALL);
ini_set('display_startup_errors', true);
ini_set('display_errors', 'stdout');
?>
error_reporting(E_ALL);
ini_set('display_startup_errors', true);
ini_set('display_errors', 'stdout');
?>
Nadat een variabele in een sessie is gezet zou deze direct hierna beschikbaar moeten zijn. Zie nog steeds niet echt waar dit voor problemen zou zorgen en dit zou gewoon moeten werken.
Thomas van den Heuvel op 12/08/2020 22:32:18:
Zie mijn vorige reactie; controleer op het bestaan van de variabele mbv isset().
if (isset($_SESSION['besparen'])) {
echo $_SESSION['besparen'];
} else {
echo 'nothing here yet';
}
Heb ik in de index geplaatst en dan krijg ik de melding "nothing here yet. Als ik pagina vernieuw zie ik de juiste waarde.
Thomas van den Heuvel op 12/08/2020 22:32:18:
Heb je trouwens gecontroleerd of je geen last hebt van caching in je browser? Zorg dat deze tijdens ontwikkeling uit staat.
Heb ik uitstaan in de chrome developer console, maar moet nog wel steeds de cache verwijderen.
Thomas van den Heuvel op 12/08/2020 22:32:18:
En zet het melden + weergeven van foutmeldingen aan mbv bovenaan je code:
Code (php)
1
2
3
4
5
2
3
4
5
<?php
error_reporting(E_ALL);
ini_set('display_startup_errors', true);
ini_set('display_errors', 'stdout');
?>
error_reporting(E_ALL);
ini_set('display_startup_errors', true);
ini_set('display_errors', 'stdout');
?>
Heb ik in alle 3 de pagina's geplaatst, krijg geen foutmelding te zien behalve dan die ik al noemde bij het 1e openen van de pagina of na het verwijderen van de cache.
Gewijzigd op 12/08/2020 23:31:46 door Roy B