1

I've index.php and callSession04.php. When index.php does an AJAX request PHP SESSION variables are set on callSession04.php to store the current page and rows per page but on index.php PHP SESSION variables stay as initial state until I refresh index.php

You can see the example here, Need to refresh page before each AJAX request:

http://www.sanchezvalero.com/DWS/pracSESIONES/ej4/sesion04.php

And here is the code:

index.php

<? session_start(); ?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Listado de empleados</title>
<script type="text/javascript" src="jquery-1.10.2.min.js"></script>
</head>
<body>
<div id="content" align="center"></div>
<p>
    <div align="center">
        <label for="fldRows">Resultados por página:</label>
        <input name="fldRows" type="text" id="fldRows" size="2" />
    </div>
</p>
<p>
    <div id="manage" align="center">
        <input name="btnFirst" type="button" id="btn1" value="|&lt;" />
        <input name="btnBefore" type="button" id="btn2" value="&lt;" />
        <input name="btnAfter" type="button" id="btn3" value="&gt;" />
        <input name="btnLast" type="button" id="btn4" value="&gt;|" />
        <p><a href="destroy.php">Reset</a></p>
    </div>
</p>
<script type="text/javascript">
$(document).ready(function() {
    <? if(!isset($_SESSION['rows'])){ ?>
        $("#fldRows").val("10");
    <? } else { ?>
        $("#fldRows").val("<? echo $_SESSION['rows']; ?>");
    <? } if(!isset($_SESSION['actp'])){ ?>
        $actp=0;
    <? } else { ?>
        $actp=<? echo $_SESSION['actp']; ?>;
    <? } ?>
    $.ajax({type: "GET",
            url: "callSesion04.php",
            data: "rows="+$("#fldRows").val()+"&actp="+$actp,
            success: function(data) {
                $("#content").html(data);
            }
    });
});
$("#fldRows").keyup(function() {
    if($(this).val()>=0){
        $.ajax({type: "GET",
                url: "callSesion04.php",
                data: "rows="+$(this).val()+"&actp=0",
                success: function(data) {
                    $("#content").html(data);
                }
        }); 
    }
});
$("body").on("click","#manage input",function(){
    $id=$(this).attr('id').substr($(this).attr('id').search(/\d/));
    $.ajax({type:"GET",
            url:"callSesion04.php",
            data:"pag="+$id+"&actp=<? echo $_SESSION['actp']; ?>&rows=<? echo $_SESSION['rows']; ?>",
            success: function(data) {
                $("#content").html(data);
            }
    });
});
</script> 
</body>
</html>

callSession04.php

<? session_start();

$dom = new DOMDocument();
$dom->load('empleados.xml');
$empleados=$dom->getElementsByTagName('RECORD');
foreach($empleados as $empleado){
    $ids=$empleado->getElementsByTagName('ID_EMPLEADO');
    $id=$ids->item(0)->nodeValue;
    $array_ids[]=$id;
    $nombres=$empleado->getElementsByTagName('NOMBRE');
    $nombre=$nombres->item(0)->nodeValue;
    $array_nombres[]=$nombre;
    $apellidos=$empleado->getElementsByTagName('APELLIDOS');
    $apellido=$apellidos->item(0)->nodeValue;
    $array_apellidos[]=$apellido;
    $fechas=$empleado->getElementsByTagName('FECHA_NACIMIENTO');
    $fecha=$fechas->item(0)->nodeValue;
    $array_fechas[]=$fecha;
    $tipos=$empleado->getElementsByTagName('TIPO_EMPLEADO');
    $tipo=$tipos->item(0)->nodeValue;
    $array_tipos[]=$tipo;
    $hijos=$empleado->getElementsByTagName('NUM_HIJOS');
    $hijo=$hijos->item(0)->nodeValue;
    $array_hijos[]=$hijo;
}

$rows=$_GET['rows'];
$actp=$_GET['actp'];
$pag=$_GET['pag'];

