Visualizzazione risultati 1 fino 7 di 7

Discussione: [Ajax-PHP] Problemi "response"

  1. #1
    Guest

    Question [Ajax-PHP] Problemi "response"

    Ciao a tutti,
    Ogni volta lo stesso problema e vorrei capire il perché.
    Praticamente:

    check_reg.js (prende i dati dal form [lo fa], li invia alla pagina .php [lo fa], e in base al response che riceve deve eseguire qualcosa [non lo fa se viene eseguita la query di inserimento]):
    Codice HTML:
    $.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(response){
        if(response == 0)
            window.location.replace("index.php");
    else if(response == 1)
              /* FAI QUESTO */
    else
          /*FAI ALTRO*/
    }
    });
    Nel file chek_reg.php:
    Codice PHP:
    <?php
    require("../../db/config.php");
    $connect = new mysqli($host,$db_user,$db_psw,$db_name);
    // Check connection
    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){
    echo
    1;
    }
    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))
    echo
    0;
    else
    echo
    1;
    }
    else
    echo
    1;
    }
    }
    ?>
    Consigli utili?

  2. #2
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    Cosa dovrebbe fare? Manca il codice html per sapere se stai chiamando gli elementi con il giusto modo. $_POST dovrebbe almeno essere inizializzata, isset($_POST['first_name'],$_POST['last_name'],insomma tutti i dati post obbligatori); EDIT;Il cancelletto in JavaScript vuole dire che stai chiamando l' id e non l'input name.
    Ultima modifica di darbula : 14-03-2016 alle ore 21.49.51

  3. #3
    Guest

    Predefinito

    Codice HTML:
    <div class="tab-content">
            <div id="signup">
              <h1>Sign Up for Free</h1>
    
              <form method="post">
    
              <div class="top-row">
                <div class="field-wrap">
                  <label>
                    First Name<span class="req">*</span>
                  </label>
                  <input type="text" name="first_name" id="first_name" class="first_name" required autocomplete="off" />
                </div>
    
                <div class="field-wrap">
                  <label>
                    Last Name<span class="req">*</span>
                  </label>
                  <input type="text" name="last_name" id="last_name" class="last_name" required autocomplete="off"/>
                </div>
              </div>
    
              <div class="field-wrap">
                <label>
                  Email Address<span class="req">*</span>
                </label>
                <input type="email" name="email" id="email" class="email" required autocomplete="off"/>
              </div>
    
              <div class="field-wrap">
                <label>
                  Set a Password<span class="req">*</span>
                </label>
                <input type="password" name="password" id="password" class="password" required autocomplete="off"/>
              </div>
    
              <button type="submit" class="button button-block" onclick="reg()"/>Get Started</button>
    
              </form>
    Per quanto riguarda il js, inizialmente facevo così:
    Codice:
    email: email.value
    Ho cambiato per vedere se magari poteva essere questo il problema.
    Non capisco la parte del isset(). Se ti riferisci ad un controllo che i dati siano stati inseriti e tutto eseguo già il controllo altrimenti non credo di aver capito :)

  4. #4
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    $_POST viene creata solo quando invii i dati via post, ma in generale prima di chiamare una variabile si deve verificare se è definita (in realtà per questioni di sicurezza dovresti anche valutare i caratteri consentiti nelle input).Perché se abiliti gli errori vedrai i notice per gli array ad es. $_POST['first_name']; verrà sempre valutata anche quando non esiste è ciò è un errore (se la connessione al database avrà successo condizione del else). l'id è corretto, al momento sono a cena. Vedrò se avrò tempo per guardare il tuo codice. Ciao.

  5. #5
    Guest

    Predefinito

    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.
    Ultima modifica di fractalcosmo : 15-03-2016 alle ore 01.35.31

  6. #6
    Guest

    Predefinito

    Ariciao, scrivo qui che ho superato i 10000 caratteri :) Ho visto un attimo il tuo html, l'unica cosa che toglierei è quel button type="submit" e lo sostituirei con un input type="button", perchè a rigor di logica contrasta, perchè in questo modo fai un submit sincrono e poi sull'onclick fai un Ajax impostato asincrono :)..La differenza tra sincrono e asincrono è che anni fa il web era statico, quindi ogni volta che si faceva una chiamata bisognava aspettare che il server rispondesse, fondamentalmente, la chiamata asincrona permette di proseguire, quindi non aspetta che il server risponda, se tu apri facebook ed apri firebug f12 vedrai che sotto facebook fa tante di quelle chiamate da mettersi le mani nei capelli, però tu utente continui a fare quello che vuoi, quando facebook ti aggiorna le notizie e tant'altro lo fa in modo asincrono.Questo è web 2.0, il web 2.0 senza tecnologie come Ajax non esisterebbe, google adSense, Bit Torrent, e tanti altri, il tecnicismo vero e proprio del web 2.0 è Ajax, chi ti dice il contrario vuol dire che non sa cos'è il web 2.0, o meglio non conosce i tecnicismi del web 2.0.
    La differenza tra sincrono e asincrono è proprio questa se tu imposti una chiamata asincrona e non la gestisci non metti return nel javascript o semplicemente lasci proseguire il parser javascript continua l'esecuzione e l'utente continua a fare quello che vuole senza accorgersi che sotto si stanno facendo chiamate al server.

    Chi ti dice che Ajax serve solo per fare chiamate asincrone anche qui sbaglia, io personalmente con Ajax faccio tutte e due in base alle esigenze, Ajax fa un XMLHttpRequest stop che viene inserita nella $_SERVER di PHP se lo fai con il submit non hai questo nel $_SERVER di PHP:

    $_SERVER['HTTP_X_Requested_With']

    ma hai questo "REQUEST_METHOD" che può essere POST o GET.

    Ma l'http request può essere sincrono o asincrono, ovviamente rispetto al web 1.0 dove non esisteva la chiamata asincrona, NON C'ERA PROPRIO, la potenza di Ajax è enorme ed ovviamente è la tecnologia base per il web 2.0, possiamo tranquillamente dire che senza Ajax il web 2.0 non esisterebbe chi ti dice il contrario non ha studiato ;)

    Ciao

    http://www.di.unito.it/~goy/material...esiBiamino.pdf
    Ultima modifica di fractalcosmo : 15-03-2016 alle ore 02.43.38

  7. #7
    Guest

    Predefinito

    Grazie mille per la precisione con cui mi hai risposto :)
    Sembra che adesso abbia risolto :)

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •