Ciao Mathis, secondo me hai capito ma c'è qualcosa che ti sfugge, provo a vedere se riesco a fare un pò di chiarezza, il codice è giusto fino ad un certo punto poi qualcosa si "ingrippa" :)
Partiamo per ordine, alcune cose già le saprai e sarò ripetivo.
Quando facciamo una chiamata Ajax cioè una richiesta XMLHttpRequest che sia sincrona (in Ajax async : false sotto url: o dove vuoi prima del success, o con funzioni di call back) o asincrona (di default Ajax o async:true, non so se in Ajax 2 c'è ancora l'async mi sa che la sincrona si gestisce solo con la call back ma posso sbagliare ma mi sa che l'hanno deprecato l'async) non facciamo altro che inviare dei dati e ricevere una risposta, da javascript dobbiamo gestire la risposta del php, e fin qui ci siamo, tu hai scritto bene cioè la response può essere 1 o 0(a dire il vero potrebbe anche essere die("Connection failed: " . $connect->connect_error) ma tralasciamo e preoccupiamoci della richiesta).
Quindi cosa succede, dopo che hai chiamato la funzione javascript che si occupa della richiesta XMLHttpRequest inviata alla tua pagina PHP, il parser che interpreta il PHP parte a leggere da inizio file, dalla riga 1 e legge riga per riga, fa la connessione e la connessione(va tutto bene) va a buon fine entra nell'if di buon fine di connessione recupera in POST(Ed è giusto perchè hai impostato in Ajax type:POST) i valori di email password last_name e first_name che sono giusti perchè li hai impostati così da Ajax:
Codice:
first_name: $('#first_name').val(),
last_name: $('#last_name').val(),
email: $('#email').val(),
password: $('#password').val()
Il parser continua a leggere e va avanti e fa la select dell'utente tramite email poi cosa fa?Conta quanti risultati ci sono se ce ne sono almeno uno perchè hai scritto
Codice PHP:
if($num>0){
echo 1;
}
RISPONDE AD AJAX ECHO 1 cioè risponde 1 questo vuol dire che la function(response){ response==1} in questo caso, quindi ha già dato una risposta al client, perchè quando trova un print o un echo, tu stai facendo un httpRequest il PHP appena trova un print o un echo risponde ad Ajax e la variabile che inserisce dentro la success:function(VARIABILE) la VARIBILE è il print del PHP...in questo caso 1.
Quindi per ogni query $query="SELECT * FROM users WHERE email='$email'"; maggiore di zero cioè trova 1 utente risponde 1 ad Ajax, hai già finito...
Andiamo avanti mettiamo il caso in cui non trova risultati, ok entra dentro l'if se l'email è valida, perfetto, giusto, cosa fa?Prepara la query di insert, se inserisce risponde 0 ad Ajax...Quindi la tua response == 0.
Mettiamo caso fallisce l'inserimento risponde ancora 1.
Se invece fallisce la validate email risponde ancora 1, ma allora la mia domanda è COME FAI A GESTIRE NEL CLIENT, A CAPIRE SE E' FALLITA LA QUERY DI INSERIMENTO O SE E' FALLITA LA VALIDATE EMAIL?
Perchè il php risponde sempre 1 in tutti e due i casi.
Quindi dal php ci gestiamo un codice di riconoscimento per tutti i vari casi e SOPRATTUTTO ogni volta che printiamo una risposta per ORDINE di scrittura codice INSERIAMO UN EXIT;
Il dubbio poi mi viene perchè in Ajax hai scritto
Codice:
if(response == 0)
window.location.replace("index.php");
else if(response == 1)
/* FAI QUESTO */
else
/*FAI ALTRO*/
}
Quindi se PHP printa 0 cioè nel caso in cui ci sia un utente con mail, in quel caso risponde 0 oppure se la query di inserimento è andata a buon fine, quindi ha superato il primo step di num_rows >0 ed ha fatto la query di inserimento.
Ma tu dal PHP hai messo come risposte 1 o 0 quindi non capisco questo
else
/*FAI ALTRO*/
Non ci entrerà mai li dentro....
Quindi, questo è un buon esempio per imparare a gestire le risposte, tu mi potrai chiedere ehh va behh FractalCosmo ma se devo printare un template intero oppure una risposta dal PHP con 50 variabili e poi gestirle in Javascript come faccio?Allora Ajax non serve a niente? :)
No no serve serve, è molto semplice la risposta è buona norma gestirla con una concatenazione(se non lo usi scaricati firebug plugin per Firefox e guarda sempre attivando la console di Firebug(f12) la risposta che ottieni dal PHP, perchè con firebug riesci a vederla bene, così almeno sai in che punto sei), concatenazione di valori suddivisi da una barra | barra verticale.
L'unico problema che si potrebbe riscontrare concatenando una risposta un pò complessa è che alcuni browser(anche firefox) gestiscono poi a modo loro le new line e delle volte la risposta non viene stampata, ma non perchè il codice è sbagliato ma perchè non viene interpretato bene l'html.Poi ti metto il codice che gestisce questo, tu prendilo per buona norma, ovviamente non serve sempre però delle volte si, nel tuo caso ad esempio non serve ma io te lo inserisco lo stesso.
Quindi ricapitolando dovremmo ordinare un pò il codice, ti butto giù uno schizzo che poi ti personalizzi, cosa faccio?Ad ogni if ed ELSE inserisco la risposta, un codice che mi invento io adesso, che poi gestisco lato client, però ti concateno i valori in modo che tu possa capire bene la gestione.
Quindi il PHP lo modificherei in questo modo
Codice PHP:
if ($connect->connect_error) {
die("Connection failed: " . $connect->connect_error);
}
else{
$first_name= trim(stripslashes(htmlspecialchars($_POST['first_name'])));
$last_name= trim(stripslashes(htmlspecialchars($_POST['last_name'])));
$email = trim($_POST['email']);
$password= md5($_POST['password']);
$query="SELECT * FROM users WHERE email='$email'";
$result = $connect->query($query);
$num=$result->num_rows;
if($num>0){
//Conceteniamo le nostre risposte qui potremmo inserire anche 50 variabili che ci servono divise dalla barretta
$msg = '00'.'|';
$msg .= "Ci sono già utenti con questa email, spiacente non puoi proseguire";
//Questo replace ripulisce se ci dovessero essere dei line break rimuove gli spazi inutili
$msg = str_replace("\n", "", $msg);
$msg = str_replace("\r", "", $msg);
print $msg;
exit;
}
else{
if(filter_var($email, FILTER_VALIDATE_EMAIL)){
$query="INSERT INTO users (first_name, last_name, email, password) VALUES ('$first_name', '$last_name', '$email', '$password')";
if($connect->query($query)){
$msg = '11'.'|';
$msg .= "Inserimento nella tabella utenti avvenuto con successo";
//Questo replace ripulisce se ci dovessero essere dei line break rimuove gli spazi inutili
$msg = str_replace("\n", "", $msg);
$msg = str_replace("\r", "", $msg);
print $msg;
exit;
}
else{
$msg = '22'.'|';
$msg .= "Inserimento nella tabella utenti FALLITO";
//Questo replace ripulisce se ci dovessero essere dei line break rimuove gli spazi inutili
$msg = str_replace("\n", "", $msg);
$msg = str_replace("\r", "", $msg);
print $msg;
exit;
}
}
else{
$msg = '33'.'|';
$msg .= "Email non valida";
//Questo replace ripulisce se ci dovessero essere dei line break rimuove gli spazi inutili
$msg = str_replace("\n", "", $msg);
$msg = str_replace("\r", "", $msg);
print $msg;
exit;
}
}
}
Il Javascript ovviamente deve gestire la risposta che riceverà dal server, se noi facciamo funcion(response) e poi response=='00' è impossibile lui va in errore perchè la risposta è 00|Ci sono già utenti con questa email, spiacente non puoi proseguire , quindi splittiamo la risposta ed il nostro 00 sarà response[0] il resto sarà response[1]
Javascript codice:
Codice:
$.ajax({
type: "POST",
url: "[url]/check_reg.php",
data:{
first_name: $('#first_name').val(),
last_name: $('#last_name').val(),
email: $('#email').val(),
password: $('#password').val()
},
success: function(risposta){
//Ripuliamo anche qui come nel php gli accapo line break
dati = risposta.replace(/(\r\n|\n|\r)/gm,"");
//Se dati è >0 controllo di coerenza di logica sarà sempre >0 perchè una risposta ce l'avra dal PHP
if (dati.length > 0){
//Dividiamo la nostra stringa di risposta, splittiamo
dati = risposta.split('|');
//Siamo nel caso di num_rows >0
if (dati[0]=='00'){
alert(dati[1]);
window.location.replace("index.php");
return;
}
//Siamo nel caso Inserimento avvenuto con successo e nell'Alert ci sarà inserimento avvenuto con successo
if (dati[0]=='11'){
alert(dati[1]);
return;
}
//Inserimento fallito
if (dati[0]=='22'){
alert(dati[1]);
return;
}
//Email non valida
if (dati[0]=='33'){
alert(dati[1]);
return;
}
}
}
error: function(){alert('Errore di connessione con il server')}
});
Spero di esserti stato utile ed aver fatto un pò di chiarezza, non ho visto il resto dell'html mi sono soffermato sulla logica di chiamata, a sboccio non vedo errori nel PHP anche se un bind dei parametri andrebbe fatto, perchè sai se inserisci una password ed una mail sarebbe meglio, secondo me, fare un bind dei parametri ed un prepared statment.
Ciao buon proseguimento.