Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    controllare i campi UNI in una tabella di database...velocemente

    ho messo su un po' di codice che dati dei valori in POST ed estratta una lista di campi unici nella tabella desiderata dovrebbe restituire un array con i nomi di tutti quei campi che non rispettano la prerogativa di unicita'

    il codice a funzionare funziona, ma fa davvero schifo. E' rozzo, inelegante e temo sia anche molto lento, visto il numero di interrogazioni al database che richiede.

    Lo posto qui, magari riuscite a darmi una mano con l'ottimizzazione (non fate caso a $this e funzioni "ignote" sparse...sono altri "pezzi" della classe di cui il codice fa parte. Ne spiego, dove necessario, la funzione)

    codice:
    $chiavi = array_keys($values);
    
    if($uniquefields = array_intersect($this->GetUniqueFieldList($table), $chiavi)){
    $alreadytakenfields = array();
                
    foreach($uniquefields as $nomecampo){
                
    $sql = "SELECT " . $nomecampo . " FROM " . $table . " WHERE " . $nomecampo . " = '" . $values[$nomecampo] . "'";
    
    $res = $this->MySqlQuery($sql);
    if(mysql_num_rows($res)) array_push($alreadytakenfields, $nomecampo);
                
    }
    }
    L'array $alreadytakenfields contiene ora tutti i campi che nn rispettano il requisito di unicità

    $values è un reference a $_POST

    La funzione GetUniqueFieldList($table) restituisce una lista dei campi unici nella tabella (per ricavarla interroga il database con una DESCRIBE TABLE e poi gioca coi dati trovati)

    Come è piuttosto evidente il grumo è tutto in quel ciclo foreach che effettua count($uniquefields) interrogazioni al database ed è li' che vorrei "pulire" un po'.

    Speravo in qualche alchimia o trucchetto direttamente nell'SQL, che conosco in modo molto elementare, che potesse aiutarmi in questa e in, presumibilmente, molte situazioni simili

    se avete qualche idea...urlate pure qui! tnx in advance
    Gabriele B. - http://9thcircle.it

  2. #2
    Mi pare talmente complessa che mi vergogno un po' a rispondere... anche perche' il timore di avere capito na mazza e' consistente.

    se proprio devi tirare fuori i campi doppi ... farei cosi':
    codice:
    Select *, count(campo) as tot
    from tabella
    group by campo
    having tot > 1
    order by tot desc
    Ovviamente devi sapere il nome del campo che vuoi controllare.
    Se l'univocita' dovesse estendersi su piu' campi puoi fare un raggruppamento collettivo.


    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  3. #3
    devi perdonarmi, ma nn ho capito molto della tua query sql e provarla sul phpMyAdmin nn mi ha fornito grande aiuto (nn è successo niente, ma ci ha impiegato 0.6 secondi per accorgersene )

    sebbene adesso sia curioso a prescindere di capire cosa effettivamente fa questa query, e mi scuso se la mia ignoranza nn mi fa capire nemmeno le ovvieta', a lume di naso sembrerebbe nn essere quella "giusta"

    In nessun punto, infatti, vedo riferimenti ai valori che sto per inserire. La mia poco ottimizzata funzione controlla se i valori che gli passo (l'array ha delle chiavi, quindi posso "indirizzare" i valori ai "giusti" campi) sono gia' presenti nei campi (il controllo e' ristretto ai campi UNI).

    Ti sarei grato se potessi, pero', darmi una riga di spiegazione sulla query che mi hai postato. Dovendo imparare ad usare l'sql, ogni occasione e' buona per imparare qualcosa...anche se nn e' quello che mi serve nell'immediato
    Gabriele B. - http://9thcircle.it

  4. #4
    si spiega da se...

    seleziona tutto
    conta quante righe ci sono nel campo specificato e le mette nell'alias tot
    from tabella
    raggruppa il conteggio per il campo specificato
    estrai solo dove il valore di tot e' superiore a 1
    ordina per il campo indicato n modo discendente

    per vedere se funziona devi mettere qualche campo doppio o triplo. Ovvio.

    Per impedire doppi inserimenti puoi settare il campo come UNIQUE.

    Il lavoro che fai serve solo a ripulire una tabella e non ad una gestione. Quando devi verificare fai un select contando le righe corrispondenti al campo che deve essere univoco.

    select count(pippo) as tot
    from tabella
    where pippo = '$pallino'

    Se la risposta e' zero righe allora non ci sono $pallini.



    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  5. #5
    ecco...mi mancava l'uso della funzione cont...ora e' tutto chiaro

    nn era quello che mi serviva, ma questa query puo' essere molto utile per le mie statistiche sugli utenti!! ^^
    Gabriele B. - http://9thcircle.it

  6. #6

    e si chiuse il cerchio :)

    Originariamente inviato da piero.mac
    Quando devi verificare fai un select contando le righe corrispondenti al campo che deve essere univoco.

    select count(pippo) as tot
    from tabella
    where pippo = '$pallino'

    Se la risposta e' zero righe allora non ci sono $pallini.
    ...che è in effetti quello che la mia funzione rozza gia' fa adesso...peccato...speravo di risparmiarmi qualche query

    In realta' avevo anche pensato di utilizzare la funzione mysql_errno() che ha un codice di errore (nn ricordo quale, al momento, ma c'e') specifico per questo tipo di evenienza, tuttavia l'avere a disposizione un array con i campi che hanno causato l'errore mi consente di "colorare" i form field relativi per avvisare l'utente...ok....un inutile preziosismo grafico....
    Gabriele B. - http://9thcircle.it

  7. #7
    erroraccio stampare gli errori. non fai altro che rivelare la struttura della tabella.

    Ma siamo sintonizzati su frequenze molto diverse. Se per le query o gli inserimenti ti vai a leggere la struttura della tabella e verifichi tutti i campi siamo in presenza di un discorso tra muti e orbi.


    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  8. #8
    nn avrei stampato gli errori, avrei fatto piuttosto qualcosa del tipo

    supponendo di incapsulare in una classe:
    codice:
    public function MySqlQuery($sql){
    
    if(!($res = @mysql_query($sql)) throw new MiaException(mysql_error(), mysql_errorno());
    
    return $res;
    }
    dal codice chiamante avrei poi gestito l'eccezione, chesso', stampando un messaggio predefinito di errore e loggando sul log degli errori di apache l'errore

    tornando al discorso precedente, mi rendo conto che nn e' molto pratico controllare la struttura della tabella ogni volta...ma che alternativa vi può essere?
    Gabriele B. - http://9thcircle.it

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 © 2025 vBulletin Solutions, Inc. All rights reserved.