selece count(*) e rompicapo

Ciao a tutti,

allora ho utilizzado questa query per generare una sequenza di nomi da inserire nel db

$query  = "SELECT COUNT(*) as quanti FROM prodotti WHERE prodotto='$_POST[prodotto]'";
$result = mysql_query($query);
$row = mysql_fetch_array($result);
$record =$row[quanti];
$totprodotti=$record+1;
$nome="Prodotto$toprodotti";

questa query in sostanza conta il numero di record presenti per quella tabella,

se sono zero: il nome prodotto sarà "Prodotto1",

se ce nè 1 : il nome prodotto sarà "Prodotto2"....etc

Il problema è che successivamente ognuno di questi record putrà essere eliminato restituendo un errore di duplicazione:

in pratica:

prodotto1 >>delete

prodotto2 >>delete

prodotto3 >>delete

se decido di eliminare ad es il prodotto2 crearne uno nuovo

avrò una roba del genere:

prodotto1

prodotto3

prodotto3(il risultato del conteggio dei record+1)...che ovviamente non va bene!

come faccio a creare il prtodotto che manca?(es.prodotto2)

grazie mille

inviato 9 anni fa
yusizu
X 0 X

Ti rimando ad una mia discussione da cui puoi prendere spunto!

http://www.phpnews.it/forum/index.php?topic=1769.msg11829#msg11829

 :bye:

risposto 9 anni fa
Marco Dario
X 0 X

l'ho letto ma sinceramente non saprei come presonalizzarlo, immagino di vovermi rifare a quanto scritto da Gianni nell'ultima parte ma, come per te il codice non mi è molto chiaro,

grazie cmq :bye:

risposto 9 anni fa
yusizu
X 0 X

Si infatti non ho ancora capito bene il codice di Gianni.

Comunque l'ho provato e funziona però non capisco come  ::)

Se guardi il mio codice non è altro che un ciclo while con dentro una varibile che incrementa. Se il valore della variabile restituisce falso vuol dire chè il "buco" è libero, e quindi inserisce il valore.

Per il codice di Gianni sentiamo Gianni!  :D

 :bye:

risposto 9 anni fa
Marco Dario
X 0 X

Per quanto riguarda il codice della discussione citata prometto di spiegarlo nel dettaglio, ovviamente in quella discussione.

Per qunto riguarda il problema di yusizu invece io consiglio di tenersi il "buco" nella numerazione causato dalla cancellazione di un elemento e continuare ad incrementare il contatore.

Mi preme chiarire comunque che questo approccio (il nome con il contatore annesso) è sbagliato e proviene da una progettazione errata del database. Le soluzioni corrette sono 2:

1) semplice contatore numerico per tutti gli elementi che si incrementa ad ogni inserimento + campo della tabella che specifica il tipo di elemento

id     tipo elemto

1       E1

2       E1

3       E2

4       E2

id è la PK autoincrement

2) contatore numerico che si incrementa relativamente al tipo di elemento:

id     tipo elemto

1       E1

2       E1

1       E2

2       E2

id + tipo_emento sono la PK, id è autoincrement

In MySQL entrambe le situazioni sono automaticamente implementate, ovvero è MySQL che si preoccupa di incrementare il contatore in modo corretto.

Ovviamente alla cancellazione di un elemento MySQL non recupera il "buco"

 :bye:

risposto 9 anni fa
Gianni Tomasicchio
X 0 X

difatti Gianni il problema è proprio recuperare il buco, conosco bene è utilzzo sempre la funzione auto_increment propria di mysql ma, non mi risolve il problema.

Come faccio a tappare sto buco?

risposto 9 anni fa
yusizu
X 0 X

...Io ovviamente ho semplificato il codice postato per meglio esplicare il problema, ma in realtà ho la necessità di creare i nomi dei prodotti in modo sequenziale, senza tralasciare buchi, i nomi qui utilizzati sono fittizi, in realtà non devo creare il "prodotto1,2 3 ect"era solo a titolo esemlificativo.

a me interessa che dopo l'inserimento e l'eventuale cancellazione avrò sempre nel db:

Prodotto 1

Prodoto 2

Prodotto 3

Prodotto n

in modo sequenziale e partendo da "prodotto1"

ho pensato anche di salvare da qualche parte il prodotto appena cancellato per poi reinserirlo quando vado a creare il successivo, ma, pesandoci su, se ne cancello due e poi ne vado a creare uno, avrò sempre il problema del buco

P.S dimenticavo ovviamente esiste già nella tabella di riferimento un id (autoincrement primary key)

grazie ancora  :bye:

risposto 9 anni fa
yusizu
modificato 9 anni fa
X 0 X

quanti prodotti credi di dover gestire? 10, 100, 1000, 10000?

risposto 9 anni fa
Gianni Tomasicchio
X 0 X

se possibile vorrei lasciarli infiniti, altrimenti siamo nelll'ordine delle decine max.

Credo che sia il caso di spiegarmi meglio in pratica devo creare dei listini da associare ai prodotti durante l'inserimento:

inserito ilprodotto a questo devo associare un tot di listini, che poi ovviamente dovrò richiamare x questo è indispensabile che riportino il numero sequenziale così da una select saprò sempre che Listino1(magari è quello più basso etc.

tutto questo ambaradam solo per non fare inserire il nome (LISTINO(n)) all'utente, nn vorrei facesse qualche cavolata come appunto lasciare qualche buco

risposto 9 anni fa
yusizu
modificato 9 anni fa
X 0 X

c'è una bella differenza tra decine e infiniti...

se non sono tantissimi potresti pensare di sfruttare l'autoincrement di MySQL:

1) cancelli una riga e si crea il buco