$_SESSION['rows']=$rows;

if($rows>0){
    $tpag=intval(count($array_ids)/$rows);
}

if($pag=='1'){
    $actp=0;
}else if($pag=='2' && $actp>0){
    $actp--;
}else if($pag=='3' && $actp<$tpag){
    $actp++;
}else if($pag=='4'){
    $actp=$tpag;
}

$_SESSION['actp']=$actp;

$minrow=$rows*$actp;
$maxrow=$rows*$actp+$rows;

if($maxrow>count($array_ids)){
    $maxrow=count($array_ids);
}

echo "<p align='center'><strong>EMPLEADOS</strong></p>";
echo "<table border='1' cellspacing='0' cellpadding='5'>";
echo "<tr><td>ID</td><td>Nombre</td><td>Apellidos</td><td>Nacimiento</td><td>Tipo</td><td>Hijos</td></tr>";
for($i=$minrow;$i<$maxrow;$i++){
    echo "<tr><td>".$array_ids[$i]."</td><td>".$array_nombres[$i]."</td><td>".$array_apellidos[$i]."</td>
          <td>".$array_fechas[$i]."</td><td>".$array_tipos[$i]."</td><td>".$array_hijos[$i]."</td></tr>";
}   
echo "</table>";
?>

I need to know how refresh PHP SESSION VARS on index.php withouth press F5.

Vinod VT
  • 6,946
  • 11
  • 51
  • 75
  • I don't see any issue. When doing an Ajax call (without refreshing), it seems to work fine. – Manolo Oct 16 '13 at 09:29

2 Answers2

3

Finally I solved this, the solution, JSON. Is not necessary to refresh PHP SESSION vars on index.php, only on callSession04.php, simply I've to use AJAX callback to reflect the current server state parsing JSON array on index.php from callSession04.php then you can set new current page and rows per page vars.

index.php

<? session_start(); ?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Listado de empleados</title>
<script type="text/javascript" src="jquery-1.10.2.min.js"></script>
</head>
<body>
<div id="content" align="center"></div>
<p>
    <div align="center">
        <label for="fldRows">Resultados por página:</label>
        <input name="fldRows" type="text" id="fldRows" size="2" />
    </div>
</p>
<p>
    <div id="manage" align="center">
        <input name="btnFirst" type="button" id="btn1" value="|&lt;" />
        <input name="btnBefore" type="button" id="btn2" value="&lt;" />
        <input name="btnAfter" type="button" id="btn3" value="&gt;" />
        <input name="btnLast" type="button" id="btn4" value="&gt;|" />
        <p><a href="destroy.php">Reset</a></p>
    </div>
</p>
<script type="text/javascript">
$(document).ready(function() {
    <? if(!isset($_SESSION['rows'])){ ?>
        $("#fldRows").val("10");
        $rows=10;
    <? } else { ?>
        $("#fldRows").val("<? echo $_SESSION['rows']; ?>");
        $rows=<? echo $_SESSION['rows']; ?>;
    <? } if(!isset($_SESSION['actp'])){ ?>
        $actp=0;
    <? } else { ?>
        $actp=<? echo $_SESSION['actp']; ?>;
    <? } ?>
    $.ajax({type: "GET",
            url: "callSesion04.php",
            data: "rows="+$("#fldRows").val()+"&actp="+$actp,
            success: function(data) {
                var json = $.parseJSON(data);
                $("#content").html(json.html);
            }
    });
});
$("#fldRows").keyup(function() {
    if($(this).val()>=0){
        $.ajax({type: "GET",
                url: "callSesion04.php",
                data: "rows="+$(this).val()+"&actp=0",
                success: function(data) {
                    var json = $.parseJSON(data);
                    $rows=json.rows;
                    $("#content").html(json.html);
                }
        }); 
    }
});
$("body").on("click","#manage input",function(){
    $id=$(this).attr('id').substr($(this).attr('id').search(/\d/));
    $.ajax({type:"GET",
            url:"callSesion04.php",
            data:"pag="+$id+"&actp="+$actp+"&rows="+$rows,
            success: function(data) {
                    var json = $.parseJSON(data);
                    $actp=json.actp;
                    $("#content").html(json.html);
            }
    });
});
</script> 
</body>
</html>

