Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 24

Hybrid View

  1. #1

    Select (MySQL) che funziona in locale e non in remoto

    Anteprima

    Select (MySQL) che funziona in locale e non in remoto
    Salve a tutti, ho appena terminato un corso di html e sto provando a realizzare un sito perla mia associazione.

    Sto cercando di imparare ad usare PHP perche' indispensabile per gestire un minimo di dati, ma mi rendo conto che sono davvero all'ABC.

    Oggi ho avuto un problema assurdo, e dopo più di quattro ore di tentativi ho gettato la spugna.

    E' successo questo, ho trasferito il sito sul server remoto (gratuito) e uno script che funziona perfettamente in locale in remoto ha un comportamento assurdo.

    Non genera errori, semplicemente non funziona.

    Mi spiego meglio.

    Questo e' lo script :






    // se POST ha funzionato allora :




    $pass e' creata dal POST
    $email e' creata dal post



    $password = hash('sha256', $pass);
    $res=mysql_query("SELECT userId, userNome, userPass, userLevel FROM Users WHERE userEmail='$email'");

    $row=mysql_fetch_array($res);
    $count = mysql_num_rows($res);



    if( $count == 1 && $row['userPass']==$password ) {$_SESSION['user'] = $row['userId'];
    $livello = $row['userLevel'];
    $utente = $row['userId'];
    $Nome =$row['userNome'];



    }


    else {


    arriva qui che dovrebbe significare che al query non ha
    trovato l'utente.
    }

    Utilizzando echo e exit, ho controllato ed i valori di $password e $email sono esattamente ugualia quelli contenuti nel database.

    Grazie per la cortese attenzione.

    Mauro

    p.s. questo e' il mio primo messaggio in assoluto in un Forum, se in qualche modo non mi sono attenuto alle regole di comportamento mi scuso e vi prego di segnalarmelo.


    p.p.s. Lo script non frutto del mio 'ingegno' ho copiato di sana pianta, e leggendolo mi chiedo perche' chi l'ha scritto ha utilizzato :

    WHERE userEmail='$email' e non WHERE userEmail="$email" and userPass="$password"
    sicuramente esiste un motivo ..

  2. #2
    Utente di HTML.it
    Registrato dal
    Jun 2008
    Messaggi
    1,316
    1) Usa i tag per identare il codice
    2)
    p.p.s. Lo script non frutto del mio 'ingegno' ho copiato di sana pianta, e leggendolo mi chiedo perche' chi l'ha scritto ha utilizzato


    Perchè chi l'ha scritto non sa/non sapeva programmare.

    3) Per visualizzare gli errori in fase di developing abilità tutti i display_errors al massimo livello e inserisci un error_reporting(E_ALL) in cima ai file e gestisci per lo meno le query con degli errori

    4) $row=mysql_fetch_array($res);
    $count = mysql_num_rows($res);

    What?
    Questa roba estrae LA PRIMA RIGA, se hai due record nel database e disgraziatamente non sei il primo utente inserito non puoi più fare il login visto che $count sarà maggiore di 1 e $row conterrà solo il primo.

    codice:
    <?php
    
    // [...]
    
    try {
        $password = hash('sha256', $pass);
        $email = mysql_real_escape_string($email);
        $q = mysql_query('
            SELECT
                userId, userNome, userLevel
            FROM
                Users WHERE userEmail=\'' . $email . '\' AND
                userPass = \'' . $password . '\'
            LIMIT 1;');
    }
    catch (MySQLException $e) {
        $e->getMessage();
    }
    catch (Exception $e) {
        $e->getMessage();
    }
    
    if (mysql_num_rows($q) > 1) {
        echo "Loggato";
    }
    else {
        echo "Non loggato";
    }

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2008
    Messaggi
    1,316
    Non mi fa modificare il messaggio, cmq preso dalla stanchezza sostituisci: mysql_num_rows($q) > 1

    con


    mysql_num_rows($q) >= 1

    o
    mysql_num_rows($q) // 1o+ = True, 0 = False

  4. #4
    zacca94 grazie per la risposta.

    Appena possibile provo a modificare il codice come mi hai suggerito.

    Mi rendo conto di essere un principiante e proprio per questo vorrei cercare di capire cosa sto facendo, un modo per
    farlo e' porre domande e fare osservazioni che probabilmente sono stupide, sperando nell'altrui pazienza.

    Concordo con te che la query e' scritta male, ma dovrebbe comunque funzionare sempre.
    Ho verificato, e nel form di registrazione viene controllato che l' email sia unica, non possono esistere due email uguali , quindi $count sara' sempre 1 o 0 ( o null dipende dal motore del database) assolutamente vero che fare una select e aggiungere un controllo successivo tra le password e' quantomeno poco elegante, sopratutto perche' la password e' gia' disponibile.

    La cosa perche' davvero strana e' che la select, per quanto assolutamente rivedibile, funziona perfettamente in locale (MypHP) ma non funziona sul server remoto, e questo e' davvero strano, ed uso un eufemismo.

    Molti anni fa programmavo in VB6, il prototipo funzionante doveva essere efficace (funzionare) poi veniva 'efficentato' quindi
    si vedeva codice anche peggiore di quello oggetto di questo post... pero' funzionava ( on non funzionava).

    'Normale' se funziona si e no, evidentemente c'e' un problema, io credevo che quanto funziona in locale dovesse funzionare anche in remoto... evidentemente sbagliavo.

    Grazie ancora per il suggerimento, spero di poterti confermare che mi ha risolto il problema.

  5. #5
    Quote Originariamente inviata da curzio.maria Visualizza il messaggio
    Molti anni fa programmavo in VB6, il prototipo funzionante doveva essere efficace (funzionare) poi veniva 'efficentato' quindi
    si vedeva codice anche peggiore di quello oggetto di questo post... pero' funzionava ( on non funzionava).

    'Normale' se funziona si e no, evidentemente c'e' un problema, io credevo che quanto funziona in locale dovesse funzionare anche in remoto... evidentemente sbagliavo.
    [MOLTO OT]
    come il tempo obnubila i ricordi anche con VB6 (e con VB3, e con GWBasic) i programmi funzionavano in locale e poi non funzionavano dal cliente
    [/MOLTO OT]

  6. #6
    Utente di HTML.it
    Registrato dal
    Jun 2008
    Messaggi
    1,316
    Se non gestisci bene gli errori non potrai mai sapere cosa non funziona (non sempre almeno, ho anche dubbi).
    Una cosa che funziona in locale non deve per forza funzionare su un server remoto perchè la versione installata in locale potrebbe differire da quella remota o perchè la configurazione del server in remoto è differente (Ovviamente) da quella che hai in locale.

    Oltretutto ripeto se il database ha 2 record
    utente_1 | password_1 | email@primo.it
    utente_2 | password_2 | email@secondo.it

    $count = mysql_num_rows($res);
    RESTITUISCE 2.
    Quindi
    if $count == 1 sp*ttana tutto

    e $row=mysql_fetch_array($res); restituisce sempre la prima riga anche se tu tenti il log-in con la seconda...
    Ultima modifica di zacca94; 26-04-2017 a 15:47

  7. #7
    zacca94 grazie per l'attenzione e per la tua pazienza.

    Ho deciso di ripartire da zero, settando l'ambiente nel modo corretto, come hai suggerito tu.

    Entro questa settimana dovrei ricevere un manuale di PHP che ho ordinato (Missing Manual di Brett McLaughlin, un libro che ho visto al corso di HTML e che mi pare abbastanza chiaro), e solo dopo averlo letto almeno una volta riprover� a scrivere codice, intanto giochero' con HTML che quantomeno non e' 'pericoloso'.

    Quindi ho davvero apprezzato il tuo aiuto che mi ha chiarito che prima di scrivere devo imparare almeno un po' di grammatica.


    Vorrei pero' tornare su queste tue parole :

    Oltretutto ripeto se il database ha 2 record
    utente_1 | password_1 | email@primo.it
    utente_2 | password_2 | email@secondo.it

    $count = mysql_num_rows($res);
    RESTITUISCE 2.
    Quindi ...

    ecco, non sono d'accordo.
    eseguo :

    $Res=MySQL_query ("Select * from users where email=email@secondo.it)
    - non badare alla sintassi -
    $count=mySQL_num_row($res)


    se la select e' sintatticamente corretta deve quindi restituire 1 o 0
    1 se esiste un records con email=
    email@secondo.it
    0 se nel database non esiste un records con email=email@secondo.it
    un errore se la sintassi e' sbagliata.

    Sebbene avessi pochi dubbi ho cancellato i record nel db lasciandone solo 2 poi
    ho provato e in effetti il risultato e' proprio 1, ho poi aggiunto altri record e
    il risultato non e' cambiato.

    Ovviamente questo perche' quando registro l'utente controllo che l'email sia
    univoca (utilizzando una select).

    Certo non e' il metodo migliore, dovrei impostare un indice univoco sul campo e poi gestire
    l'eventuale errore ma come faccio ora e' piu' semplice, come tutto il resto del codice che utilizzo.

    Quando ero piu' giovane l'avrei definito senza dubbio spaghetti-code,... ecco perche' devo ripartire da zero.

    Grazie ancora per la tua cortesia.


    Mauro










    Ultima modifica di curzio.maria; 26-04-2017 a 20:44

  8. #8
    Utente di HTML.it
    Registrato dal
    Jun 2008
    Messaggi
    1,316
    Quote Originariamente inviata da curzio.maria Visualizza il messaggio
    ecco, non sono d'accordo.
    eseguo :

    $Res=MySQL_query ("Select * from users where email=email@secondo.it)
    - non badare alla sintassi -
    $count=mySQL_num_row($res)


    se la select e' sintatticamente corretta deve quindi restituire 1 o 0
    1 se esiste un records con email=
    email@secondo.it
    0 se nel database non esiste un records con email=email@secondo.it
    un errore se la sintassi e' sbagliata.

    Sebbene avessi pochi dubbi ho cancellato i record nel db lasciandone solo 2 poi
    ho provato e in effetti il risultato e' proprio 1, ho poi aggiunto altri record e
    il risultato non e' cambiato.

    Ovviamente questo perche' quando registro l'utente controllo che l'email sia
    univoca (utilizzando una select).


    Ovvio se metti una clausola che restituisce per forza una riga, la mia era una precisazione generale nel caso da me proposto (per esempio se non hai impostato un set di caratteri adeguato per i nickname e hai un utente che si chiama luca ed uno lùca anche se fai una select con where username='luca' ti restituirà una row con 2 elementi).
    Era solo per sottolineare la pazzia di questa riga:
    if( $count == 1 && $row['userPass']==$password )

    Che è palesemente sviluppata da uno che non solo non ha conoscenza delle potenzialità del linguaggio di PHP e MySQL ma che non ha neanche studiato su un manuale che gli ha indicato come fare una semplice ricerca univoca...


    Cordialmente, Tomas

  9. #9
    Utente di HTML.it L'avatar di luca200
    Registrato dal
    Apr 2002
    Messaggi
    4,120
    Quote Originariamente inviata da zacca94 Visualizza il messaggio
    (per esempio se non hai impostato un set di caratteri adeguato per i nickname e hai un utente che si chiama luca ed uno lùca anche se fai una select con where username='luca' ti restituirà una row con 2 elementi).
    Secondo me dovresti andarci piano con le valutazioni. Qui ti stai arrampicando sugli specchi per giustificare quello che hai scritto prima. Una query per nome utente NON PUO' restituire più di una riga, altrimenti hai un problema a monte sulla progettazione del db.
    Poi che quel codice non sia il massimo non ci sono dubbi, ma in ogni caso fare la select solo sull'utente e controllare la password a valle potrebbe essere utile per capire, in caso di errore, se il problema sta nel nome utente che non esiste o nella password sbagliata. A qualcuno potrebbe servire.

    @curzio.maria: sei in grado di postare qui l'output di phpinfo()? ho un vago sospetto...

  10. #10
    Utente di HTML.it
    Registrato dal
    Jun 2008
    Messaggi
    1,316
    Quote Originariamente inviata da luca200 Visualizza il messaggio
    Secondo me dovresti andarci piano con le valutazioni. Qui ti stai arrampicando sugli specchi per giustificare quello che hai scritto prima. Una query per nome utente NON PUO' restituire più di una riga, altrimenti hai un problema a monte sulla progettazione del db.
    Poi che quel codice non sia il massimo non ci sono dubbi, ma in ogni caso fare la select solo sull'utente e controllare la password a valle potrebbe essere utile per capire, in caso di errore, se il problema sta nel nome utente che non esiste o nella password sbagliata. A qualcuno potrebbe servire.

    @curzio.maria: sei in grado di postare qui l'output di phpinfo()? ho un vago sospetto...
    Certo... può essere utile anche se fai il salt e l'encrypt della password tramite algoritmi tuoi o altrui, ma rimane il fatto che quelle righe, per il codice che è stato presentato, sono mal progettate.

    - Accetto che mi fai il fetch della password se ci devi fare delle operazioni sopra;
    - Non accetto che progetti una query per scorrere l'intero database;
    - Non accetto che assegni una variabile soprattutto in un linguaggio a tipizzazione dinamica (anche se qui voglio essere fiscale);
    - Non accetto il senso non logico di: if( $count == 1 && $row['userPass']==$password ), per i motivi che ho già spiegato oltre al fatto che a questo punto era possibile evitare porzione dell'if (nel momento in cui estrai la password puoi semplicemente verificare che non sia vuota e che coincida);

    Se qualcuno posta un codice simile a questo:
    codice:
    <?php
      $email = @$_POST["email"];
      if ($email != "" && isset($email) && !empty($email)) {
        // ...
      } elseif ($email == "" || !isset($email)) {
        // ...
      }
    Mi sento costretto a spiegare che qualcosa che non va...

    Di conseguenza mi dispiace essere stato poco chiaro nei primi post, il mio intento era solo quello di delimitare che ci sono dei gravi problemi strutturali.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.