Oppure

Loading
16/03/12 20:37
luigi7
Salve, ho questo codice che ho scritto per verificare se l'id e quello che esiste nel database e la key lo stesso solo che non fa quello che deve fare...

Esempio se io modifico manualmente la key=99090909090 ... mi dovrebbe dire chiave non esistente.. ed se io modifico id=30 deve dare ID non esiste.e viceversa..

però questo non fa come deve fare.. ed io non sono capace.

vi metto il codice un po scritto male perché sto provando e poi dopo lo faccio a modo.

Codice:PHP con MySQLi

	<?php
	require_once(dirname(__FILE__) . '/../inc.php');
	require_once(dirname(__FILE__) . "/../template/".$template_client."/header.php");
	
	
		$id = (int)$_GET["id"];
	
		$key = $_GET['key'];
		
		$query = $db->Query("SELECT * FROM utenti WHERE id = '".$id."' and pass_activationhash='".$key."'");
		
		if(empty($id)) {
			echo "ID non specificato";
	}elseif(empty($key))
	{
				echo "KEY non specificato";
	}
			   
				   
	else
	{        $row=$query->fetch_assoc(); 
	
				if($row['temp_pass_active']==1){ 
					$msg =   'La tua password  risulta gi&agrave; attivo.!<br>'; 
				} 
			   elseif($row['pass_activationhash']!=$key){ 
					$msg ='Chiave di conferma non corrispondono!'; 
				} 
				
			   else
			   {
			
				
					$db->query("UPDATE utenti SET pass='".$row["temp_pass"]."', temp_pass_active=1 WHERE id=".$id." and pass_activationhash='".$key."'")  or die($db->error); 
					$msg ='Congratulazione La tua passsword  &egrave; valida'; 
				  
				} 
	   }
		 
		
		if ( isset ( $error ) )	{ echo '			<p class="error">' . $error . '</p>' . "\n";	}	
		if ( isset ( $msg ) )	{ echo '			<p class="msg">' . $msg . '</p>' . "\n";	} else {}
		
		require_once(dirname(__FILE__) . "/../template/".$template_client."/footer.php");
	?>
aaa
17/03/12 9:51
bububs
Ma la key e l'id sono auto_increment all'interno del database?
aaa
17/03/12 10:41
luigi7
no l'autoincrement e solo la ID e la key è un varchar(255)..

è cosi:
CREATE TABLE `utenti` (
`id` bigint(8) unsigned auto_increment,
`temp_pass_active` int NOT NULL default '0',
`pass_activationhash` varchar(255),

etc...

e l'id è auto increment come dici tu.


mi protesti dire come mai gli if ed else non fanno il suo dovere?

Grazie mille.
aaa
17/03/12 10:58
bububs
Il perché è dato dalla conversione in intero dell'id.
La funzione empty()funziona solo con le stringhe e non con gli interi; per questo i controlli degli if non vanno.
Detto cio', modifica il tuo codice come segue:
[b]$id = $_GET["id"]; // quindi è una stringa![/b]


Mentre per verificare l'esistenza dell'id, siccome sono interi, basta usare una query tipo questa:
limit 1 ORDER BY id DESC

oppure
max()

Così da ottenere l'ultimo id e confrontare se rientra nell'intervallo delle tuple presenti nel tuo database.
Qualora ti servisse il valore intero dell'id hai 2 metodi:
- o crei una nuova variabile a cui assegni il suo valore intero (righe di codice sprecate secondo me)
-oppure applichi la conversione in intero alla stessa variabile, cioè $id (consigliata da me) :rofl:

Detto questo spero tu abbia risolto :k:
Ultima modifica effettuata da bububs 17/03/12 11:00
aaa
17/03/12 12:01
luigi7
si ho capito.. ed ho risolto..riscrivendo il codice:

per me non faceva l'if else if perché essendo che avevo già convalidato la
password e non faceva eseguire le altre if.. invertendo la posizione ora funziona.

dimmi se va bene.. (ps : sto imparando seriamente ad usare php/mysql)


<?php
	require_once(dirname(__FILE__) . '/../inc.php');
	require_once(dirname(__FILE__) . "/../template/".$template_client."/header.php");
	
	
		$id = (int)$_GET["id"];
	
		$key = $_GET['key'];
		
		$query = $db->query("SELECT * FROM utenti WHERE id = '".$id."'");
		
		if($row = $query->num_rows ==1)
		{
			$row=$query->fetch_assoc(); 
			if($row['pass_activationhash']!=$key)
			{
			$error = "La chiave per questo utente non coincide con la nostra nell'archivio dati";
			}
					
			elseif($row['temp_pass_active']==1)
			{
				$error = 'La password &egrave; stata convalidata';
			}
		
			else
			{
$db->query("UPDATE utenti SET pass='".$row["temp_pass"]."', temp_pass_active=1 WHERE id=".$id." and pass_activationhash='".$key."'")  or die($db->error); 
				$msg = 'Congratulazioni!!';
			}
		}
		else {
		
			$error = 'User not found !';
		
		}

		if ( isset ( $error ) )	{ echo '			<p class="error">' . $error . '</p>' . "\n";	}	
		if ( isset ( $msg ) )	{ echo '			<p class="msg">' . $msg . '</p>' . "\n";	} else {}
		
		require_once(dirname(__FILE__) . "/../template/".$template_client."/footer.php");
	?>


quindi per fare i controlli dei parametri vuoti come devo fare..

io usavo empty perché avevo letto che se non c'è nessun parametro facevo apparire un messaggio..

per caso l'id è is_numeric($id)?

grazie mille e buona giornata.
aaa
17/03/12 17:46
bububs
Nel codice da te inserito c'è questa variabile di nome $error, giusto?
E alla fine vai a controllare se è stata settata. Ma si nota subito che in qualunque caso verrà settata tranne la sua unica eccezione, ovvero quando si fanno le cose correttamente. Anche perchè l'else vuoto è inutile perchè non serve a nulla.
Un'altra cosa, ho visto la documentazione ufficiale e ho potuto notare che riguardo al caso dell'empty, essa ritorna il valore booleano FALSE nei seguenti casi:

-"" (stringa vuota)
-0 (il valore 0 come intero)
-0.0 (il valore 0 come float)
-"0" (il valore 0 come stringa)
-NULL
-FALSE
-array() (un array vuoto)
-var $var; (una variabile dichiarata, ma senza alcun valore assegnato nella classe)

Perciò sistema il codice in questa maniera:
//crea la variabile stringa $msg all'inizio del codice con valore tra uno di  quelli proposti sopra. (ti consiglierei stringa vuota o null)
//Userai questa come contenitore di tutti i tuoi messaggi riferiti all'utente per segnalare qualunque problema.
$msg = "";
.....
if ( !empty( $error ) ) { echo '                        <p class="error">' . $error . '</p>' . "\n";    }      
else   { echo '                        <p class="msg">CONGRATULAZIONI!!!</p>' . "\n";        } 
Ultima modifica effettuata da bububs 17/03/12 17:50
aaa