Hallo,

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:

<?php
// Start the session
session_start();

$_SESSION['woord'] = "hallo";
?>


pagina 2:

<?php
session_start();
echo "Het woord is: " . $_SESSION['woord'] . ".";
?>


Nu probeer ik het met het onderstaande te doen in de 1e pagina


<?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;
?>


Op de 2e pagina heb ik dan

<?php
session_start();
echo $_SESSION['besparen'];
?>


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.
>> Heb ik in de index geplaatst en dan krijg ik de melding "nothing here yet. Als ik pagina vernieuw zie ik de juiste waarde.

Is het probleem nu opgelost dan?
Ozzie PHP op 12/08/2020 23:40:27

>> Heb ik in de index geplaatst en dan krijg ik de melding "nothing here yet. Als ik pagina vernieuw zie ik de juiste waarde.

Is het probleem nu opgelost dan?


Nee want ik zou graag zien dat de waarde uit zichzelf veranderd zodra de waarde in de dropdowns veranderen. Als ik de pagina vernieuw zie je de waarde wel maar ben je de rest kwijt.
>> Nee want ik zou graag zien dat de waarde uit zichzelf veranderd zodra de waarde in de dropdowns veranderen.

En wat heb je gedaan om dat te bereiken? Hoe ziet je code er nu uit?
Ozzie PHP op 13/08/2020 12:13:21

En wat heb je gedaan om dat te bereiken? Hoe ziet je code er nu uit?



index.php


<?php
// Start the session
session_start();

error_reporting(E_ALL);
ini_set('display_startup_errors', true);
ini_set('display_errors', 'stdout');

?>
<div>
<table>
  <thead>
    <tr>
      <th scope="col">Huidige situatie</th>
      <th scope="col">Na renovatie</th>
      <th scope="col">Besparing</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td data-label="Huidige situatie">
      <label>Isolatie :</label>
    <select id="isolatie_huidig" name="isolatie_huidig" class="isolatie_huidig">
        <option value="10000">Selecteer isolatie</option>   
        
        <?php
	 include('database.php');
	     $result = mysqli_query($con,"select * from isolatie_huidig");
	     while($row=mysqli_fetch_array($result))
		{
		echo '<option value="'.$row['huidig_id'].'">'.$row['huidig_status'].'</option>';
		} 
	?>
     </select>
      </td>
      <td data-label="Na renovatie"> 
         <label>Isolatie na renovatie</label>
         <select id="isolatie_renovatie" name="isolatie_renovatie" class="isolatie_renovatie" >
         <option>Selecteer isolatie</option>
         </select>
      </td>
      <td data-label="Besparing">
				
      <?php 
           if (isset($_SESSION['besparen'])) {
               echo $_SESSION['besparen'];
           } else {
               echo 'niets';
           }
		  
	?>
        </td>
    </tr>  
  </tbody>
</table> 

<p id="resultaat"></p>
    <br/><br/>

</div>


<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>

<script>
$(document).ready(function()
{
    $("#isolatie_huidig").change(function()
    {
        var huidig_id = $(this).val();
        var post_id   = 'id='+ huidig_id;
        $.ajax ({
            type: "POST",
            url: "http://www.eenwebsitemetwordpress.nl/wp-content/themes/breno-child/besparingscalculator/isolatie.php",
            data: post_id,
            cache: false,
            success: function(isolatie)
            {
                $("#isolatie_renovatie").html(isolatie);
                singleSelectChangeValue();
                getCalcValues( post_id );
            }
        });
    });
});

$("#isolatie_renovatie").change(function()
    {
    var huidig_id = $(this).val();
    var post_id   = 'id='+ huidig_id;
    getCalcValues( post_id );
});

function getCalcValues( test )
{
    $.ajax ({
        type: "POST",
        url: "http://www.eenwebsitemetwordpress.nl/wp-content/themes/breno-child/besparingscalculator/isolatie_calc.php",
        data: test,
        cache: false,
        success: function(resultaat)
        {
            $("#resultaat").html(resultaat);
        }
    });
}


function singleSelectChangeValue()
{
    var selObj   = document.getElementById("isolatie_renovatie");
    var selValue = selObj.options[selObj.selectedIndex].value;
    var selText  = selObj.options[selObj.selectedIndex].text;
}

</script>


isolatie_calc.php


<?php
session_start();
error_reporting(E_ALL);
ini_set('display_startup_errors', true);
ini_set('display_errors', 'stdout');

if (isset($_SESSION['besparen'])) {
    echo $_SESSION['besparen'];
} else {
    echo 'nothing here yet';
}

?>

<?php




