verifica utente in db

Paperino78

Utente Attivo
30 Giu 2012
409
0
16
Milano
Buonasera, ho lacune difficoltà nel capire come poter verificare se un utente è già inserito nel db, nello specifico mail e username. qui il mio codice
PHP:
	$stmt = $mysqli->query("SELECT * FROM utenti, utenti_temp");
			if ($stmt->num_rows > 0) {

				while ($row = $stmt->fetch_array(MYSQLI_ASSOC))
				{
					//Verifico che i dati inseriti nel form non coincidano con i dati
						if ($row['username'] == $username){
							echo '<div id="errore">ATTENZIONE: Username già usato, scegline un altro. <br /></div>';
							echo "<meta http-equiv='Refresh' content='30;  URL=".htmlspecialchars($_SERVER['PHP_SELF'])."'>";

						} else if ($row['email'] == $email) {
							echo '<div id="errore">ATTENZIONE: Email già usata2, scegline un altra. <br /></div>';
							echo "<meta http-equiv='Refresh' content='30;  URL=".htmlspecialchars($_SERVER['PHP_SELF'])."'>";
						}
					}
			} else {
				$stmt = $mysqli->prepare("INSERT INTO utenti_temp (codiceconferma, nome, cognome, eta, interessi, username, password, email, domanda, risposta) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
				$stmt->bind_param ('ssssssssss', $codiceconferma, $nome, $cognome, $eta, $interessi, $username, $password, $email, $domanda, $risposta);
				$stmt->execute();
				$stmt->close();
qualcuno mi saprebbe dire se sbaglio e nel caso dove. non ne vengo a capo.
 
Bhe, premetto che non conosco molto bene l'estensione mysqli, preferisco usare le funzione standard del php per utilizzare mysql, cmq, io, invece di eseguire un while, alla ricerca dell'username e email già esistente, utilizzerei due semplice query e due semplice if.

Nella prima meta del codice verificherei se nella tabella utente esiste già l'username, in questo modo:

PHP:
$user_isset = $mysqli->query("SELECT user FROM utenti WHERE username = '$username'");

if ($user_isset->num_rows() != 0) {
   // Se ovviamente la query è identica a 1 significa che esiste già un'utente con l'username che desideri usare
}

Mentre, nella seconda parte, farei la stessa cosa anche per l'email, ovvero:

PHP:
$email_isset = $mysqli->query("SELECT email FROM utenti WHERE email = '$email'");

if ($email_isset->num_rows() != 1) {
   // Se ovviamente la query è identica a 1 significa che esiste già un'utente con l'email che desideri usare
}

In poche palore, visto che ho la possibilità di contare i record estratti da quelle query, eviterei di utilizzare il while per scansionare record per record, visto che: se l'username è già nella tabella il numero di occorrenze sarà diverso da 0.

Non so se sono io, ma non ho ben capito a cosa ti servi la tabella utenti_tmp.
 
Ultima modifica:
Ciao Paperino78

Ti condivido la pagina di registrazione che utilizzo io.
Oltre che al controllo dell'esistenza del'username e della mail fa anche il controllo della lunghezza della password, nel mio caso c'è anche la lunghezza del nome e del cognome, ma non credo ti interessi, al massimo lo commenti
Spero ti sia utile.

PHP:
<?php
// Includo la connessione al database
require('utenti/config.php');


// Se il modulo viene inviato...
if(isset($_POST['registra']))
{
    
    // Dati Inviati dal modulo
    $user =(isset($_POST['user'])) ? trim($_POST['user']) : '';    // Metto nella variabile 'user' il dato inviato dal modulo, se non viene inviato dò di default ''
    $pass =(isset($_POST['pass'])) ? trim($_POST['pass']) : '';    // Metto nella variabile 'pass' il dato inviato dal modulo, se non viene inviato dò di default ''
    $mail =(isset($_POST['mail'])) ? trim($_POST['mail']) : '';    // Metto nella variabile 'mail' il dato inviato dal modulo, se non viene inviato dò di default ''
	$nome =(isset($_POST['nome'])) ? trim($_POST['nome']) : '';	// Metto nella variabile 'nome' il dato inviato dal modulo, se non viene inviato dò di default ''
	$cognome = 	(isset($_POST['cognome'])) ? trim($_POST['cognome']) : '';	// Metto nella variabile 'cognome' il dato inviato dal modulo, se non viene inviato dò di default ''
    $lvl = "0";
	$desc_lvl = "Utente";
    // Filtro i dati inviati se i magic_quotes del server sono disabilitati per motivi di sicurezza
    if (!get_magic_quotes_gpc()) {
        $user = addslashes($user);
        $pass = addslashes($pass);
        $mail = addslashes($mail);
		$nome = addslashes($nome);
		$cognome = addslashes($cognome);
		$lvl = "0";
		$desc_lvl = "Utente";
    }
    
    
    // Controllo il Nome Utente
    if(strlen($user) < 4 || strlen($user) > 12)
        die('Nome Utente troppo corto, o troppo lungo');
    // Controllo la Password
    elseif(strlen($pass) < 4 || strlen($pass) > 12)
        die('Password troppo corta, o troppo lunga');
    // Controllo l'email
    elseif(!preg_match("/^[_\.0-9a-zA-Z-]+@([0-9a-zA-Z][0-9a-zA-Z-]+\.)+[a-zA-Z]{2,6}$/i", $mail))
        die('Email non valida');
    // Controllo il nome utente non sia già occupato
    elseif(mysqli_num_rows(mysqli_query($dbh, "SELECT user FROM utenti WHERE user = '$user' LIMIT 1")) == 1)
        die('Nome Utente non disponibile');
    // Controllo l'indirizzo email non sia già registrato
    elseif(mysqli_num_rows(mysqli_query($dbh, "SELECT mail FROM utenti WHERE mail = '$mail' LIMIT 1")) == 1)
        die('Questo indirizzo email risulta gi&agrave; registrato ad un altro utente');
	//Controllo del nome
	elseif(strlen($nome) < 4 || strlen($nome) > 20)
        die('Nome troppo corto, o troppo lungo');
	//Controllo del cognome
	elseif(strlen($cognome) < 3 || strlen($cognome) > 20)
        die('Cognome troppo corto, o troppo lungo');
  
    // Registrazione dell'utente nel database
    else
    {
        
        // Crypt della password per garantire una miglior sicurezza
        $pass = base64_encode($pass);
        
        // Query per l'inserimento dell'utente nel database
        $strSQL = "INSERT INTO utenti (user,pass,mail,lvl,nome,cognome,desc_lvl)";
        $strSQL .= "VALUES('$user', '$pass', '$mail', '$lvl', '$nome', '$cognome', '$desc_lvl')";
        mysqli_query($dbh, $strSQL) OR die("Errore 003, contattare l'amministratore ".mysqli_error());
		
        session_start();
		$_SESSION['user'] = $user;
        // Reindirizzo l'utente ad una pagina di conferma della registrazione
        header('Location: registrato.php');
        exit;
    }
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Registrazione</title>
</head>

<body>
<form action="" method="post">
  <p>
    <input name="user" type="text" id="user" value="Nome Utente" onfocus="if(this.value=='Nome Utente') this.value='';" />
  </p>
  <p>
    <input name="nome" type="text" id="nome" value="Nome Reale" onfocus="if(this.value=='Nome') this.value='';" />
    <input name="cognome" type="text" id="cognome" value="Cognome Reale" onfocus="if(this.value=='Cognome') this.value='';" />
    <br />
    <input name="pass" type="password" id="pass" value="Password" onfocus="if(this.value=='Password') this.value='';" /><br />
    <input name="mail" type="text" id="mail" value="Em@il" onfocus="if(this.value=='Em@il') this.value='';" /><br />
    <input name="registra" type="submit" value="Registrati" /><br />
  </p>
</form>
</body>
</html>
 
Bhe... ovvio che te usi il metodo che vuoi, io te lo avevo solo consigliato per evitare di scansionare la tabella record per record.

In ogni caso, cosa che mi ero dimenticato di scriverti nel mio precedente post è che: nel tuo codice, non vedo quale sia il problema, il codice ti funziona? forse non ti esegue il refresh? a prima vista sembra tutto ok.

Se forse non ti fa il refresh, credo sia normare, i meta-tag non vanno nel corpo del documento, se è quello l'errore potresti utilizzare, al posto di quel meta-tag, la funzione header() del php, occhio però che va dichiarata prima di ogni output ( prima di stampare qualsiasi cosa con echo ).

P.S.: Nel codice postato sopra da me, nella seconda if, ho sbagliato la condizione, che, doveva essere questa: $email_isset->num_rows() != 0
 
Ultima modifica:
Allora, posso dire di aver risolto in questo modo, il controllo vale sia per username sia per email.
Il markup è così:
PHP:
<input type="text" required name="username" tabindex="4" id="username" onchange="check3() "Nickname di fantasia"/>	
<span id="username_ok"></span>
da un file in js carico ajax
PHP:
$(document).ready(function(check3){
	$("#username").change(function(){
		var username2 = $('#username').val();
			$('#username').load(
			"./funzioni_ajax/chkcontatti.php",
			{username: username2},
				function(response) {
					if(response == '0'){
						$("#username_ok").html('');
					} else {
						
					$("#nicknameInfo").hide("");
					$("#username_ok").html('Username non disponibile');
					$("#username_ok").css({
					"border": "2px red solid", "margin-left": "21px",
					"-moz-border-radius": "5px 5px 5px 5px",
					"-webkit-border-radius": "5px 5px 5px 5px",
					"border-radius": "5px 5px 5px 5px",
					"padding":"0 5px"
					});
				$("#username_ok").val("");
			}
		});
	});
});

ed infine con il php elaboro e restituisco il risultato
PHP:
$link = mysqli_connect('localhost', 'root', 'user', 'db');

if(isset($_REQUEST["username"])) $username2 = $_REQUEST["username"];

$query="SELECT username FROM utenti_temp WHERE username='$username2'";

$result=mysqli_query($link,$query);
if(mysqli_num_rows($result)>0)
{
	echo '1';
}
else
{
	echo '0';
}

questo per chi volesse prendere spunto. Con il codice in js faccio apparire un div con l'avviso ed elimino un altro elemento per il controllo della compilazione dei campi(#nicknameInfo). Il problema che invece mi trovo adesso è che se clikko su invia i dati il form ovviamente non parte se i campi non sono compilati tutti ma a fianco del div di controllo ajax mi appare l'elemento del controllo campi (#nicknameInfo) che avendo il valore inserito nel tag input mi crea casino. Come posso svuotare il campo input dove inserisco username dopo aver fatto il controllo in ajax?
 
Il campo input l'ho reso vuoto in questo modo
PHP:
$("id_del_mio_input").val("");

Rimane attivo l'altro problema.
 

Discussioni simili