Newsgroup: it.comp.www.php
Titolo: $_SESSION

Ciao a tutti...
Effettuo la connessione al mio database e avvio questo pezzo di
codice, solo che non riesco proprio a capire perchè non entra nell'if
relativo alla variabile $row che, in teoria, assume il valore della
prima colonna della riga presente nella tabella login.
//Avvio o continuo la sessione
session_start();
//Controllo che la sessione sia attiva
if(!IsSet($_SESSION['intUserID'])){
	//Controllo se l' utente vuole loggarsi
	$username = @$_POST['txt_username'];
	$password = @$_POST['txt_password'];
	//Controllo se l' username e la password non sono vuoti
	if((!strlen($username) == 0) and (!strlen($password) == 0)){
		//Effettuo il controllo dei dati
		$strSQL = "SELECT * FROM login
		                  WHERE strUser = '".$username."' AND strPass =
MD5('".$password."')";
		$result = mysql_query($strSQL);
		$row = mysql_fetch_row($result);
		//Controllo se l' utente e' stato trovato
		if(!strlen($row[0]) == 0){
			//Effettuo il login
			$_SESSION['intUserID'] = $row[0];
		}
		//Libero la memoria
		mysql_free_result($result);
	}
}
Dovrei far inizializzare la sessione e settare la _SESSION ma capisco
cosa và in crisi.
Grazie...

>                 if(!strlen($row[0]) == 0){
Perchè non fai direttamente un:
if (strlen($row[0]))
che vuol dire "se la lunghezza di $row[0] è diversa da zero"?
Oppure anche if ($row[0] != "")...
Eppoi, perchè non usi $row = mysql_fetch_array($result) che ti
restituisce un array associativo delle colonne che hai scelto con la
query?
Così invece di $row[0] (che va a farsi benedire se cambi leggermente
la query) puoi usare direttamente $row["username"] (faccio per
dire...)?


wrote:

Il problema è che non so per quale ragione ma la variabile $row torna
un valore nullo. Così come anche $row[0]. Forse potrei aver sbagliato
la query. In ogni caso la variabile $result mi da:
resource id #5
che non so cosa significa. Ho riscotrato tutto ciò inserendo degli
echo sia fuori che all'interno degli if.
Inserisco valori corretti nei campi username e password cos' le
variabili sono controllate e dovrei poter estrapolare esattamente il
record (l'unico presente) nella tabella login. Non riesco a
comprendere il problema.
Ho provato a mettere in pratica il tuo consiglio ma ho lo stesso
problema...

 anche if ($row[0] != "")...
Meglio ancora: perche` non usare mysql_num_rows() invece di andare a 
cercare un valore indefinito?
Se attivi E_STRICT tra gli errori vedrai subito un bel warning su quel $row
[0].
Bye.


mysql_num_rows($result) mi ritona valore 0 (penso perchè non individua
il record nel DB) quindi il suo funzionamente dipende dal fatto che
per ottenere un valore TRUE debba ritornare 1, quindi, dev'esserci un
problema nella query fatta sul mio DB che non trova nessun record e
che non setta la variabile $rows ad 1.
Ho ricontrollato il database è ho verificato che il record è presente.
Ricontrollando la query ho verificato anche che i parametri passati
sono esatti e rispecchiano la richiesta da effettuare.
Proprio non capisco perchè quella maledetta variabile mi ritorna 0!!!

 MD5('".$password."')";
Qui sei pericolosamente esposto a SQL injection.
Metti che io come username metto
' or true; --
e mi loggo sempre e comunque.
Il resto l'ho gia` detto. :)
Bye.


Ho capito dove si verifica il problema.
E' nella query. Dunque se io eseguo:
if((strlen($username) != 0) and (strlen($password) != 0)){
		$strSQL = "SELECT * FROM login"   // ESEGUO LA QUERY SENZA LA
CLAUSOLA WHERE
                $result = @mysql_query($strSQL);
		$row = mysql_num_rows($result);
echo '<p>val: '.$row.'</p>'; // VALORE 1. TRUE
		 if($row != 0){
			$_SESSION['id_user'] = $row;
		}
appunto, query senza where, individua l'unica record nella tabella per
forza di cose. $row mi ritorna 1 e, finalmente, la sessione ha inizio!
Quindi deve esserci qualche errore quando effettuo la ricerca nel DB
con la clausola WHERE e i parametri associati:
$strSQL = "SELECT * FROM login WHERE strUser = '$username' AND strPass
= MD5('$password')";
in questo caso la $row ritorna sempre valore 0, al contrario di prima
dove, correttamente, $row ritornava valore 0 solo nel caso i campi
della form erano vuoti e ritornava 1 in tutti gli altri casi; quindi
il database viene individuato ma i parametri di ricerca del record non
vengono soddisfatti.
Qualcuno riesce a capire il motivo?
Grazie ancora...

                 $result = @mysql_query($strSQL);
Togli sempre la soppressione degli errori, soprattutto mentre stai 
testando.
Altrimenti non ci capirai mai niente.
Bye.


Ho tolto ogni @ ma non da nessun errore. Devo percaso abilitare
qualcosa per visualizzare messaggi di errore?
Ma a te non viene in mente niente, voglio dire potresti dare una
occhiata per capire dove puo essere l'intoppo?
Mi scusa per la lungaggine ma questo è il codice al quale fa poi
riferimento lo script precedente:
if(IsSet($_SESSION['iduser']))
{
	$page = $_GET['page'];
	switch($page)
	{
		case 'amministratore':
			require_once('amministratore.php');
			break;
		case 'autore':
			require_once('autore.php');
			break;
		case 'sezione':
			require_once('sezione.php');
			break;
		case 'articolo':
			require_once('articolo.php');
			break;
		default:
			require_once('menuu.php');
			break;
	}
}else{
?>
	<form method="post" action="indexnews.php">
		<input type="text" name="txt_username"></input><br/>
	        <input type="password" name="txt_password"></input><br/>
		<input type="submit" value="Login"></input>
	</form>
<?php
}
?>

 l'intoppo?
Riempi il codice di print() e print_r() di debug. Fatti stampare la query, 
il risultato della stessa, il valore della sessione, ecc.
Nel codice non vedo errori (tranne la sql injection), ma magari nel DB i 
campi si chiamano diversamente, oppure il campo password non e` abbastanza 
grande per contenere un md5 e lo tronca, o chissa` cosa.
Bye.

 Nel codice non vedo errori (tranne la sql injection), ma magari nel DB i
Cioe`, un errore c'e`, ma logico: memorizzi il numero di righe di ritorno 
invece dell'id utente.

 grande per contenere un md5 e lo tronca.
Dipendeva proprio da questo. Grazie infinite...

 $row = mysql_fetch_row($result);
qui vai a dritto a cercare di usare un result senza controllare se
questo result esiste o meno, e non è cosa buona e giusta. Come ti
hanno già detto, usa le funzioni apposite per controllare che la
select abbia restituito almeno una riga.
E se la select non ne ritorna neanche una, non è detto che sia un
errore, magari semplicemente non c'e' niente da ritornare. Sul perchè
ho un sospetto: verifica che l'MD5 calcolato da mysql sia uguale
all'MD5 che ti aspetti di trovarci...
bye!