Query per eliminazione di molte tabelle

Pubblicità

nikolai93

Utente Attivo
Messaggi
566
Reazioni
53
Punteggio
56
Buongiorno a tutti,
sto sviluppando un'applicazione di gestione ticket per un helpdesk online.
Quando un utente crea un ticket, lo script va a creare una tabella nel database denominata "ticketN"
N è un numero progressivo automatico da 0 a 99999.
Mi servirebbe una query che cancelli tutte le tabelle presenti nel database chiamate in quel modo.
Qualcuno ha qualche idea a proposito?
Grazie a tutti, ciao!
 
anzichè creare ogni volta una tabella fisica hai pensato alle view? con create view puoi ottenere lo stesso risultato, solamente che i dati rimangono in memoria e non sul db. Per eliminarle poi basta un drop view. Altrimenti crea uno script php del genere:

$n; // n è il n° a cui sei arrivato
$query="DROP TABLE ticket";
for($i=0;$i<$n;$i++)
{
$temp=$query."$i";
mysql_query($temp);
}
 
ciao dfix!
non conoscevo le view (non programmo da molto e sono autodidatta).
proverò a studiarmi le view!
Per eliminare le tabelle ho creato una pagina php con dei checkbox a fianco alla stampa di tutte le tabelle ticket presenti nel database. (una sorta di menu alla phpmyadmin).
grazie!
 
Buongiorno a tutti,
sto sviluppando un'applicazione di gestione ticket per un helpdesk online.
Quando un utente crea un ticket, lo script va a creare una tabella nel database denominata "ticketN"
N è un numero progressivo automatico da 0 a 99999.
Mi servirebbe una query che cancelli tutte le tabelle presenti nel database chiamate in quel modo.
Qualcuno ha qualche idea a proposito?
Grazie a tutti, ciao!

Vedo già qualche errore nell'approccio...nel senso di critica costruttiva.

Visto che sei ancora in fase di progettazione, perché non dai una struttura scalabile al database in modo da rendere tutto indicizzabile e molto più performante e veloce come gestione?

Intendo dire che potresti avere una tabella indice nella quale trovi l'id del ticket, data (d.m.Y H:i:s), l'id del richiedente, l'id dell'assegnatario, urgenza, stato (aperto/chiuso) ed eventualmente la lingua (it, en, fr ecc..), una tabella con il contenuto dei ticket (id ticket collegato col prima, testo, data ultimo aggiornamento, id staff nel caso in cui il ticket possa essere spostato da un responsabile all'altro).

Eventualmente puoi creare una funzione di prunning che in pratica cancella o fa il back-up prima di cancellare i ticket più vecchi di tot giorni/mesi/anni. In pratica servirebbero due tipi di pulizia "automatica":
- il primo, che sposta i ticket chiusi da oltre 15-30gg in una tabella "semi-morta" in modo da poter essere ancora interrogati ma allo stesso tempo permette una ricerca veloce nella tabella attiva (quella con i ticket in lavorazione). idem per la tabella dei contenuti dei ticket, usi un cronjob e non ci pensi più
- il secondo, che va a fare il back-up in un file .sql una volta ogni tot mesi di questa tabella semi-morta prendendo come intervallo "fino ad oggi meno 30 giorni" ed a back-up riuscito elimina le stesse voci. Anche qui imposti un cronjob e tutto va in automatico.

In pratica con qualche semplice query avrai un sistema scalabile e performante. Scalabile perché all'id ticket puoi collegare future tabelle di commenti interni tra i componenti dello staff, eventuale report sul carico di lavoro e gradimento dello staff, molto probabile anche una parte contabile se l'azienda decide di fatturare una certa tipologia di ticket ecc ecc...tutte cose che possono essere sviluppate nel futuro. Performante perché invece di avere un database di 100.000 tabelle col rischio di trovare errori tipo "db.table not found" avrai semplicemente una tabella di 100.000 records per gli id dei ticket ed una di 500.000 per le risposte ai ticket (media di 5 risposte/ticket). Non ti preoccupare sulla quantità di records in una tabella, su un server medio ho un database che gira bene con 3Gb di dati (db mysql: la tabella più "corposa" balla tra 900.000 e 1.200.000 records).

In pratica, se fossi in te, darei al tuo database una struttura tipo:

- tickets: id(int, autoincrement), data (datetime), user_id (int), staff_id (int), urgenza_id (int), stato_id (int), language_id (int)
- tickets_contents: content_id (int, autoincrement), ticket_id (int), testo (text oppure blob), data_testo (datetime, on_update(CURRENT_DATETIME)), staff_id (int)
- tickets_old: la stessa identica struttura di tickets, qui vengono messi da parte i ticket di primo back-up
- tickets_contents_old: idem prima

Tralascio di proposito le tabelle linkate come users, staff, tabella stati_ticket (1 = chiuso; 2 = aperto, 3 = chiuso ma ritorno, ecc ), tabella urgenze_ticket (1 = urgentissimo, 2 = urgente ma non troppo, 3 = normale, 4 = fai con calma) e tutte le altre tabelle che possano "contornare" tutto quanto.
 
Ciao vbs!
ti ringrazio per la tua risposta.
Avevo effettivamente pensato di inserire tutte le risposte ai ticket in una sola tabella, ma ho avuto qualche problema a riguardo in fase di programmazione e ho scelto la via più semplice. Potrei effettivamente tornarci sopra ed implementarlo come mi hai suggerito sbattendomi un po' di più :)
Per quanto riguarda l'eliminazione del ticket ho fatto come mi hai detto. Quando un operatore chiude un ticket questo non viene più visualizzato allo stesso. Ho creato una pagina (visibile solo all'utente amministratore o supervisore) la quale evidenzia tutti i ticket chiusi e da la possibilità di archiviarli in una tabella old_tickets che viene backuppata in rete e cancellata mensilmente dal database master. Viene spostata anche la relativa tabella ticketN.
Proverò il sistema che mi hai suggerito e ti farò sapere!
Nel frattempo ti ringrazio molto per i tuoi suggerimenti, ciao! :)
 
