controllo dati

KuroKami

Nuovo Utente
18 Mar 2014
4
0
0
salve a tutti :)
sto sviluppando uno script di registrazione in html, php js e ovviamente mysql
praticamente, non posto tutto il codice, solo la parte inerente al problema, nel form di registrazione ho messo dei controlli js per quasi ogni campo, in particolare email e username, impostando l'onblur con la funzione di controllo, così:
Codice:
<tr>
        <td><b>Email*</b><br /><small>Inserisci una mail per <br />convalidare la registrazione.</small></td>
        <td><input tabindex="0" id="email" type="email" name="email" required="required" autocomplete="on" onblur="emailControl()" /></td>
        <td class="error" id="errorEmail"></td>
</tr>
nella 3a colonna della tabella js mi stampa una frase, a seconda se i dati immessi vadano bene o meno, ecco il codice relativo al controllo js
Codice:
function emailControl()
{
	//controllo email
	var error = document.getElementById("errorEmail");
	var emailValue = document.registrazione.email.value;
	var emailControl = /^([a-zA-Z0-9.-_])+\@([a-zA-Z0-9.-_])+\.([a-zA-Z])+$/;
	jQuery.post('control.php', {email: emailValue}, function(result)
	{	
		if (result == 'false')
		{
			error.innerHTML = "<i style='color:#F00'>l'email inserita è già in uso</i>";
			document.getElementById('email').style.border =  '1px solid #F00';
			control[5] = 0;
			return false;
		}
		else if (result == 'true' && emailControl.test(emailValue))
		{
			error.innerHTML = "<i style='color:#0F0'>email valida</i>";
			document.getElementById('email').style.border =  '1px solid #0F0';
			control[5] = 1;
			return true;
		}
		else if (emailValue.length == 0)
		{
			error.innerHTML = "<i style='color:#F00'>il campo è vuoto!</i>";
			document.getElementById('email').style.border =  '1px solid #F00';
			control[5] = 0;
			return false;
		}
		else if (!emailControl.test(emailValue))
		{
			error.innerHTML = "<i style='color:#F00'>l'email inserita non ha un formato corretto</i>";
			document.getElementById('email').style.border =  '1px solid #F00';
			control[5] = 0;
			return false;
		}
	});
}
(chiedo scusa se è un po spartano ma sono alle prime armi, e vorrei arrivare da solo, col tempo, a migliorare lo script, ma più avanti, ora è importante finire il sito e far si che funzioni)
lo script, ne commento il funzionamento anche se sapete benissimo cosa fa xD, e lo passa allo script "control.php" (che posterò sotto il codice inerente alle email) tramite jquery, e mi fa tutti i vari controlli, con la reg exp, lunghezza ecc (il vettore control[] mi serve per una procedura nello script di registrazione, è irrilevante ora)
il codice inerente alla mail è questo
Codice:
else if ($_POST['email'])
{
	$query = "SELECT * FROM utenti";
	$result = mysql_query ($query, $db) or die (mysql_error($db));
	while ($row = mysql_fetch_assoc($result))
	{
		if (strtolower($row['email']) == strtolower($_POST['email']))
		{
			echo 'false';
			break;
		}
		else
                {
		        echo 'true';
                        break;
                 }
	}
}
ora non so se ho ben compreso lo script io, ma in sostanza prendo tutti i record nel db, li assegno a result, poi assegno al vettore row tutti i dati, con un ciclo while (detto grossolanamente)
quindi il while continuerà finche ci sono assegnazioni da fare
a ogni ciclo viene eseguito un test tra la mail presente nel db, convertita in minuscolo, e la mail inserita dall'utente, anche questa convertita in minuscolo
questi invece sono i record presenti nel db (solo 2 ovvero lol)
Codice:
VALUES
(1, 0, 'kuro', 'kami', 'KuroKami', 'df70f9b975b42116ee6c0231a7e6ead0bbb283aa', '[email protected]', 'maschio', 'girasoli', 'mestre', 'anime, giochi, programmazione, GIAPPONE', 1391610367, 1391610367, '0', 1, 0, 0),
(5, 0, 'Francesco', 'Losito', 'shinigami', '7f873de4dbf9caba1cbcba9799e821148e8d8bca', '[email protected]', 'maschio', 'primule', 'venezia', 'game and anime', 1391941782, 1391941782, '0', 1, 0, 0);
quindi il ciclo sopra descritto dovrebbe ciclare 2 volte controllando entrambe le email tramite l'if
bene ho fatto uno script ugual, e solo che invece dell'if ci ho messo un echo, per vedere se prendeva tutti i valori della tabella, ebbene lo fa, ecco lo script (scritto su una pagina bianca)
Codice:
$query = "SELECT * FROM utenti";
$result = mysql_query ($query, $db) or die (mysql_error($db));

