Pagina 2 di 3 primaprima 1 2 3 ultimoultimo
Visualizzazione dei risultati da 11 a 20 su 25
  1. #11
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    1,453
    Originariamente inviato da Alhazred
    Ci avevo pensato a questa eventualità, ma la ritengo abbastanza improbabile da poterla accettare.
    Essendo il codice una primary key, chi arriva secondo si becca un errore e riprova, al secondo giro non può andargli male di nuovo, altrimenti che giochi al superenalotto.
    perché invece nel caso (durante l'invio) che nel database ci sia gia
    quel codice (quindi una richiesta quasi simultanea), non fai aspettare un secondo all'applicazione per generarne un'altro?


    Non so se mi sono spiegato bene, ma intendo invece dell'errore di rigenerare il codice
    facendo ad esempio aspettare 1-2 secondi con sleep() e riutilizzare il time()


    Un po come la soluzione di oly, oppure potresti generare un eventuale codice random
    che andrebbe a concatenarsi anche se sarebbe una soluzione un po grezza per rare occasioni

  2. #12
    Utente di HTML.it L'avatar di .Kurt
    Registrato dal
    Jul 2007
    Messaggi
    654
    In una tabella devo inserire dei prodotti, per l'id vorrei evitare il solito int auto_increment ed usare un codice generato da me, ma che mi dia la certezza dell'unicità.
    Se si vuole la certezza dell'unicità del campo, impostare AUTO_INCREMENT. E' questa la soluzione. Non puoi essere più certo di così di avere un id unico. Perchè si pensa il contrario?

  3. #13
    Originariamente inviato da .Kurt
    Se si vuole la certezza dell'unicità del campo, impostare AUTO_INCREMENT. E' questa la soluzione. Non puoi essere più certo di così di avere un id unico. Perchè si pensa il contrario?
    ... questo era ovvio dal primo momento della richiesta dell'utente... e nessuno, compreso l'utente che ha aperto il tipic, pensa il contrario.
    http://www.miniscript.it
    Se ti sono stato di aiuto in qualche modo in questo forum iscriviti alla fan page di Miniscript - il mio blog di programmazione web.

  4. #14
    Secondo me ti stai incartando. (anche se non conosco il perchè, e quindi lo dico ad occhio)
    Penso che pois sarà poi un problema la tracciabilità e il riassortimento.

  5. #15
    ma sto inserzionista ce l'ha un id univoco no? usa quello abbinato al time ad esempio... certo 13 caratteri potrebbero essere pochini
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  6. #16
    Tralasciando la questione sul fatto che l'id AI è la cosa + semplice nonchè l'unico metodo infallibile.

    Vi espongo una mia idea al riguardo a cui sono gradittissimi commenti/opinioni.
    Il mio sistema è basato su una logica che impiegherei per la costruzione di stringhe, univoche per ciascun prodotto, che andranno poi a comporre URL con all'interno keywords (ovvio lo scopo seo...).

    Sò che è possibile adottare soluzioni basate sul rewrite url facendo in modo che vengano fuori URL di questo genere:
    codice:
    dominio.it/prodotto/[ID DEL PRODOTTO]/keywords_varie.html
    A ciò occorre poi aggiungere accorgimenti come il metatag canonical url.

    Ma, volendo complicarci la vita, il mio obiettivo è quello di creare un sistema che mi crei stringhe univoche per ogni prodotto: ciò non mi costringerebbe a portarmi dietro l'id nell'url e al suo posto impiegare la stringa univoca (es. i profili facebook: facebook.com/nome.cognome).

    Io agirei con una tecnica ricorsiva tipo questa:
    Codice PHP:
    $prodotti_esistenti = array(
            
    'scarpe di ginnastica',
            
    'giubotto sportivo',
            
    'maglione di lana');

    function 
    stringa_univoca($nuovo$esistenti$ciclo null){
        
    // se la nuova stringa non è presente... ok
        
    if(!in_array($nuovo $ciclo$esistenti)){
            return 
    $nuovo $ciclo;
            }
        
    // se presente
        
    else{
            if(
    is_null($ciclo))
                
    $ciclo 1;
            
    $ciclo++;
            return 
    stringa_univoca($nuovo$esistenti$ciclo);
            }
        }
        
    // proviamo ad aggiungere un prodotti con lo stesso nome... di quelli esistenti
    $prodotti_esistenti[] = stringa_univoca('scarpe di ginnastica'$prodotti_esistenti);
    $prodotti_esistenti[] = stringa_univoca('scarpe di ginnastica'$prodotti_esistenti);
    $prodotti_esistenti[] = stringa_univoca('scarpe di ginnastica'$prodotti_esistenti);
    $prodotti_esistenti[] = stringa_univoca('giubotto sportivo'$prodotti_esistenti);
    $prodotti_esistenti[] = stringa_univoca('giubotto sportivo'$prodotti_esistenti);
    $prodotti_esistenti[] = stringa_univoca('maglione di lana'$prodotti_esistenti);
    // e un prodotto totalmente nuovo
    $prodotti_esistenti[] = stringa_univoca('giacca elegante'$prodotti_esistenti);
    sort($prodotti_esistenti);
    echo 
    '<pre>';
    print_r($prodotti_esistenti); 
    http://www.miniscript.it
    Se ti sono stato di aiuto in qualche modo in questo forum iscriviti alla fan page di Miniscript - il mio blog di programmazione web.

  7. #17
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    1,453
    Originariamente inviato da oly1982
    Tralasciando la questione sul fatto che l'id AI è la cosa + semplice nonchè l'unico metodo infallibile.

    Vi espongo una mia idea al riguardo a cui sono gradittissimi commenti/opinioni.
    Il mio sistema è basato su una logica che impiegherei per la costruzione di stringhe, univoche per ciascun prodotto, che andranno poi a comporre URL con all'interno keywords (ovvio lo scopo seo...).

    Sò che è possibile adottare soluzioni basate sul rewrite url facendo in modo che vengano fuori URL di questo genere:
    codice:
    dominio.it/prodotto/[ID DEL PRODOTTO]/keywords_varie.html
    A ciò occorre poi aggiungere accorgimenti come il metatag canonical url.

    Ma, volendo complicarci la vita, il mio obiettivo è quello di creare un sistema che mi crei stringhe univoche per ogni prodotto: ciò non mi costringerebbe a portarmi dietro l'id nell'url e al suo posto impiegare la stringa univoca (es. i profili facebook: facebook.com/nome.cognome).

    Io agirei con una tecnica ricorsiva tipo questa:
    Codice PHP:
    $prodotti_esistenti = array(
            
    'scarpe di ginnastica',
            
    'giubotto sportivo',
            
    'maglione di lana');

    function 
    stringa_univoca($nuovo$esistenti$ciclo null){
        
    // se la nuova stringa non è presente... ok
        
    if(!in_array($nuovo $ciclo$esistenti)){
            return 
    $nuovo $ciclo;
            }
        
    // se presente
        
    else{
            if(
    is_null($ciclo))
                
    $ciclo 1;
            
    $ciclo++;
            return 
    stringa_univoca($nuovo$esistenti$ciclo);
            }
        }
        
    // proviamo ad aggiungere un prodotti con lo stesso nome... di quelli esistenti
    $prodotti_esistenti[] = stringa_univoca('scarpe di ginnastica'$prodotti_esistenti);
    $prodotti_esistenti[] = stringa_univoca('scarpe di ginnastica'$prodotti_esistenti);
    $prodotti_esistenti[] = stringa_univoca('scarpe di ginnastica'$prodotti_esistenti);
    $prodotti_esistenti[] = stringa_univoca('giubotto sportivo'$prodotti_esistenti);
    $prodotti_esistenti[] = stringa_univoca('giubotto sportivo'$prodotti_esistenti);
    $prodotti_esistenti[] = stringa_univoca('maglione di lana'$prodotti_esistenti);
    // e un prodotto totalmente nuovo
    $prodotti_esistenti[] = stringa_univoca('giacca elegante'$prodotti_esistenti);
    sort($prodotti_esistenti);
    echo 
    '<pre>';
    print_r($prodotti_esistenti); 
    Sinceramente non mi piace molto il metodo ricorsivo preferirei fare un ciclo direttamente
    dentro la funzione
    Codice PHP:
    function stringa_univoca($nuovo,$esistenti,$ciclo 2){ 
         
          if(!
    in_array($nuovo,$esistenti)) return $nuovo;
          
          for(
    $i=$ciclo;$i<count($esistenti)+$ciclo;$i++) if(!in_array($nuovo.$i,$esistenti)) return $nuovo.$i
               
        } 

    Poi i gusti sono gusti, io avrei usato anche direttamente un global senza avere la rottura
    di richiamare l'array tutte le volte, ovviamente so benissimo che cosi non sarebbe piu
    dinamica ma dipende se hai fretta o meno

  8. #18
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,505
    Questo sistema però richiederebbe di leggere tutta la tabella prodotti ad ogni inserimento, alla lunga diventerebbe un'operazione bella pesante.

  9. #19
    Sono d'accordo con RoTeam,
    la funzione ricorsiva rischia di consumare troppe risorse se hai un bel numero di prodotti...

    il meglio IMO è un while, che è anche più pulito a livello di codice (KISS)
    Codice PHP:
    function stringa_univoca($nuovo$esistenti$ciclo '')
    {
        
    // se la nuova stringa è già presente incrementi il ciclo
        
    while(in_array($nuovo $ciclo$esistenti))
        {
            
    $ciclo++;        
        }
        return 
    $nuovo $ciclo


    ah... si dice scarpe DA ginnastica

  10. #20
    Utente di HTML.it L'avatar di Grino
    Registrato dal
    Oct 2004
    Messaggi
    739
    Originariamente inviato da oly1982
    Codice PHP:
    $prodotti_esistenti = array(
            
    'scarpe di ginnastica',
            
    'giubotto sportivo',
            
    'maglione di lana');

    function 
    stringa_univoca($nuovo$esistenti$ciclo null){
        
    // se la nuova stringa non è presente... ok
        
    if(!in_array($nuovo $ciclo$esistenti)){
            return 
    $nuovo $ciclo;
            }
        
    // se presente
        
    else{
            if(
    is_null($ciclo))
                
    $ciclo 1;
            
    $ciclo++;
            return 
    stringa_univoca($nuovo$esistenti$ciclo);
            }
        }
        
    // proviamo ad aggiungere un prodotti con lo stesso nome... di quelli esistenti
    $prodotti_esistenti[] = stringa_univoca('scarpe di ginnastica'$prodotti_esistenti);
    $prodotti_esistenti[] = stringa_univoca('scarpe di ginnastica'$prodotti_esistenti);
    $prodotti_esistenti[] = stringa_univoca('scarpe di ginnastica'$prodotti_esistenti);
    $prodotti_esistenti[] = stringa_univoca('giubotto sportivo'$prodotti_esistenti);
    $prodotti_esistenti[] = stringa_univoca('giubotto sportivo'$prodotti_esistenti);
    $prodotti_esistenti[] = stringa_univoca('maglione di lana'$prodotti_esistenti);
    // e un prodotto totalmente nuovo
    $prodotti_esistenti[] = stringa_univoca('giacca elegante'$prodotti_esistenti);
    sort($prodotti_esistenti);
    echo 
    '<pre>';
    print_r($prodotti_esistenti); 
    In pratica gestisci la collisione aggiungendo un indice numerico alla fine della stringa! Diciamo che a meno della stringa fai ne più ne meno di quanto farebbe un'autoincrement.

    Non utilizzare la ricorsione, perché stai passando un array come argomento della funzione. Dato che in PHP gli array sono passati per valore (copiati) e non per riferimento, ad ogni chiamata hai la duplicazione dell'array. Con array piccoli e ricorsioni brevi non succede nulla, ma al crescere dell'array puoi esaurire la memoria e mandare in crash lo script.

    In più, all'aumentare delle collisioni questo ciclo diventa sempre più lungo. So che vedi solo un'istruzione + un incremento all'interno del ciclo, ma quell'istruzione è una ricerca lineare all'interno di un array.

    Il consiglio è di non memorizzare solo l'elenco delle stringhe esistenti, ma per ognuna anche l'ultimo indice utilizzato. Nel momento in cui aggiungi un prodotto puoi accedere all'elenco delle stringhe, verificarne l'esistenza e se non la trovi l'aggiungi all'elenco dando indice associato 1 e facendo restituire come ID la sola stringa. Se invece lo trovi, recuperi l'indice e lo aggiorni al valore successivo nell'elenco delle esistenti; quindi restituisci la stringa.indiceRecuperato. Nella sostanza stai implementando un repertorio il cui nome è il nome prodotto e per il primo valore di repertorio staccato, in vece dello 0, utilizzi la stringa vuota. L'elenco degli esistenti (i repertori) è su DB in modo da poter effettuare una transazione per ottenere l'indice ed aggiornarlo o utilizzando il blocco delle tabelle con myisam, mettendoti al riparo da accessi concorrenti.

    Pseudocodice in cui si accede ad una sola tabella che ha due colonne:
    nome -> chiave primaria (nome del prodotto o repertorio)
    indice -> valore intero (numero di prodotto o repertorio successivo)
    codice:
    Funzione GeneraIDPer(nome){
        AccediAlDB;
        [INIZIO TRANSAZIONE]
            indice='';
            Se(CercaNelDB(nome) è Trovato){
                indice=OttieniIndiceDaRecordTrovato;
                AggiornaRecordTrovato(nome,indice+1);
            }altrimenti{
                InserisciRecord(nome,1);
            }
        [FINE TRANSAZIONE]
        StaccatiDalDB;
        Ritorna indice;
    }
    Ottieni così l'indice numerico che se vuoi concateni al nome.

    Siamo sempre troppo gelosi delle nostre grandi piccole opere! - Grino inedito.
    Lavori e Lavoretti

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.