PDA

View Full Version : [PHP] sessioni.... ma come?


TorpedoBlu
17-05-2005, 13:01
non ne capisco molto per ora, ma il frammento di codice per mantenere il nome utente proveniente da una form, non è giusto?





//gestione della sessione nel caso in cui i cookie sono disabilitati
if(IsSet($_POST['PHPSESSID']) && !IsSet($_COOKIE['PHPSESSID']))
{
$PHPSESSID=$_POST['PHPSESSID'];
header("Location: $redirect?PHPSESSID=$PHPSESSID"); //si ricarica la pagina di login
}

session_start(); //si inizia o continua la sessione
$_SESSION['user']=$_POST['user'];

$utente=$_SESSION['user']; //----------> questa variabile deve arrivare dalla sessione!





Warning: session_start(): Cannot send session cookie - headers already sent by (output started at c:\programmi\easyphp\www\iframe4.php:13) in c:\programmi\easyphp\www\iframe4.php on line 35

Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at c:\programmi\easyphp\www\iframe4.php:13) in c:\programmi\easyphp\www\iframe4.php on line 35

ilDave
17-05-2005, 13:07
La funzione session_start() dev'essere posizionata prima di qualsiasi output...

TorpedoBlu
17-05-2005, 13:47
<?
$redirect="http://localhost/login.php";
//gestione della sessione nel caso in cui i cookie sono disabilitati
if(IsSet($_POST['PHPSESSID']) && !IsSet($_COOKIE['PHPSESSID']))
{
$PHPSESSID=$_POST['PHPSESSID'];
header("Location: $redirect?PHPSESSID=$PHPSESSID"); //si ricarica la pagina di login
}

session_start(); //si inizia o continua la sessione
if(isset($_POST['user']))
$_SESSION['user']=$_POST['user'];

?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Untitled Document</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>

<body>
<table>
<tr><td><form action="login.php" method="post"></td></tr>
<tr><td width="60">nome utente</td><td width="60"><input type="text" value="" name="user"></td></tr>
<tr><td>password</td><td><input type="text" value="" name="password"></td></tr>
<tr><td></td><td><input type="submit" value="entra"></td></tr>
<tr></form></tr>
</table>



e l'unico modo di far funzionare la sessione in altre pagine è:
<? session_start(); //si inizia o continua la sessione ?>

inserito alla riga 1 di ogni pagina...

ma è giusto che funzioni così? mi spiegate come faccio il logOut?

ilDave
17-05-2005, 14:29
Logout: http://it2.php.net/session_destroy :)

TorpedoBlu
18-05-2005, 13:49
ok, ho fatto una pagina di login, come si fa a fare un redirect su una pagina dopo che la mia pagina di login ha controllato se username e psw sono giusti?

nel senso la form di login ha come action la stessa pagina e controlla se l'utente ha inserito i dati giusti, poi vorrei che dopo un paio di secondi si facesse il redirect sulla pagina home dell'applicazione senza dover cliccare su un link.

TorpedoBlu
18-05-2005, 13:54
chiaramente lo stesso discorso vale per il logout, lo posiziono in tutte le pagine, e mi deve riportare alla pagina di login dopo aver distrutto la sessione.
non saprei come fare (sono nuovo alla programmazione web, scusatemi :bimbo: )

:help:

ilDave
18-05-2005, 13:56
//il tuo codice per il controllo del login

header("Location: paginachevuoi.php"); //fa il redirect


:D

TorpedoBlu
18-05-2005, 14:24
Warning: Cannot modify header information - headers already sent by (output started at c:\programmi\easyphp\www\funzioni.php:1) in c:\programmi\easyphp\www\index2.php on line 22


<?

$redirect="http://localhost/login.php";
//gestione della sessione nel caso in cui i cookie sono disabilitati
if(IsSet($_POST['PHPSESSID']) && !IsSet($_COOKIE['PHPSESSID']))
{
$PHPSESSID=$_POST['PHPSESSID'];
header("Location: $redirect?PHPSESSID=$PHPSESSID"); //si ricarica la pagina di login
}

include("funzioni.php");

if(!isset($_POST['login']))
echo"Pagina di login, se non sei registrato clicca <a href''>qui</a>";
else{
$query="select * from utente where nick='".$_POST['user']."'";
$controllo=mysql_query($query);
if($controllo){
$row = mysql_fetch_array($controllo);
if($row[1]==$_POST['password']){
$user=$row[0];
header("Location: http://localhost/home.php?user=$user");
}
else
echo"Attenzione la password è errata";
}
else
echo"Attenzione la username è errata";
}

