Newsgroup: it.comp.www.php
Titolo: Ajax e sessioni Php

Salve a tutti, sto realizzando un pannello admin integrato nella
pagina di navigazione con ajaxi.
La generazione delle pagine viene modificata a seconda dell'accessleve
memorizzato nella sessione, se è un visitatore non mostra ne i
controlli admin, ne le librerie ad hoc in js per la gestione
amministrativa. Mentre se è un admin mostra controlli e include la
libreria admin in js.
Premesso questo, passiamo al problema.
Praticamente io al visitatore mostro il login per farsi riconoscere e
invio i dati tramite una chiamata POST Ajax ad una pagina php. Questa
pagina php non fa altro che verificare i dati utente con un confronto
classico tra due variabili e impostare una variabile nella sessione
per riconoscere l'admin.
La chiamata ajax a quella pagina viene eseguita correttamente e anche
il check sui dati, ma non viene impostata la variabile di sessione.
Spero di essere stato chiaro.
Grazie a chi mi risponderà. :)

 il check sui dati, ma non viene impostata la variabile di sessione.
Che cosa intendi "non viene impostata la variabile di sessione"?
Come lo verifichi?
-- 
Vuoi distribuire il tuo sito web su CD/DVD?
Prova 
http://www.dwebpro.com/
Vuoi diventare un esperto analista PHP/MySQL?
Vieni a fare uno stage con noi: 
http://www.creativepark.it/stage/

 Vieni a fare uno stage con noi:
http://www.creativepark.it/stage/
Con una classe che mi sono scritto per gestire le sessioni. Non ho
dubbi sul funzionamento della classe perchè ho provato a richiamare la
pagina dal browser e la valorizzazione della variabile di sessione
($_SESSION['admin.log'] = true) avviene correttamente.
Il problema sorge quando richiamo la pagina via ajax, e non capisco
perchè...

 perchč...
Che cosa restituisce al client Ajax la pagina PHP?
Se gli fai restituire un var_export($_SESSION), che cosa ottieni?
Stai utilizzando degli header location?
-- 
Vuoi distribuire il tuo sito web su CD/DVD?
Prova 
http://www.dwebpro.com/


 Vieni a fare uno stage con noi:
http://www.creativepark.it/stage/
Php restituisce true o false a seconda della validità dei dati o meno,
ho un print_r() nella pagina che ricaricandola mi stampa l'array
$_SESSION e non uso Header("Location: "); perchè so che non
funzionerebbe visto che ormai gli Header sono stati inviati.
Credo che il problema sia proprio nella sessione.
Ora ti posto un pò di codice, grazie per l'aiuto :)
admin.controll.php
<?php
if (realpath(__FILE__) == realpath($_SERVER['SCRIPT_FILENAME']))
die("Non puoi accedere a questa pagina");
require("./core/include.main.php");
$action = $GLOBALS['system']->get_user_input(POST, "action");
switch($action)
{
	...
	case 'login':
		$password = $GLOBALS['system']->get_user_input(POST, "password");
		if(md5($password) == $GLOBALS['extra']['admin']['pass'])
		{
			$GLOBALS['session']->set_var("admin.log", true);
			print 'true';
		}
		else
		{
			print 'false';
		}
	break;
	...
}
?>
ajax:
    $("#send_admin").click( function() {
        var f_password = $("#admin_pass").val();
        if(f_password != '')
        {
            $.post("../admin.controll.php", {action: 'login',
password: f_password}, function(data) {
                if(data)
                {
                    alert("Accesso effettuato! Benvenuto :)\nLa pagina
verrà ricaricata..");
                    location.href = "/marzano/";
                }
                else
                    alert("Accesso negato!");
            });
        }
        else
        {
            return false;
        }
    });

 if (realpath(__FILE__) == realpath($_SERVER['SCRIPT_FILENAME']))
<?php
session_start();
if (realpath(__FILE__) == realpath($_SERVER['SCRIPT_FILENAME']))
[...]
                if(md5($password) == $GLOBALS['extra']['admin']['pass'])
                {
                        $_SESSION['admin.log'] = true;
                        print 'true';
                }
-- 
while(!asleep()) sheep++;

 il check sui dati, ma non viene impostata la variabile di sessione.
Ho avuto lo stesso problema. Io non avevo messo session_start() nel file 
php chiamato via ajax.
Poi ho pensato di fare una cosa così:
- ho creato un file background.php in cui metto tutte le cose da 
chiamare per ogni file php usato da ajax. E in cui metto il session_start().
Poi da ajax chiamo una cosa tipo: 
background.php?script=script_da_eseguire.php
e all'interno di background, fatti i necessari controlli, faccio un 
include per lo script da eseguire.
In modo di non dovermi ricordare in ogni miniscript php per ajax tutti i 
controlli da fare.


wrote:

La cosa mi lascia dubbioso, perchè nel file include.main.php c'è la
creazione della classe per la sessione e il suo avvio... Proverò come
mi avete suggerito. :)


Bhè, io uso un sistema più o meno simile.Invece di includere ogni file
php nel file chiamato da ajax gestisco i vari tipi di chiamata nel
file principale con i dovuti controlli... Ho scelto di studiarmi un
codice js più flessibile e di conseguenza penso di aver alleggerito la
parte in php che si limita a controllare i dati e effettuare le dovute
operazioni...
Utilizzando il sistema che ho descritto sopra, a meno che il
visitatore non si identifichi come admin le chiamate ajax e i
controlli non verranno mai mostrati, anche perchè la stampa o meno del
codice viene gestita comunque da php e la pagina che include le
librerie js è .php anchessa con i dovuti controlli per evitare la
richiesta via barra degli indirizzi...


wrote:

Funziona perfettamente ma non capisco come mai, secondo quale
principio non dovrebbe funzionare come l'ho studiata io?
Alla fine è la stessa cosa solo che la sessione viene avviata in una
classe che appunto gestisce la sessione...

Scoperto l'arcano!
Non era un problema di sessione, ma di controllo a monte.
if (realpath(__FILE__) == realpath($_SERVER['SCRIPT_FILENAME']))
die("Non puoi accedere a questa pagina");
Ora che ci penso ajax effettua una vera e propria chiamata GET quando
punta ad una risorsa esterna e quindi php faceva il suo dovere!
Grazie comunque per l'aiuto! :)