include('db.php');
if( $_POST['id'] )
{
    $id = $_POST['id'];
	
	$default_besparing = 0.00;
	$besparing_dakisolatie = 0.00;
	$textenergielabel = 'Uw energielabel wordt: ';
	
	$besparing = $con->query('SELECT besparingsbedrag FROM isolatie_renovatie WHERE huidig_id = "' . $id . '";' );
   
        $row = $besparing->fetch_row();
  	$besparing_ses = $row[0];
	$_POST['$besparing_dakisolatie'] = $default_besparing + $besparing_ses;
        $_SESSION['besparen'] = number_format($_POST['$besparing_dakisolatie'], 2, ",", ".");
	
	echo 'Uw besparing per jaar voor dit is: €'; echo $_SESSION['besparen'];
	echo '<br/><br/>';
		
}


?>




isolatie.php

<?php
session_start();
error_reporting(E_ALL);
ini_set('display_startup_errors', true);
ini_set('display_errors', 'stdout');
?>


<?php
include('db.php');

if( $_POST['id'] )
{
    $id = $_POST['id'];
    $options = '';
	
    if ( $id <= 9999 )
    {
        if ( $id == 1 )
        {		 
			  $result = $con->query("SELECT * FROM isolatie_renovatie");
			 
        } else {
						
			  $result = $con->query('SELECT * FROM isolatie_renovatie WHERE huidig_id = "' . $id . '"');

        }
  
	  	while($row = mysqli_fetch_object($result))
        {
			$options .= '<option value="' . $row->renovatie_id . '">' . $row->renovatie_status . ' | ' . $row->indexwaarde . '</option>' ;
		}		
		
    } else {
        $options .= '<option value="0">Selecteer eerst isolatie</option>' . PHP_EOL;
    }
		
   echo $options;    	
}


?>



Code is aangeleverd door Adoptive Solution en daar ben ik mee verder gaan proberen.
Je ziet op de test pagina dat de waarde van AJAX wel steeds vernieuwd maar de waarde in de sessie steeds 1 achter loopt.

http://www.eenwebsitemetwordpress.nl/wp-content/themes/breno-child/besparingscalculator/index.php
Als eerste .. probeer je code beter te structureren. Stukken php-code tussen de html is niet overzichtelijk. Beter is het om de berekeningen in php bovenaan de pagina te maken en om dan in de html-code alleen een php-variabele te echo'en.

Dat gezegd hebbende ... het stukje waar het om gaat is volgens mij dit:


<td data-label="Besparing">           
  <?php
    if (isset($_SESSION['besparen'])) {
      echo $_SESSION['besparen'];
    } else {
      echo 'niets';
    }
  ?>
</td>

Op het moment dat je de pagina de allereerste keer inlaadt is de waarde/sessie nog niet gewijzigd en dus wordt de standaardwaarde 'niets' getoond. Als je dan de dropdown wijzigt, zul je tevens de waarde in die <td></td> moeten vervangen door de juiste waarde.
Ozzie PHP op 13/08/2020 16:11:16

Als eerste .. probeer je code beter te structureren. Stukken php-code tussen de html is niet overzichtelijk. Beter is het om de berekeningen in php bovenaan de pagina te maken en om dan in de html-code alleen een php-variabele te echo'en.

Als ik het aan het werk krijg dan ga ik dat zeker aanpassen.

Ozzie PHP op 13/08/2020 16:11:16

Dat gezegd hebbende ... het stukje waar het om gaat is volgens mij dit:


<td data-label="Besparing">           
  <?php
    if (isset($_SESSION['besparen'])) {
      echo $_SESSION['besparen'];
    } else {
      echo 'niets';
    }
  ?>
</td>

Op het moment dat je de pagina de allereerste keer inlaadt is de waarde/sessie nog niet gewijzigd en dus wordt de standaardwaarde 'niets' getoond. Als je dan de dropdown wijzigt, zul je tevens de waarde in die <td></td> moeten vervangen door de juiste waarde.



Het gaat idd om dat stukje, maar het probleem is dat ik het dat niet voor elkaar krijg. Er moet dan iets komen die controleert of de dropdown veranderd.


Ik denk dat je best e.e.a. kunt combineren? Je kunt best een boodschap tonen en tegelijkertijd een nieuwe dropdown weergeven. JSON kan prima een array met al deze informatie-elementen teruggeven.

Ik zou de sessie voornamelijk gebruiken voor initialisatie, bijvoorbeeld voor het moment dat iemand besluit de pagina te verversen tijdens het selectieproces ofzo.

Omdat je gebruik maakt van AJAX-calls is het misschien handig dat je je formulieren ook op dezelfde manier initialiseert zodat je niet twee dingen (het initieel opbouwen van de pagina en het aanpassen van de dropdowns via AJAX-calls) op verschillende manieren probeert te doen, dus voorkom dat je verschillende routines hebt die in wezen hetzelfde doen.

singleSelectChangeValue() doet op dit moment ook niets omdat die variabelen alleen binnen de context van die functie bestaan?