?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Untitled Document</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>

<body>

<table>
<form action="index2.php" method="post">
<tr><td width="60">nome utente</td><td width="60"><input type="text" value="" name="user"></td></tr>
<tr><td>password</td><td><input type="text" value="" name="password"></td></tr>
<tr><td></td><td><input type="submit" name="login" value="entra"></td></tr>
</form>
</table>



</body>
</html>





:muro:

TorpedoBlu
18-05-2005, 14:28
il contenuto di funzioni.php è semplicemente la configurazione per la connessione al db mySQL, ma senza di questa non posso fare la query che controlla l'utente nel db, e cmq come è possibile che non si possano fare dei redirect in mezzo al codice ma solo all'inizio? non capisco

ilDave
18-05-2005, 14:38
Per usare la funzione header() non devi aver inviato dell'output prima... quindi niente print o echo o qualsiasi altra cosa che crei un output...
Probabilmente nel file funzioni.php c'è qcosa che invece lo fa...

TorpedoBlu
18-05-2005, 14:58
ok il login funziona, nella mia pagina home.php ho messo un link ad una pagina chiamata logout.php, il contenuto di tale pagina è:

<?
// Desetta tutte le variabili di sessione.
session_unset();
// Infine , distrugge la sessione.
session_destroy();
//ributta in login
header("Location: http://localhost/login.php");
?>


ma mi da questo errore:
Warning: session_destroy(): Trying to destroy uninitialized session in c:\programmi\easyphp\www\logout.php on line 5

Warning: Cannot modify header information - headers already sent by (output started at c:\programmi\easyphp\www\logout.php:5) in c:\programmi\easyphp\www\logout.php on line 7

ilDave
18-05-2005, 15:03
Prova ad aggiungere session_start(); all'inizio del codice...

TorpedoBlu
19-05-2005, 09:16
si fatto, bene ho fatto una pagina logout che serve a sloggare l'utente e rimanda semplicemente alla pagina di login.

UnLimiTs
22-06-2005, 10:37
TorpedoBlu...... per usare l'istruzione header..... devi usare i buffer...
é normale che nn ti funziona il relink..... :D

Se non sai come si usano i buffer ti do qualche spiegazione in+

DarkMic
22-06-2005, 23:11
sono interessato al discorso puoi spiegare il funzionamento del buffer

grazie

UnLimiTs
23-06-2005, 00:10
Caro dark...

Cercherò di spiegarti in maniera + semplice possibile il funzionamento dei buffer.

Come tu saprai la pagina php quando viene chiamata dal server http, si mette in comunicazione con il servente php tante volte quante sono le istruzioni contenute nella pagina php. In poche parole IL SERVENTE PHP RICEVE TANTI INPUT tante volte quante sono le istruzioni presenti nel tuo codice......

Da qui capirai... che una grossa pagina da l'output verso il servente php una miriade di volte.... e ciò potrebbe rallentare notevolmente la velocità di visualizzazione della pagina.... xkè c'è uno scambio di dati elevato.... PER UN SEMPLICE SERVER WEB.

I buffer sono stati creati appunto per evitare questo piccolo inconveniente.

I buffer funzionano come degli intermediari tra il server http e il servente php.
Il buffer deve necessariamente essere startato all'inizio del codice con la funzione ob_start();

Tutte le istruzioni che sono dopo questa funzione non inviano + input al server php ma vengono salvate in memoria...... e viene emesso un unicio input alla chiusura del buffer.... con la funzione ob_end_flush();

Questo metodo riduce il numero degli input e quindi aumenta la velocità di creazione della pagina.

Inoltre alcune istruzioni come header necessitano di essere eseguite al primo input...... e con i buffer il problema è risolto...

Spero sia stato tutto chiaro... se hai qualche altra domanda da farmi... posta:)

DarkMic
23-06-2005, 10:18
sei stato chiarissimo. grazie del tuo intervento

cicoandcico
23-06-2005, 13:39
una domanda... quindi se faccio:

ob_start();
print "gyg";
header('Location:a.php');
ob_end_flush();

l'header funziona?

UnLimiTs
23-06-2005, 15:13
si. perfettamente :)

cicoandcico
23-06-2005, 18:47
thanks ;)

TorpedoBlu
26-06-2005, 13:28
wow, grazie per l'intervento! io avevo risolto mettendo l'header all'inizio.