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

    generazione numero progressivo ad ogni submit

    Ciao ragazzi,

    Sto incontrando un problema nella generazione di un numero progressivo che aumenta ogni volta che faccio il submit del form.

    Vi spiego: fino a quando arrivo a 10 va bene, ma quando arrivo all'11 mi torna all'1.

    Il numero progressivo che devo ottenere è questo:

    2015.00001

    Quanto diventa 10, deve diventare 2015.00010

    Quando diventa 100, deve diventare 2015.00100

    Però quando è 11, così com'è ora diventa 2015.00001.

    Sbaglio qualcosa nel codice:

    Codice PHP:
    $this->sql "SELECT codice FROM accettazione ORDER BY id DESC LIMIT 1";

    if (
    $result $this->hookUp->query($this->sql)) {

        if (
    $result->num_rows 0) {
            while (
    $rw mysqli_fetch_array($resultMYSQLI_BOTH)) {

                
    $codice substr($rw['codice'], -1);

                
    $rw['codice'] = date("Y") . ".0000";

                echo 
    $rw["codice"] . ++$codice;
            }
        } else {
            echo 
    date("Y") . ".00001";
        }

    } else if (
    $this->hookUp->query($this->sql) === false) {
        echo 
    "fail";

    Mi segnalate l'errore?

    Grazie

  2. #2
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,372
    Ma il dato calcolato lo salvi da qualche parte ?

    Codice PHP:
    $this->sql "SELECT codice FROM accettazione ORDER BY id DESC LIMIT 1";

    if (
    $result $this->hookUp->query($this->sql)) {

        if (
    $result->num_rows 0) {
            while (
    $rw mysqli_fetch_array($resultMYSQLI_BOTH)) {

                
    $codice $rw['codice'] + 0.00001;

                ...
                
    Poi il codice che usi per aggiornare la tabella.
            }
        } else {
            echo 
    date("Y") . ".00001";
            
    A che cosa serve questo 
        }

    } else if (
    $this->hookUp->query($this->sql) === false) {
        echo 
    "fail";

    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  3. #3
    Il dato poi viene richiamato tramite una chiamata Ajax e diventa il valore di un input di un form, che poi viene salvato nel DB insieme agli altri dati del form. Nel Database questo dato è un VARCHAR. Forse non dovrebbe essere una stringa? però c'è quel 2015 davanti che non posso togliere, altrimenti come farei?

  4. #4
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,372
    Già il tuo metodo non è sicuro. Cosa impedisce a qualcuno di modificare quel valore ?
    Mi spiego. Nell'input c'è 2015.00012. Chi o cosa mi impedisce di mettere 2015.0006 per esempio.
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  5. #5
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    5,771
    Ciao, a prescindere dalle altre cose di contorno, ci sono due "errori" nella logica di funzionamento da te usata.

    - Il primo errore sta nell'uso non proprio corretto della funzione substr in questa riga:
    Codice PHP:
    $codice substr($rw['codice'], -1); 
    Supponiamo che dal db ottieni una stringa del genere "2015.00009", per cui vai a prelevare il primo carattere a partire dalla fine della stringa, relativo al valore -1 che hai specificato nel substr. In questo caso $codice sarà uguale a "9".

    Supponiamo, ora, che la stringa sia "2015.00010". Cosa ti aspetti che venga restituito usando quello stesso procedimento?
    Chiaramente, il carattere prelevato dalla stringa è sempre l'ultimo, per cui $codice, in questo caso, sarà uguale a "0". Trai tu le conseguenze.

    Per risolvere dovrai tener conto dell'intero codice di 5 cifre, non solo dell'ultima cifra.
    Per cui, quella riga, dovrebbe piuttosto essere così:
    Codice PHP:
    $codice substr($rw["codice"], -5); 
    In tal caso il valore restituito terrà sempre in considerazione tutte le 5 cifre del codice.
    Tieni presente che, ai fini dei calcoli successivi, non ha importanza se il valore ha degli zeri iniziali.


    - Il secondo errore sta nella costruzione della stringa:
    Codice PHP:
    $rw['codice'] = date("Y") . ".0000";
    echo 
    $rw["codice"] . ++$codice
    Supponiamo che $codice sia "9". Quando vai ad incrementarlo, diventerà "10", giusto? Ma in tal caso vai ad anteporre sempre una stringa di 4 zeri ("0000"), come se ti aspettassi che $codice fosse sempre di una sola cifra. Chiaramente, in questo caso, il risultato sarà invece un codice di 6 cifre ("000010"). E se, ad esempio, $codice fosse stato "950", avresti ottenuto "0000951". Va da se che il procedimento da te usato non ha molto senso.

    Chiaramente la stringa da restituire può avere, davanti, un numero di zeri variabile a seconda della lunghezza del codice ottenuto.
    Per risolvere puoi usare una delle funzioni sprintf o str_pad:

    Soluzioni possibili:
    Codice PHP:
    $codice substr($rw["codice"], -5);

    echo 
    date("Y") . sprintf(".%05d", ++$codice);
    // OPPURE
    echo date("Y") . "." str_pad(++$codice5"0"STR_PAD_LEFT); 
    Installa Forum HTML.it Toolset per una fruizione ottimale del Forum

  6. #6
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,372
    Quote Originariamente inviata da KillerWorm Visualizza il messaggio
    Soluzioni possibili:
    Codice PHP:
    $codice substr($rw["codice"], -5);

    echo 
    date("Y") . sprintf(".%05d", ++$codice);
    // OPPURE
    echo date("Y") . "." str_pad(++$codice5"0"STR_PAD_LEFT); 
    Visto che la stringa ha il formato 2015.00001, un semplice
    Codice PHP:
     $codice $rw['codice'] + 0.00001
    dovrebbe funzionare.
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

Tag per questa discussione

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.