callSession04.php

<? session_start();

$dom = new DOMDocument();
$dom->load('empleados.xml');
$empleados=$dom->getElementsByTagName('RECORD');
foreach($empleados as $empleado){
    $ids=$empleado->getElementsByTagName('ID_EMPLEADO');
    $id=$ids->item(0)->nodeValue;
    $array_ids[]=$id;
    $nombres=$empleado->getElementsByTagName('NOMBRE');
    $nombre=$nombres->item(0)->nodeValue;
    $array_nombres[]=$nombre;
    $apellidos=$empleado->getElementsByTagName('APELLIDOS');
    $apellido=$apellidos->item(0)->nodeValue;
    $array_apellidos[]=$apellido;
    $fechas=$empleado->getElementsByTagName('FECHA_NACIMIENTO');
    $fecha=$fechas->item(0)->nodeValue;
    $array_fechas[]=$fecha;
    $tipos=$empleado->getElementsByTagName('TIPO_EMPLEADO');
    $tipo=$tipos->item(0)->nodeValue;
    $array_tipos[]=$tipo;
    $hijos=$empleado->getElementsByTagName('NUM_HIJOS');
    $hijo=$hijos->item(0)->nodeValue;
    $array_hijos[]=$hijo;
}

$rows=$_GET['rows'];
$actp=$_GET['actp'];
$pag=$_GET['pag'];

if($rows>0){
    $tpag=intval(count($array_ids)/$rows);
}

if($pag=='1'){
    $actp=0;
}else if($pag=='2' && $actp>0){
    $actp--;
}else if($pag=='3' && $actp<$tpag){
    $actp++;
}else if($pag=='4'){
    $actp=$tpag;
}

$_SESSION['rows']=$rows;
$_SESSION['actp']=$actp;

$minrow=$rows*$actp;
$maxrow=$rows*$actp+$rows;

if($maxrow>count($array_ids)){
    $maxrow=count($array_ids);
}

$html = "<p align='center'><strong>EMPLEADOS</strong></p>";
$html .= "<table border='1' cellspacing='0' cellpadding='5'>";
$html .= "<tr><td>ID</td><td>Nombre</td><td>Apellidos</td><td>Nacimiento</td><td>Tipo</td><td>Hijos</td></tr>";
for($i=$minrow;$i<$maxrow;$i++){
    $html .= "<tr><td>".$array_ids[$i]."</td><td>".$array_nombres[$i]."</td><td>".$array_apellidos[$i]."</td>";
    $html .= "<td>".$array_fechas[$i]."</td><td>".$array_tipos[$i]."</td><td>".$array_hijos[$i]."</td></tr>";
}   
$html .= "</table>";
$aPag = array("rows"=>$rows,"actp"=>$actp,"html"=>$html);
echo json_encode($aPag);
?>
2

The session state is on the server, your code updates it on the server correctly (I assume). What you experience is the representation of the server state (index.php) is not updated on the client (browser) after the Ajax call.

You have multiple options to fix that:

  • Use the ajax callback to reload the current page (index.php)
  • Use the ajax callback to update the current page (DOM manipulation) to reflect the server state

This can not be fixed in the php (server side) alone.

Thomas
  • 11,272
  • 2
  • 24
  • 40
  • The first option would update entire page? Because I don't want it. The second option what you refer? –  Oct 16 '13 at 11:15
  • The second method would use javascript to change the page without reloading it. You can for example use jQuery to reduce the effort for yourself. – Thomas Oct 16 '13 at 11:20