while ($row = mysql_fetch_array($result))
{
	echo strtolower($row['email']) . " ";
}
effettivamente quindi mi stampa le 2 mail
ora succede questo: quando provo a inserire le email (o anche l'user, lo script è lo stesso), se metto [email protected] (o KuroKami) lo script mi restituisce false e relativo messaggio di errore, se invece inserisco [email protected] (o shinigami) mi dice che l'user è disponibile e mi restituisce true, quindi in sostanza non lo fa nemmeno il controllo
la mia domanda, è perchè si comporta così sto maledetto?
tengo a precisare che ho controllato con gli strumenti di sviluppo di firefox cosa succede nell'esecuzione, e appunto se non immetto il primo record, control.php mi restituisce true, ho provato anche a cambiare le funzioni di fetch, a usare un for invece del while, entrambi, ma nulla
un paio di settimane fa quando funzionava lo script era davvero semplice, era così:
Codice:
$query = "SELECT * FROM utenti";
$result = mysql_query ($query, $db) or die (mysql_error($db));
$row = mysql_fetch_assoc($result);
if (strtolower($row['email']) == strtolower($_POST['email']))
echo 'false';
else
echo 'true';
e funzionava, l'ho riprovto l'altro ieri ma nada quindi ho fatto varie modifiche
spero possiate essermi di aiuto in qualche modo, grazie mille
scusate se son stato prolisso xD
 
forse non ho capito nulla ... o forse si

prova togliendo un "break" così

PHP:
		if (strtolower($row['email']) == strtolower($_POST['email']))
		{
			echo 'tovato';		// false
			break;
		}
		else
                {
		        echo 'non trovato';	// true
                }

ciao
Marino
 
già provato
ho testato lo script su IE, opera e firefox, tutti aggiornati all'ultima versione
il break server per uscire dal ciclo una volta trovato un valore false (con true non serve)
tecnicamente il ciclo parte ogni volta che si inserisce un nuovo utente e si attiva quindi la funzione di controllo
 
PHP:
while ($row = mysql_fetch_assoc($result)) {
if (strtolower($row['email']) == strtolower($_POST['email']))
  { echo 'false'; break; }
else
  { echo 'true';  break; }
}
il ciclo while con i due break viene eseguito una sola volta !!! (scusa)
quindi restituirà false solo se, per caso, email capita nel primo record del db
altrimenti restuirà sempre true
inserisci un terzo record nel db e vedrai che anche in questo caso otterrai true
se per te va bene, vuol dire che è giusto così

un paio di settimane fa quando funzionava lo script era davvero semplice, era così:

PHP:
$query = "SELECT * FROM utenti";
$result = mysql_query ($query, $db) or die (mysql_error($db));
$row = mysql_fetch_assoc($result);
if (strtolower($row['email']) == strtolower($_POST['email']))
echo 'false';
else
echo 'true';
vale lo stesso discorso precedente, la select non contiene nessuna clausola where,
quindi legge tutto il contenuto della tabella e non esegui nessun ciclo per esaminare
tutti i record letti, fai il test solo sul primo record letto,
di conseguenza credo non abbia mai funzionato a meno che tu non facessi test con un solo record

quindi, o non ho capito niente, o proprio non va, o non conoscendo assolutamente mySQL,
quest' ultimo lavora diversamente da MS SQL che uso regolarmente,
... abbandono ...
ciao
Marino
 
Ultima modifica:
PHP:
while ($row = mysql_fetch_assoc($result)) {
if (strtolower($row['email']) == strtolower($_POST['email']))
  { echo 'false'; break; }
else
  { echo 'true';  break; }
}
il ciclo while con i due break viene eseguito una sola volta !!! (scusa)
quindi restituirà false solo se, per caso, email capita nel primo record del db
altrimenti restuirà sempre true
inserisci un terzo record nel db e vedrai che anche in questo caso otterrai true
se per te va bene, vuol dire che è giusto così

nel post precedente al tuo avevo detto che il break nel true non era necessario, l'ho tolto, apparte questo il funzionamento dovrebbe essere questo:
1) inserisco un valore (email o user) nella textbox del form
2) tale valore viene passato a control.php tramite jquery, una volta che l'utente è uscito dalla textbox, grazie all'associazione della funzione di controllo all'onblur del textbox
3) control.php controlla che tipo di valore entra, se email o username, e a seconda di quello che esce esegue uno dei 2 controlli
a - username
b - email
4) control.php ricerce il valore, fa una query di richiamo, dove prende tutto il contenuto della tabella, e assegna il risultato a $result
5) il ciclo while gira fino a quando ci sono assegnazioni dalla matrice $result al vettore $row
6) dentro al ciclo while c'è un if, che controlla i valori estratti dal vettore con quelli passati con jquery immessi dall'utente, tutti in lowercase
a - se c'è una corrispondenza, l'utente non puo usare quell'username, viene stampato false, in modo che jquery possa utilizzarlo per mostrare il messaggio di errore, e un brake interrompe il ciclo
b - se non ci sono corrispondenze mostra true, come sopra, fino alla fine del ciclo
7) una volta ottenuto il risultato voluto, lo script va in standby, ni attesa di altri valori passati da jquery
8) qualora l'utente fornisse un'altra email o user, lo script verrebbe richiamato partendo da 0, quindi anche se nel processo precedente si era intrrotto, richiamandolo di nuovo riparte da 0
quindi non vorrei sbagliare qualcosa nella logica, ma non importa quante volte io inserisca un valore, il ciclo ripartirà sempre da 0 e contiunerà o fino alla fine dando true, o fino al primo false con break finale
è sbagliato quanto detto?

un paio di settimane fa quando funzionava lo script era davvero semplice, era così:

PHP:
$query = "SELECT * FROM utenti";
$result = mysql_query ($query, $db) or die (mysql_error($db));
$row = mysql_fetch_assoc($result);
if (strtolower($row['email']) == strtolower($_POST['email']))
echo 'false';
else
echo 'true';
vale lo stesso discorso precedente, la select non contiene nessuna clausola where,
quindi legge tutto il contenuto della tabella e non esegui nessun ciclo per esaminare
tutti i record letti, fai il test solo sul primo record letto,
di conseguenza credo non abbia mai funzionato a meno che tu non facessi test con un solo record

quindi, o non ho capito niente, o proprio non va, o non conoscendo assolutamente mySQL,
quest' ultimo lavora diversamente da MS SQL che uso regolarmente,
... abbandono ...
ciao
Marino

quando l'ho testato la prima volta, sia che mettevo shinigami, sia che mettevo kurokami, mi restituiva false, con lo script sopra descritto, puo sembrare strano ma succedeva
comunque grazie per l'aiuto
 

Discussioni simili