Visualizzazione risultati 1 fino 10 di 10
Like Tree2Likes
  • 1 Post By darbula
  • 1 Post By darbula

Discussione: Modulo di login con prepared statement

  1. #1
    Guest

    Predefinito Modulo di login con prepared statement

    Salve a tutti sto cercando di includere i prepared statement nella
    pagina php del mio form di login ma sto avendo qualche problema
    (premetto che sono un principiante)più che una soluzione bella e pronta da copia e incolla
    se possibile preferirei che qualcuno mi spiegasse dove e perche ho sbagliato.
    Vi posto la pagina php collegata al form
    Codice PHP:

    <?php
    //recupero i dati dai campi del form
    $user = $_POST['user'];
    $pwd = $_POST['pwd'];
    // Connessione al database
    $mysqli = new mysqli('localhost', 'sitodiprova1927', 'la mia pasword', 'my_sitodiprova1927');
    if (
    $mysqli->connect_error) {
    die(
    'Errore di connessione (' . $mysqli->connect_errno . ') '
    . $mysqli->connect_error);
    }

    $password = hash('sha256', $pwd);//Creazione dell'hash perche nella registrazione tutte le password vengono salvate cosi per sicurezza

    //Qui entrano in gioco i prepared statement credo che il problema sia da qui in poi.
    $query = $mysqli->prepare("SELECT * FROM login WHERE user = ? AND password = ?");
    $query->bind_param('ss',$user,$password);
    $result = $query->execute();

    if(
    $result->num_rows) {
    echo
    "Accesso consentito";
    } else {
    echo
    "Accesso rifiutato";
    }

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

    Predefinito

    Ciao quando posti un messaggio specifica anche il tipo di errore o non leggo alcun errore..
    Allora lo script a prima vista sembra corretto!! Hai creato la tabella login con i campi o anche dette colonne di tipo stringa con il nome user e l'hash della password?
    PS. Attacca uguale e punto interrogativo alle colonne.
    @maznella la variabile $password è definita ed è anche giusta poiché contiene l'hash della password.
    EDIT: dopo $query->execute(); //no variabile $result
    if($query->bind_result($col1,$col2)) {
    //Se è vera
    while ($query->fetch()) {
    //attento che $user se non dichiarato unico non ritorna un solo valore (possono esistere più user con lo stesso nome)
    printf("%s %s\n",$col1,$col2);
    }
    $query->close();
    }
    $mysqli->close();
    @maznella ha ragione.
    EDIT2: SELECT * (ritorna tutte le colonne non solo user e password)
    http://php.net/manual/en/mysqli-stmt.bind-result.php
    http://php.net/manual/en/mysqli-stmt.fetch.php
    Ultima modifica di darbula : 14-09-2017 alle ore 21.21.25
    sitodiprova1927 likes this.

  3. #3
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Controlla sempre i valori di ritorno delle chiamate, ti diranno se e cosa non va.

    In questo caso, ad occhio mi sembra che il problema sia che la variabile $password non sia definita, probabilmente intendevi $pwd. Inoltre, dovresti chiamare store_result prima di num_rows.

    Non è fondamentale, ma in qualche modo aiuta ad imparare: chiama le cose con il loro nome. Il risultato di $mysqli->prepare non è una query, ma un prepared statement, o più semplicemente statement, quindi potresti chiamarlo $statement o $stmt per maggiore chiarezza.

    Codice PHP:
    $stmt = $mysqli->prepare("SELECT * FROM login WHERE user = ? AND password = ?");
    if (!
    $stmt) {
    echo
    "Prepared failed: " . $mysqli->error;
    }

    $stmt->bind_param('ss', $user, $pwd) or die("Binding parameters failed: " . $stmt->error);

    $result = $stmt->execute();
    if (
    $result === false) {
    echo
    "Execute failed: " . $stmt->error;
    }

    $stmt->store_result();

    if (
    $stmt->num_rows > 0) {
    echo
    "Accesso consentito";
    } else {
    echo
    "Accesso rifiutato";
    }
    Ultima modifica di mzanella : 14-09-2017 alle ore 20.08.36 Motivo: Corretto il tag del codice

  4. #4
    Guest

    Predefinito

    Salve a tutti chiedo scusa se non sono stato preciso nel spiegare il mio problema ho aggiornato
    lo script php con il codice postato da mzanella e ho attaccato i punti interrogativi e i segni uguale alle colonne come suggerito da darbula, l'errore che mi da è il seguende
    Prepared failed: Table 'my_sitodiprova1927.login' doesn't exist
    Fatal error: Call to a member function bind_param() on boolean in /membri/sitodiprova1927/login/logins.php on line 19
    di seguito posto il codice della pagina php di login GRAZIE DELLA VOSTRA ATTENZIONE
    Codice PHP:
    <?php
    //recupero i dati dai campi del form
    $user = $_POST['user'];
    $pwd = $_POST['pwd'];
    // Connessione al database
    $mysqli = new mysqli('localhost', 'sitodiprova1927', 'la mia password', 'my_sitodiprova1927');
    if (
    $mysqli->connect_error) {
    die(
    'Errore di connessione (' . $mysqli->connect_errno . ') '
    . $mysqli->connect_error);
    }

    $password = hash('sha256', $pwd);

    $stmt = $mysqli->prepare("SELECT * FROM login WHERE user=? AND password=?");
    if (!
    $stmt) {
    echo
    "Prepared failed: " . $mysqli->error;
    }

    $stmt->bind_param('ss', $user, $pwd) or die("Binding parameters failed: " . $stmt->error);

    $result = $stmt->execute();
    if (
    $result === false) {
    echo
    "Execute failed: " . $stmt->error;
    }

    $stmt->store_result();

    if (
    $stmt->num_rows > 0) {
    echo
    "Accesso consentito";
    } else {
    echo
    "Accesso rifiutato";
    }

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

    Predefinito

    La tabella di login e i campi stringa user e password non esistono..Prepared
    failed: Table 'my_sitodiprova1927.login' doesn't exist
    Non capisco il secondo errore però.. EDIT:non c'é il die() (blocco esecuzione codice) in mysqli->error Cmq.. In fase di inserimento (INSERT INTO o UPDATE) e recupero (SELECT) dovresti passare il nome dell'user e l'hash della password $password = hash('sha256', $pwd) // ovviamente $pwd sarà definita prima di passarla alla funzione hash.
    Ultima modifica di darbula : 15-09-2017 alle ore 14.29.50

  6. #6
    Guest

    Thumbs up

    Citazione Originalmente inviato da darbula Visualizza messaggio
    La tabella di login e i campi stringa user e password non esistono..Prepared
    failed: Table 'my_sitodiprova1927.login' doesn't exist
    grazie darbula non mi ero accorto di aver inserito il nome dalla tabella sbagliata anche perche la tabella login
    non esiste ora lo corretta con users
    Citazione Originalmente inviato da darbula Visualizza messaggio
    Cmq.. In fase di inserimento (INSERT INTO o UPDATE) e recupero (SELECT) dovresti passare il nome dell'user e l'hash della password $password = hash('sha256', $pwd) // ovviamente $pwd sarà definita prima di passarla alla funzione hash.
    scusa darbula ma forse non ho capito questa parte del tuo messaggio perche io questa parte che mi spieghi la faccio all'inizio.
    Codice PHP:
    <?php
    //recupero i dati dai campi del form
    $user = $_POST['user'];
    $pwd = $_POST['pwd'];
    // Connessione al database
    $mysqli = new mysqli('localhost', 'sitodiprova1927', 'la mia password', 'my_sitodiprova1927');
    if (
    $mysqli->connect_error) {
    die(
    'Errore di connessione (' . $mysqli->connect_errno . ') '
    . $mysqli->connect_error);
    }

    $password = hash('sha256', $pwd); //$pwd è definita sopra
    Citazione Originalmente inviato da darbula Visualizza messaggio
    EDIT:non c'é il die() (blocco esecuzione codice) in mysqli->error
    devo inserire?
    Codice PHP:
    if (!$stmt) {
    die(
    'Prepared failed: ' . $mysqli->error);
    }
    GRAZIE MILLE :)

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

    Predefinito

    Semplicemente vuole dire che alla funzione "bind_param" devi passare $password invece di $pwd (altrimenti passi la password per com'è la inserita l'utente o meglio sanificata dall'omonima funzione che ho espresso qui sopra)..
    Il die() // può descrivere l'errore con un testo e opzionalmente le variabili ma non è obbligatorio, va usato solo per fermare l'esecuzione del codice quando si incontra un errore.. Se interrompere o no dipende anche da cosa deve fare l'applicazione (output html,json) es. pagina.php sia che avviene un errore o nessun errore debbo mostrare un outupt html ne consegue che se uso die() interrompe l'esecuzione del codice (quindi anche echo '</body>'; // spero tu sappia che vuole dire una pagina HTML com tutti i tag) quindi dovrei riscreve i tag HTML dentro die() altrimenti non ci saranno mai come output.. Altro motivo è di non dare troppe informazioni all'utente (poiché lui potrebbe usarle per compiere illeciti ecc) cioè si usa come debug e prima della pubblicazione del sito
    Ultima modifica di darbula : 15-09-2017 alle ore 21.26.46
    sitodiprova1927 likes this.

  8. #8
    Guest

    Predefinito

    Citazione Originalmente inviato da darbula Visualizza messaggio
    Semplicemente vuole dire che alla funzione "bind_param" devi passare $password invece di $pwd
    Grazie mille non so come ho fatto a non accorgermi di una cosa cosi stupida melai anche dovuta ripetere 2 volte, ora va alla grande GRAZIE ANCORA.

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

    Predefinito

    Prego figurati... Cmq. l'ho ripetuto tre volte (il primo messaggio diceva che $password è definita ed era giusta)

  10. #10
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    il primo messaggio diceva che $password è definita ed era giusta
    Colpa mia che, per errore, non l'avevo vista e pensavo non fosse definita. Chiedo scusa.

Regole di scrittura

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