2) rinomini la tabella in vecchia_tabella

3) crei una tabella identica alla vecchia

4) riversa le righe della tabella vecchia nella nuova (MySQL provveerà ad inserire gli indici corretti)

5) cancelli la vecchia_tabella

 :bye:

risposto 9 anni fa
Gianni Tomasicchio
X 0 X

Grazie Gianni ma credo che non possa funzionare, ti spiego perché

non avrò tante tabelle per quanti sono i listini ma una struttura così:

nella tabella di cui stiamo discutendo, avrò molti listini, associati a prodotti diversi es.

id     nome listino        Prodotto

        Listino1                   1

        Listino2                   1

        Listino3                    1

        Listino1                     2

        Listino2                     2

etc. per cui non credo di poter sfruttare in nessun modo l'id auto_increment di Mysql

il tutto perchè poi mi servirà(come accennato) a creare una select in cui scelto il prodotto, faccio scegliere il listino da applicare

non per niente nel titolo ho messo rompicapo, è una cavolata ma mi sta facendo perdere molto tempo

 :D

risposto 9 anni fa
yusizu
modificato 9 anni fa
X 0 X

up pls  :'(

risposto 9 anni fa
yusizu
X 0 X

Per tappare il "buco" creto che tu sia costretto a recuperare tutti i prodotti della lista incriminata, cancellarli dalla tabella ed inserirli nuovamente con una numerazione continua.

Se questa procedura viene fatta ad ogni cancellazione allora ti basterà togiere e reinserire solo le righe con indice successivo a quella cancellata.

 :bye:

risposto 9 anni fa
Gianni Tomasicchio
X 0 X

non so se ho capito bene, in pratica mi consigli di salvare da qualche parte il listino cancellato per poi reinserirlo al suo posto nella tabella d'origine....

....ma se per caso ne cancello due e poi vado ad inserirne uno, non avrò sempre un buco??

es:

 LISTNO1

LISTINO2

LISTINO3

LISTINO4

LISTINO5

se elimino LISTINO2 e LISTINO 4

a video avrò

LISTINO1

LISTINO3,

LISTINO5

se ne inserisco un'altro avrò?

LISTINO1

LISTINO2

LISTINO3

LISTNO5  //lasciando un buco qui... :-\

bho, mi sa che opterò per far modificare il nome del listino all'utente una volta cancellatone uno, nn vedo altra soluzione.

garzie Gianni  :bye:

risposto 9 anni fa
yusizu
X 0 X

intendevo dire che al momento del re-inserimento dovresti cambiare i nomi in modo da ricostruire una sequenza continua di indici. Le righe non vanno rimesse al loro posto così come le hai estratte altrimenti non cambierebbe niente.

 :bye:

risposto 9 anni fa
Gianni Tomasicchio
X 0 X

perdonami Gianni ma credo di non seguirti;

allora facendo il punto io inizialmente recupero la quantità di record della tabella "Listini" associati al prodotto Postato:

$query  = "SELECT COUNT(*) as quanti FROM prodotti WHERE prodotto='$_POST[prodotto]'";
$result = mysql_query($query);
$row = mysql_fetch_array($result);
$record =$row[quanti];
$totprodotti=$record+1;
$nome="Prodotto$toprodotti";

poi se viene eliminato un prodotto, lo cancello dalla tabella "Listini", prendo il resto dei record sempre da questa tabella, li inserisco in una nuova tabella "listini temporanei" e li elimino definitivamente dalla tabella "listini"

una volta fatta questa operazione dovrei contare il numero dei record presenti questa volta nella tabella "listinitemporanei" , inserirli con dei nomi sequenziali(non saprei come)nella tabella listini ed eliminarli definitivamente dalla tabella "listinitemporanei".

Spero sia questo che intendevi dire, e, se così fosse non saprei come reinserirli con dei nomi sequenziali.  >:(

grazie mille per la disponiblità  :bye:

risposto 9 anni fa
yusizu
X 0 X

intendevo più o meno questo, anche se non dicevo di salvare le righe in una tabella temporanea poiché non è necessario. Basta tenere tutto in un array.

Per ricreare i nomi corretti (LISTINO1, LISTINO2, ecc.) devi dimenticarti dei nomi che avevano all'inizio e ricrearli nuovamente (nello stesso modo in cui sono stati creati inizialmente) al momento del loro reinserimento nel database. Non dovrebbe essere un problema visto che si tratta di creare dei nomi con una parte fissa ('LISTINO') ed un indice che va incrementandosi regolarmente. Penso quindi che basti un ciclo for con $i che va da 1 al numero di righe da reinserire. A questo punto il nome diventa 'LISTINO' . $i

 :bye:

risposto 9 anni fa
Gianni Tomasicchio
X 0 X

Gent.mo Gianni,

saresti così cortese da postarmi un pò di codice, credimi ilfunzionamento del foreach proprio non mi vuole entrare in testa, eppure giorno dopo giorno mi rendo conto dell sua versatilità  :-\

grazie ancora  :bye:

risposto 9 anni fa
yusizu
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda