• User

    Miglioramento script

    Ciao ragazzi, ho scritto questo script che inserisce dei dati trasmetti tramite form in un database mysql.

    Mi chiedevo, come posso aggiungere un controllo se i dati inseriti sono già esistenti all'interno del database?

    ps: ho aggiunto un controllo sul nome all'interno di una funzione richiamata all'interno del codice, ho fatto male?
    vedo che lo script funziona.

    <html>
    <head>
    <body>

    come vi sembra?

    <?

    require 'connect.php';
    require 'config.php';

    function controllodati()
    {
    if ( empty($_POST['nome']) ) die ('Il campo nome è obbligatorio');
    }

    $query= "insert into glossario (nome, descrizione) values ('{$_POST['nome']}', '{$_POST['descrizione']}')";
    $result= mysql_query($query);
    if(controllodati()==true) {
    die ('impossibile continuare');
    }

    else {
    if(!$result) {
    die ('Inserimento non riuscito'.mysql_error());
    }
    }
    mysql_close();
    echo 'Inserimento avvenuto con successo';
    ?>
    <br>
    <a href="form.html"> Torna al form di inserimento </a>
    <br>
    <a href="leggi.php"> Visualizza tutti i valori esistenti nel database </a>

    </head>
    </body>
    </html>


  • User Attivo

    @Holden said:

    Mi chiedevo, come posso aggiungere un controllo se i dati inseriti sono già esistenti all'interno del database?
    Appunto... il controllo devi farlo PRIMA di inserire i dati nel db.


  • User

    <html>
    <head>
    <body>

    <?
    require 'connect.php';
    require 'config.php';

    function controllodati()
    {
    if ( empty($_POST['nome']) ) die ('Il campo nome è obbligatorio');
    }

    controllodati();

    $query= "insert into glossario (nome, descrizione) values ('{$_POST['nome']}', '{$_POST['descrizione']}')";
    $result= mysql_query($query);

    if(!$result) {
    die ('Inserimento non riuscito'.mysql_error());
    }
    mysql_close();
    echo 'Inserimento avvenuto con successo';
    ?>
    <br>
    <a href="form.html"> Torna al form di inserimento </a>
    <br>
    <a href="leggi.php"> Visualizza tutti i valori esistenti nel database </a>

    </head>
    </body>
    </html>

    vorrei anche inserire un controllo se il nome utente è già esistente
    come potrei fare?


  • User Attivo

    @Holden said:

    vorrei anche inserire un controllo se il nome utente è già esistente
    come potrei fare?
    C'è un ottimo tutorial su questo forum:

    http://www.giorgiotave.it/forum/scripting-e-risorse-utili/83033-tutorial-area-privata.html

    Leggi il codice del file 'registrati.php'... c'è un esempio di come si può controllare la presenza di un particolare dato nel db.


  • User

    grazie mille 🙂

    posso cogliere l'occasione e chiederti una cosa?

    perchè così mi ritorna sempre la scritta impossibile???
    il simbolo || non significa or?

    <?
    require 'connect.php';
    require 'config.php';

    function controllodati()
    {
    if ( empty($_POST['nome']) || "SELECT * FROM glossario WHERE nome='{$_POST['nome']}'") {
    die ('impossibile');
    }
    }

    controllodati();

    $query= "insert into glossario (nome, descrizione) values ('{$_POST['nome']}', '{$_POST['descrizione']}')";
    $result= mysql_query($query);

    if(!$result) {
    die ('Inserimento non riuscito'.mysql_error());
    }
    mysql_close();
    echo 'Inserimento avvenuto con successo';
    ?>


  • User Attivo

    Così è sbagliato...
    Aggiungilo dopo il POST:

    
    function controllodati()
    { 
    if (empty($_POST['nome'])) die ('Il campo nome è obbligatorio');
    elseif (mysql_num_rows(mysql_query("SELECT * FROM glossario WHERE nome='{$_POST['nome']}' LIMIT 1")) == 1) die ('Nome Utente non disponibile');
    }
    
    

  • User

    GRANDISSIMOOOOOO FUNZIONA.
    🙂

    grazie mille, sei gentilissimo.

    EVVAIIII


  • User

    ti potrei chiedere l'ultima cosa e dopo sparisco senza disiturbarti? 🙂

    mi potresti spiegare le cose che hai aggiunto????
    non mi piace fare copia incolla altrimenti la prossima volta rimarrò ancorato allo stesso punto.

    mysql_num_rows -- Ottiene il numero di righe in un risultato? che significa?
    LIMIT 1")) == 1?


  • User Attivo

    Ascolta... capisco la tua euforia perchè l'ho provata anch'io... 🙂
    Però... ora trasformala in passione ed impegno, documentandoti e studiando... ma senza bruciare le tappe come hai fatto oggi...

    I linguaggi vanno capiti e non imparati a memoria... ma per capirli bisogna cominciare dall'inizio... piano piano... tassello per tassello.

    La Rete con Google, gtforum, html.it, le guide ecc... ci è amica... i libri pure 😉

    Buon studio! :smile5:


  • User Attivo

    @tigrone said:

    Così è sbagliato...
    Aggiungilo dopo il POST:

    >
    function controllodati()
    { 
    if (empty($_POST['nome'])) die ('Il campo nome è obbligatorio');
    elseif (mysql_num_rows(mysql_query("SELECT * FROM glossario WHERE nome='{$_POST['nome']}' LIMIT 1")) == 1) die ('Nome Utente non disponibile');
    }
    
    >```
    
    Un paio di considerazioni:
    
    
    * nel codice che suggerisci utilizzi i dati provenienti da $_POST senza validarli nè renderli sicuri - pessimo suggerimento. Assolutamente *sempre* da usare funzioni tipo mysql_real_escape_string per essere (relativamente) sicuri che l'input che riceviamo non possa fare danni nel nostro database
    * la query che suggerisci non mi sembra molto efficiente per due motivi:
    
    * perchè fare un "SELECT * FROM..." (cioè tutti i campi) quando basterebbe un solo campo, tipo "SELECT nome FROM ..."?
    * mysql_num_rows (anche se unita ad un "LIMIT") obbliga probabilmente MySQL a fare un full table scan. Molto meglio sarebbe prendere direttamente il campo che ci interessa
    
     
    
    Tutto ciò detto, a mio modo di vedere un codice migliore è:
    
    [php]function controllodati($nome) {
        if (empty($nome)) {
            die ('Il campo nome è obbligatorio');
        } else {
            $res = mysql_query("SELECT nome FROM glossario WHERE nome = '" . mysql_real_escape_string($nome) . "'");
            $row = mysql_fetch_array($res);
            if ($row[0]) {
                die ('Nome Utente non disponibile');
            }
        }
    }
    [/php]Alcune considerazioni poi per l'autore della domanda originale:
    
    
    * con questo codice "pIppo", "PIPPO" e "pippo" sono tutti dei nomi accettati e non duplicati - sicuro di non voler aggiungere un controllo almeno delle maiuscole?
    * come hai potuto vedere ho chiamato la funzione con un parametro ($nome) e non accedendo direttamente a $_POST: questo perchè potresti aver bisogno di questa funzione in altre situazioni dove non hai dati in $_POST e dunque è utile poter passare il valore alla funzione
    * non penso sia una buona idea fare un "die" in una funzione, io piuttosto ritornerei "false" e poi gestirei la logica (ad esempio mostrando un messaggio di errore più carino) nel codice che richiama questa funzione
    * visto che hai voglia di studiare e imparare, esplora un po' questa libreria per utilizzare i DB in maniera molto più efficiente che usando le funzioni "native" di PHP: h t t p ://pear.php.net/package/MDB2
    
    HTH, ciao! :)

  • User Attivo

    Si... d'accordo in tutto... ma uno che è all'inizio è bene che impari le basi senza troppi 'incasinamenti'... poi viene il resto.
    Non penso che adesso debba programmare un portale...:dull:


  • User Attivo

    @tigrone said:

    Si... d'accordo in tutto... ma uno che è all'inizio è bene che impari le basi senza troppi 'incasinamenti'... poi viene il resto.
    Non penso che adesso debba programmare un portale...:dull:
    Uhm... permettimi di dissentire.

    Non sto parlando di "programmare un portale", ma imparare fin da subito le "piccole" ma importantissime cose (tipo fare il controllo dell'input prima di inserirlo in una query) è l'essenza dell'apprendimento.

    E' molto importante che chi ha le conoscenze si adoperi per trasmetterle nella maniera più corretta e completa possibile, evitando di pensare "tanto è alle prime armi e non capirà/non gli servirà". Sennò si fanno più danni che altro.

    IMHO, ovviamente 😉


  • User Attivo
    mysql_real_escape_string
    ``` non ti puoi permettere di NON usarlo ;)