Misschien is het het makkelijkste om dit stap voor stap uit te werken. Schrijf eerst code voor de eerste dropdown, dan voor de tweede. Zorg dat dit alles werkt, en kijk vervolgens terug hoe e.e.a. eventueel efficiënter aangepakt kan worden. Laat misschien in eerste instantie de sessie in het geheel achterwege, dit zorgt enkel voor extra complexiteit. Probeer ook vooral niet alles tegelijkertijd te doen maar compartimenteer dit in stappen, zodat je makkelijker het overzicht kunt bewaren. Ik heb namelijk de indruk dat vooral dit laatste een probleem is, dus maak het jezelf makkelijk door het op te delen in stukken en doe één ding tegelijkertijd :).
Thomas van den Heuvel op 13/08/2020 17:12:24

Ik denk dat je best e.e.a. kunt combineren? Je kunt best een boodschap tonen en tegelijkertijd een nieuwe dropdown weergeven. JSON kan prima een array met al deze informatie-elementen teruggeven.


Aangezien ik het niet voor elkaar krijg heb ik even naar jouw suggestie JSON gekeken, wat voorbeelden gevonden en wat getest.

1 voorbeeld heeft 3 dropdowns en die heb ik aangepast en dat werkt. Dit is hoe ik nu het json bestand heb. Is dat op een juiste wijze of kan het ook beter?




[
	{
		"id":"1",
		"name": "geen isolatie",
		"parent_id":"0"
	},
	{
		"id":"2",
		"name": "goede isolatie",
		"parent_id":"0"
	},
	{
		"id":"3",
		"name": "betere isolatie",
		"parent_id":"0"

	},
	{
		"id":"4",
		"name": "beste isolatie",
		"parent_id":"0"

	},
	{
		"id":"5",
		"name": "geen isolatie",
		"parent_id":"1"

	},
	{
		"id":"6",
		"name": "goede isolatie",
		"parent_id":"1"

	},
	{
		"id":"7",
		"name": "betere isolatie",
		"parent_id":"1"

	},
	{
		"id":"8",
		"name": "beste isolatie",
		"parent_id":"1"

	},
{
		"id":"9",
		"name": "geen besparing",
		"parent_id":"5"

	},
	{
		"id":"10",
		"name": "€ 793,00",
		"parent_id":"6"

	},
	{
		"id":"11",
		"name": "€ 845,00",
		"parent_id":"7"

	},
	{
		"id":"12",
		"name": "€ 905,00",
		"parent_id":"8"

	}
]



De waarden met de bedragen staan nu ook in een dropdown. Deze wil ik gewoon als tekst weergegeven. Daarvoor zal onderstaande aangepast moeten worden en moet ik de waarde van de besparing kunnen gebruiken om meerdere bij elkaar op te tellen. Kun je me daar mee op weg helpen?


$(document).on('change', '#huidig', function(){
  var huidig_id = $(this).val();
  if(huidig_id != '')
  {
   load_json_data('nieuw', huidig_id);
  }
  else
  {
   $('#nieuw').html('<option value="">Select nieuw</option>');
   $('#besparing').html('<option value="">Select besparing</option>');
  }
 });
 $(document).on('change', '#nieuw', function(){
  var nieuw_id = $(this).val();
  if(nieuw_id != '')
  {
   load_json_data('besparing', nieuw_id);
  }
  else
  {
   $('#besparing').html('<option value="">Select besparing</option>');
  }
 });
});

Zie code 13/08/2020 12:49:45

Wijzig :

<td data-label="Besparing">


in dit :

<td id='besparing' data-label="Besparing">


Stuur in isolatie_calc.php alleen de uitgerekende waarde terug :

echo $_SESSION['besparen'];


En verwerk de ontvangen waarde :

$("#resultaat").html('Uw besparing per jaar voor dit is : €' + resultaat);
$("#besparing").html(resultaat);
Je hoeft de options niet helemaal uit te schrijven als JSON, ik bedoelde meer zoiets:
<?php
$return = []; // JSON response
$return['message'] = 'Hallo Pietje Puk';

ob_start(); // gebruik output buffering, scheelt je een hoop quotes enzo
    $result = $con->query('...');
    while ($row = $result->fetch_assoc()) {
        // voor de goede orde zouden waarden van $row ook ge-escaped moeten worden met htmlspecialchars()
        // indien deze in een HTML-context gebruikt worden zoals hieronder het geval is
        ?><option value="<?php echo $row['some_key']; ?>"><?php echo $row['some_value']; ?></option><?php
    }
$return['options'] = ob_get_clean();

// bouw de response
header('Content-Type: application/json; charset=UTF-8');
echo json_encode($return);
?>

Nu bevat de response twee elementen: message en options.

Reageren