Figurati, nel limite del tempo a disposizione ti potrei dare anche altri suggerimenti se ti servono. :)

Toglimi una curiosità: stai sviluppando in php+mysql?...per vedere se il mio intuito funge ancora...

So che all'inizio tutto sembra più complicato, ma una volta stabilita la struttura del database (per questo io uso carta e matita) tutto il resto viene da se. Nel caso in cui la progettazione del db è fata bene alla fine risparmi un sacco di tempo nella manutenzione e conseguente correzione di bug.

Negli anni ho imparato che se non parto col piede giusto, mi tocca sempre correggere del codice ed alterare la struttura delle tabelle con l'ovvia conseguenza della perdita di tempo ed ovvia introduzione di nuovi bug... La storia di carta e matita è vera, disegno il db mettendo anche la tipologia dei dati per ogni colonna e facendo anche la relazione tra di esse...poi cancello e ridisegno finché non sono sicuro di aver trovato la soluzione migliore. Normalmente ci perdo 2-3 giorni (se il progetto è corposo) ma alla fine guadagno almeno una settimana... ;)
 
esatto, php+mysql
Metterò in pratica il consiglio di usare carta e penna per creare la struttura del database.
Al momento sono un po' fermo con lo sviluppo ma non appena ricomincerò ti farò sapere come va!
Nel frattempo ti ringrazio per il tuo prezioso aiuto. :)
 
eccomi di nuovo!
spero che tu possa aiutarmi ancora...
nella pagina che visualizza tutti i ticket immessi voglio mettere una textbox che filtri i risultati (ad esempio per stato chiuso o aperto) e che lo faccia senza dover utilizzare un tasto che esegua la query e ricarichi la pagina.
spero di essermi spiegato bene, grazie in anticipo per il tuo aiuto!
Ciao!

- - - Updated - - -
@vbs
 
eccomi di nuovo!
spero che tu possa aiutarmi ancora...
nella pagina che visualizza tutti i ticket immessi voglio mettere una textbox che filtri i risultati (ad esempio per stato chiuso o aperto) e che lo faccia senza dover utilizzare un tasto che esegua la query e ricarichi la pagina.
spero di essermi spiegato bene, grazie in anticipo per il tuo aiuto!
Ciao!

- - - Updated - - -
@vbs

Ciao!

La più semplice e basilare soluzione è quella di mettere un'iframe che ha nel src="..." una pagina php che ti fa le query. Nel head puoi tranquillamente mettere <meta http-equiv="refresh" content="30; url=pagina_self.php"> per avere un auto-aggiornamento ogni 30 secondi (io lo farei ogni 5 minuti, quini invece il 30 dovresti avere 300)

in pratica avresti:
1. il file principale
PHP:
<html>
<head>
...
...
</head>
<body>
//codice blah blah...
<iframe src="query_tickets.php"></iframe>
</body>
</html>

2. la pagina secondaria
query_tickets.php
PHP:
<html>
<head>
<meta http-equiv="refresh" content="30; url=<?php echo $_SERVER['PHP_SELF']; ?>">
...
...
</head>
<body>
<?php
// codice query tickets aperti e/o chiusi...
// while $tickets ... echo $data
?>
</body>
</html>

Ovviamente ho indicato del codice molto molto basilare.

Se invece vuoi usare solo il php invece del <meta> potresti sostituire con:
PHP:
<?php header("Refresh: 10;url=pagina_di_destinazione"); ?>

ovviamente la funzione header deve stare "sopra" ogni output, nel senso che la devi scrivere molto prima di <html> ma non prima di un'eventuale session_start() se ne fai uso...

Chiedi pure se hai ancora bisogno ;)
 
Pubblicità
Pubblicità
Indietro
Top