Newsgroup: it.comp.www.php
Titolo: problemi con le sessioni

ciao a tutti,
sto creando una pagina di login ma ho un errore che non dovrebbe
presentarsi e nn lo riesco a correggere.
il problema, se copiate il codice è alla riga 65, è che quando faccio
la rigenerazione dell'id di sessione per evitare eventuali attacchi
php mi dice che ho già usato un header e quell'operazione non può
essere fatta.
vi posto il codice integrale della mia pagina
<?php
//Start session
	session_start();
//includo il file con i dati per la connessione al db
	require_once('comuni/connessione_up.php');
//creo un array dove inserire gli errori
	$errmsg_arr = array();
//flag per gli errori
	$errflag = false;
//connessione al db server
	$link = mysql_connect(DB_HOST, DB_USER, DB_PASSWORD);
	if(!$link) {
		die('Connessione al server fallita: ' . mysql_error());
	}
//Select database
	$db = mysql_select_db(DB_DATABASE);
	if(!$db) {
		die("Impossiblile collegarsi al DB");
	}
//funzione per pulire i dati del form da possibili tentativi di
sqlinjection
	function clean($str) {
		$str = @trim($str);
		if(get_magic_quotes_gpc()) {
			$str = stripslashes($str);
		}
		return mysql_real_escape_string($str);
	}
//invio i dati ricevuti dal form alla funzione clean
	$login = clean($_POST['utente']);
	$password = clean($_POST['password']);
//contriollo se i campi sono vuoti
	if($login == '') {
		$errmsg_arr[] = 'Login ID missing';
		$errflag = true;
	}
	if($password == '') {
		$errmsg_arr[] = 'Password missing';
		$errflag = true;
	}
//se sono stati riscontrati errori reinvio l'utente alla pag
principale
	if($errflag) {
		$_SESSION['ERRMSG_ARR'] = $errmsg_arr;
		session_write_close();
		header("location: index.php");
		exit();
//creo la query per il controllo se id e pwd sono corretti
	$qry="SELECT * FROM users WHERE username='$login' AND
password='$password'";
	$result=mysql_query($qry);
//controllo se id e pwd sono corretti
	if($result) {
		if(mysql_num_rows($result) == 1) {
			//login corretto
			session_regenerate_id();
			$member = mysql_fetch_assoc($result);
			$_SESSION['SESS_MEMBER_ID'] = $member['id_usr'];
			$_SESSION['SESS_NAME'] = $member['fullname'];
			$_SESSION['SESS_ADMIN'] = $member['administrator'];
			session_write_close();
			header("location: index.php");
			exit();
		}else {
			//login fallito
			header("location: index.php");
			exit();
		}
	}else {
		die("Query fallita");
	}
?>

 essere fatta.
Probabilmente ti dice "Warning: Cannot modify header information - headers
already sent" (mai, MAI, tradurre o parafrasare i messaggi d'errore quando si
chiede aiuto, MAI!)
Nel qual caso devi mettere il tuo codice prima che qualsiasi output venga
inviato al client. Verifica anche che non ci siano righe bianche dopo la
chiusura del codice PHP nei file che includi.
Ciao,
luigi
-- 
/
+--[Luigi Rosa]--
\
Hackers know all the right MOVs.

 chiusura del codice PHP nei file che includi.
il file login.php è quello che ho postato, non ci sono altre righe di
codice, non ci sono include ecc. l'unica cosa che importa un header è
questa: header("location: index.php"); qualche riga più sopra, ma è
dentro un if in cui entro solamente in caso di errore.
se pensi che il problema sia quell'if ho anche provato a mettere
dentro un else tutto il codice rimanente ma senza successo.
grazie mille
andrea

 login.php on line 65
"headers already sent" e' un messaggio che compare quando tu invii qualcosa al
client (echo, print, righe bianche prima/dopo i delimitatori PHP...)
Devi tracciare quel che succede PRIMA della riga 65 e beccare cosa invia un
output (diverso ovviamente dalla funzione header() che per se non invia un
output nel senso in cui la parola "output" e' usata qui), incluse anche delle
righe bianche fuori dai delimitatori PHP (sono le piu' insidiose).
Ovvio che qualsiasi warning o errore emesso da PHP prima della riga 65 provoca
il warning che hai segnalato.
Ciao,
luigi
-- 
/
+--[Luigi Rosa]--
\
Good day for a change of scene. Repaper the bedroom wall.

 questa: header("location: index.php");
Il tuo problema non e` quali e quanti header imposti. Il problema e` che 
appena c'e` un carattere in output, gli header vengono chiusi e non ne 
puoi piu` inviare, quindi la regenerate_session_id() non puo` inviare il 
suo cookie al browser.
Bye.


grazie per il suggerimento, l'errore era proprio li.
comunque, il non mettere il tag di chiusura secondo voi è teoricamente
scorretto???
questo perchè il sito che sto facendo è un progetto per un esame
universitario e non vorrei che il prof me lo consideri come errore
grazie a tutti
andrea


 universitario e non vorrei che il prof me lo consideri come errore
IMHO tralasciare di chiudere qualsiasi tag o similare porta a comportamenti che
potrebbero risultare inaspettati. E' un po' come ignorare i warning del compilatore.
Ciao,
luigi
-- 
/
+--[Luigi Rosa]--
\
Heisengberg might have been here.

 universitario e non vorrei che il prof me lo consideri come errore
Dipende cosa ne pensa il professore.
Quel trucchetto e` esplicitamente suggerito da Zend stessa nella 
documentazione di Zend Framework.
Bye.

 ha scritto nel messaggio 
news:762gk0F...@mid.individual.net...

La regola vuole che ad ogni tag di apertura ne corrisponda uno di chiusura. 
Mettilo sempre. Il tuo prof lo considererà un errore.
 

 chiusura. Mettilo sempre. Il tuo prof lo considererà un errore.
Beh, potremmo estendere il discorso al fatto che ad ogni open() ci vuole 
una close(), e che ad ogni mysql_connect() serve una mysql_close() e ad 
ogni session_start() va accoppiata una session_write_close().
Sarei curioso di sapere quanti qui dentro chiudono regolarmente ogni 
risorsa che aprono. :)
E se il prof considera un errore la loro mancanza (dovrebbe, se questo e` 
l'unico corso di programmazione di quella scuola).
Questi sono "errori" molto piu` gravi della mancanza di ?> alla fine di 
un file, visto che l'interprete comunque in tutti i casi li chiude da 
solo, e in piu` il mancato tag di chiusura protegge da problemi come 
quello degli headers already sent.
Io ne parlerei col prof. Oltretutto gli fai anche vedere che ti sei 
documentato e informato oltre il normale corso di studi.
Bye.

 quello degli headers already sent.
Questo e' un non-problema dal mio punto di vista in quanto sto bene attento a
non lasciare schifezze dopo la chiusura del tag e visto che l'editor mi segnala
se ci sono delle righe vuote.
Ciao,
luigi
-- 
/
+--[Luigi Rosa]--
\
Una rosa senza spine e` wireless?

 quel cavolo che vuole.
Sono esattamente la stessa cosa. L'interprete chiude sia l'uno che l'altro:
http://www.php.net/manual/en/language.basic-syntax.instruction-
separation.php
Note: The closing tag of a PHP block at the end of a file is optional, and 
in some cases omitting it is helpful when using include()  or require(), 
so unwanted whitespace will not occur at the end of files
Bye.