Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it L'avatar di Base
    Registrato dal
    Apr 2001
    Messaggi
    822

    [php - MYSQL] controllo esistenza codice

    Ciao ragazzi,

    con una funzione genero un codice alfanumerico di 6 cifre ma prima di inserirlo in un record voglio controllare se esiste già (è praticamente impossibile che si rigeneri lo stesso codice ma voglio essere sicuro)

    la mia domanda è: Come faccio a generare un ciclo di controllo che mi permette di controllare l'esistenza nella tab del codice e che continua a generarne uno nuovo fino a quando nella tab ne trova uno uguale?

    Codice PHP:
    $code rPass(6);
    $checkcode mysql_num_rows(mysql_query("SELECT * FROM $tab_users WHERE sms = '$code' "))or die (mysql_error());
    if (
    $checkcode 0) {
    $code rPass(6);

    così lo farebbe una volta sola ...

  2. #2
    Ciao, utilizza la ricorsione.
    Codice PHP:
    function generateCode() {
       
    $code rPass(6);
       if(
    checkCode($code)) return $code;
       else 
    generateCode();
    }

    function 
    checkCode($code) {
      
    $checkcode mysql_num_rows(mysql_query("SELECT * FROM $tab_users WHERE sms = '$code' "))or die (mysql_error());
      return (
    $checkcode>0)?false:true;

    =======================
    http://www.abidibo.net

  3. #3
    Utente di HTML.it L'avatar di Virus_101
    Registrato dal
    Sep 2008
    Messaggi
    2,497
    Lol grande avatar!!!

    Come dice tu stesso ti serve un ciclo


    Codice PHP:

    $error 
    false;
    $run =true;
    $code "";

    while( 
    $run )
    {
        
    $code rPass(6); 
        
    $q "select count(*) from tabella where code = '".$code."'  " ;

        if( 
    $ris = @mysql_query$q $connessione )
        {
            
    $data mysql_fetch_array($ris);
            
    $found data[0];
            
            if( 
    $found==)
            {
                
    $run false;
                
    $error false;
            }
        }
        else 
        {
            
    $error true;
            
    $run =false;
        }
    }

    if( !
    $error )
    {
        echo 
    "Codice trovato : $code";
    }
    else
        echo 
    "Impossibile controllare il codice"
    E' la prima sol che mi viene in mente.


    P.S.
    Ho visto ora la risp ... io preferisco evitare la ricorsione dove nn serve.
    Sinceramente una iterazione a mio avviso e' sempre preferibile, occupa moooolta meno memoria di una ricorsione ed e' meno pesante.
    Ovviamente il codice di una ricorsione e' piu' compatto ed elegante nulla da dire.... poi decidera' "Base" che sol usare sono valide entrambe io solamente preferisco evitare ricorsioni dove non sono strettamente necessarie.

  4. #4
    Forse potrebbe convenire estrarre tutti i codici da database e metterli in un array, per poi controllare l'array invece di fare mille query.

  5. #5
    Utente di HTML.it L'avatar di Base
    Registrato dal
    Apr 2001
    Messaggi
    822
    ok vada per il no ricorsivo..
    ho fatto un po di fatica perchè c'erano degli errori di sintassi, ora così il codice sembra funzionare.. ma non ho capito una cosa
    Codice PHP:
    $error false
    $run =true
    $code ""

    while( 
    $run ) { 
        
        
    $code rPass(6); 
        
    $q "select count(*) from users where sms = '".$code."'  "

        if( 
    $ris = @mysql_query($q)) {
            
            
    $data mysql_fetch_array($ris); 
            
    $found $data[0]; 
            echo 
    $data[0];
             
            if( 
    $found==) { 
                
    $run false
                
    $error false
            } 
            
        } else  { 
            
    $error true
            
    $run =false
        } 
        

    nel senso che mi da sempre:
    Codice trovato : HTY67D

    ma non è vero che l'ha trovato, semmai "codice NON trovato". no?

  6. #6
    Utente di HTML.it L'avatar di Virus_101
    Registrato dal
    Sep 2008
    Messaggi
    2,497
    .... aspe che ho scritto quella cosa di getto cosi' come mi veniva in mente.


    Ripensandoci si potrebbe fare meglio cosi' :

    Codice PHP:

    $error 
    false;
    $run =true;
    $code "";

    $upperLimit 100;
    $cnt=0;

    while( 
    $run && $cnt<$upperLimit ) {
        
        
    $code rPass(6);
        
    $q "select count(*) from users where sms = '".$code."'  ";

        if( 
    $ris = @mysql_query($q)) {
            
            
    $data mysql_fetch_array($ris);
            
    $found $data[0]; // questo e' un'intero che mi dice se ho trovato occorrenze del codice
             
            
    if( $found==) {
                
    $run false;
                
    $error false;
            }
            
        } else  {
            
    $error true;
            
    $run =false;
        }   
        
    $cnt ++; 
    }


    if( 
    $cnt>=$upperLimit )
       echo 
    "Limite di tentativi raggiunto. Impossibile generare codice";
    else if( !
    $error )
       echo 
    "codice trovato : $code";
    else
       echo 
    "Errore riscontrato"
    Visto cosi' dovrebbe andare, alla fine $code viene aggiornata dalla funziona rPass(6) ...(sempre se tale funzione e' scritta correttamente). Poi tale codice viene controllato e se nn ci sono errori di query allora controlla il numero di occorrenze trovate nella base di dati.
    Quindi se tale valore e' = 0 si ferma ed esce lasciando nella var $code il codice trovato.
    Altrimenti per errori o raggiungimento del limite massimo di tentativi si ferma e cio' viene controllato sotto.
    Infatti le ultime istruzioni servono a controllare cos'e' successo nel while.

    Cosi' a vista dovrebbe andare nel caso lo controllo un attimo meglio appena ho tempo e ti do una sol magari anche migliore.

    P.S. per "k.b"
    A mio avviso scaricare tutti i codici e' molto peggio che nn laciare un paio di query in piu'.
    Se hai 1000000 utenti scaricheresti tutti i codici e poi dovresti effettuare una ricerca su tale array per vedere se il codice esiste.
    Cio' e' piu' pesante che nn laciare un paio di query.
    Se la funzione di generazione di codice eì pensata per minimizzare le collisioni al massimo se prorpio ti va male mediamente genererai 5-6 query.

    Nel caso medio la query e' una e quindi a mio avviso e' meglio avere mediamente 1 query e se mi va male 5-6 piuttoscto che ogni volta scaricare dal db tutti i dati controllarli ( con funzioni di complessita' lineare, logaritmica o quadratica in base al tipo di ricerca che vai a fare ).

  7. #7
    Forse ho capito male il problema (ho letto la domanda ma non i codici che avete postato): Base non chiedeva un modo per generare numeri finche' non se ne genera uno gia' presente in tabella?

  8. #8
    Utente di HTML.it L'avatar di Virus_101
    Registrato dal
    Sep 2008
    Messaggi
    2,497
    Err nu.

    Gli serve una procedura che controlli se il codice generato non e' gia' stato generato e quindi gia' presente nella tabella.

  9. #9
    Allora suggerisco di esprimersi meglio:

    la mia domanda è: Come faccio a generare un ciclo di controllo che mi permette di controllare l'esistenza nella tab del codice e che continua a generarne uno nuovo fino a quando nella tab ne trova uno uguale?

  10. #10
    Utente di HTML.it L'avatar di Virus_101
    Registrato dal
    Sep 2008
    Messaggi
    2,497
    Boh io avevo capito.

    Cmq ho testato il codice e ho riscontrato esito positivo nei test fatti.

    Prova questo :

    Codice PHP:

    <?php
    $error 
    false;
    $run =true;
    $code "";

    $upperLimit 100;
    $cnt=0;

    $link mysql_connect("XXXX" "XXXX" "XXXXXX");
    mysql_select_db("test");



    function 
    rPass($length)
    {
        
    $str "";
        for(
    $i=0;$i<$length;$i++)
            
    $str .= chrrand(97 122) );
        return 
    $str;
    }

    while( 
    $run && $cnt<$upperLimit ) {
        
        
    $code rPass(6);

        
    $q "select count(*) from prova where test_col = '".$code."'  ";

        if( 
    $ris = @mysql_query($q)) {
            
            
    $data mysql_fetch_array($ris);
            
    $found $data[0]; // questo e' un'intero che mi dice se ho trovato occorrenze del codice
             
            
    if( $found==) {
                
    $run false;
                
    $error false;
            }
            
        } else  {
            
    $error true;
            
    $run =false;
        }   
        
    $cnt ++;
    }

    echo 
    "Total query done $cnt
    "
    ;
    if( 
    $cnt>=$upperLimit )
       echo 
    "Limite di tentativi raggiunto. Impossibile generare codice";
    else if( !
    $error )
       echo 
    "codice trovato : $code";
    else
       echo 
    "Errore riscontrato";




    ?>


    EDIT: era rimasto del codice commentato di test vari ..... cmq il codice che ti ho lasciato dovrebbe essere corretto fai qlke prova e fammi sapere.

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.