Problema creazione tabella tramite PHP

bwasizi

Nuovo Utente
21 Ago 2009
15
0
0
Buongiorno avrei un piccolo problemino....ho creato un'accesso con nome utente e password ed appena l'utente viene registrato viene creata una tabella personale in un database mysql. Il mio problema è che se l'utente immette caratteri non alfanumerici (tipo ',- ecc...) il database non mi permette la creazione della tabella....ora è vero che posso ovviare con str_replace col php co i caratteri più comuni ma non sarebbe possibile fare accettare tali caratteri al database nella creazione della tabella? (nel'inserimento delle righe non ho alcun problema, e la collation è la stessa per tutto il db: "latin1_swedish_ci") :confused:
Grazie per l'attenzione, attendo risposte :D:D
 

satifal

Utente Attivo
25 Set 2008
522
13
0
Roma
Probabilmente puoi risolvere il problema utilizzando la codifica UTF8.
 

bwasizi

Nuovo Utente
21 Ago 2009
15
0
0
ma se è un problema di charachter set allora perchè nelle righe me lo fa inserire? (cioè se faccio un'insert tutto ok, se faccio create table...errore..me lo chiedevo giusto così, prima di modificare decine di tabelle...):D
 

satifal

Utente Attivo
25 Set 2008
522
13
0
Roma
Ma nella create table non dovrebbero esserci riferimenti ai dati inseriti dall'utente. Con quell'istruzione crei semplicemente una nuova tabella con le rispettive colonne, a meno che non tenti di creare colonne con caratteri non standard.

P.S.
Comunque non capisco la necessità di creare nuove tabelle per ogni utente. Sarebbe più corretto e logico avere delle tabelle specifiche che andranno a contenere i dati dei vari utenti registrati. A meno che tu non abbia qualche esigenza particolare che mi sfugge.
 

bwasizi

Nuovo Utente
21 Ago 2009
15
0
0
...ad ogni utente è associata una squadra che prende il nome dal nome utente....quindi una volta registrato creo una tabella col nome utente...l'unica cosa che non va con determinati caratteri è il nome della tabella...se contiene caratteri "speciali" non alfanumerici mi dà errore...
 

Eliox

Utente Attivo
25 Feb 2005
4.390
3
0
tieni conto prima di tutto che mysql prevede delle parole riservate che non possono essere utilizzate per i nomi di tabella, l'elenco lo trovi qui.
In secondo luogo sono possibili problemi di compatibilita' con il set ascii esteso, meglio utilzzare set di caratteri ascii dal 32 fino a 127.
In alternativa potresti ripulire i nomi utente con i caratteri speciali eliminandoli tramite reg exp.
 

programmatore

Utente Attivo
21 Ago 2009
111
0
0
programmatore.altervista.org
Se quando crei un nuovo cliente crei una nuova tabella ti troverai ben presto con un database umanamente ingestibile (es. 1000 tabelle oltre a quelle del db). Ogni query sarà un suicidio, oltre al problema che incontreresti se un utente 'indovina' il nome di una delle tue tabelle del db già esistenti, è proprio un metodo sbagliato: devi sicuramente creare dei record, non delle tabelle!

Ad ogni modo per ovviare all'inconveniente dei nomi, puoi sempre usare l'id dell'utente per creare la tabella. Mi spiego meglio.
Ipotizzo che la tabella utente sia:
UTENTE(id, nome, password), dove id è un contatore ed è la chiave primaria (di solito si fa così).
Supponiamo che hai il seguente record (utente nuovo appena registrato):
[123, 'pippo', 'pwd']

A questo punto anziché creare la tabella usando UTENTE.nome (cioè "pippo"), crei la tabella "tabutente123" (usando appunto l'id, preceduto da un prefisso che vuoi tu, in questo caso 'tabutente').
In questo modo la tabella sarà sempre creabile.
 

bwasizi

Nuovo Utente
21 Ago 2009
15
0
0
In alternativa potresti ripulire i nomi utente con i caratteri speciali eliminandoli tramite reg exp.
è una funzione php? sarebe ottima ora cerco....

Se quando crei un nuovo cliente crei una nuova tabella ti troverai ben presto con un database umanamente ingestibile (es. 1000 tabelle oltre a quelle del db). Ogni query sarà un suicidio, oltre al problema che incontreresti se un utente 'indovina' il nome di una delle tue tabelle del db già esistenti, è proprio un metodo sbagliato: devi sicuramente creare dei record, non delle tabelle!

Ad ogni modo per ovviare all'inconveniente dei nomi, puoi sempre usare l'id dell'utente per creare la tabella. Mi spiego meglio.
Ipotizzo che la tabella utente sia:
UTENTE(id, nome, password), dove id è un contatore ed è la chiave primaria (di solito si fa così).
Supponiamo che hai il seguente record (utente nuovo appena registrato):
[123, 'pippo', 'pwd']

A questo punto anziché creare la tabella usando UTENTE.nome (cioè "pippo"), crei la tabella "tabutente123" (usando appunto l'id, preceduto da un prefisso che vuoi tu, in questo caso 'tabutente').
In questo modo la tabella sarà sempre creabile.
Perdonami, io non sono un esperto di database ma sapevo che i database sono fatti apposta per gestire una grande quantita di tabelle....ad esempio mi ricordo che un forum phpbb conteneva quasi 400 tabelle e funzionava senza problemi...tra l'altro non le userei mai congiuntamente con dei JOIN, ma una alla volta...
cmq ottima la soluzione dell'esempio a cui non avevo pensato....grazie..:fonzie:
 

satifal

Utente Attivo
25 Set 2008
522
13
0
Roma
I database gestiscono grandi quantità di dati e non di tabelle. Nonostante ciò nulla ti vieta di creare decine di tabelle, ma ciò non toglie che si tratta di una strategia assolutamente errata.
Se devi associare una squadra ad ogni utente sarebbe molto più corretto e performante avere solo due tabelle (utenti e squadre). Nella tabella utenti avrai una foreign key che lega un particolare utente alla sua squadra.
 
Ultima modifica:

programmatore

Utente Attivo
21 Ago 2009
111
0
0
programmatore.altervista.org
Non cercherei la regex. Ti complichi la vita.
Ti spiego con un esempio: i nomi utente "-pippo!", "!pippo","p-i-p-p-o" verrebbero tutti trasformati dalla regex in "pippo". Risultato: dovresti inventarti un modo per avere 3 nomi diversi che siano validi (che è il problema dal quale eri partito).

Per il fatto delle 400 tabelle, sono d'accordissimo con te: database con molte tabelle non sono problematiche, finché però queste sono fisse e ben definite. Se qualcuno indovina per caso il nome di una tua tabella 'fissa' non ne verresti più fuori.

ad ogni utente è associata una squadra che prende il nome dal nome utente
Avrai la tabella UTENTE(id, nome, ...altri dati...),
COMPONENTE_SQUADRA(id, id_utente, nome_componente, ...altri dati...).
In entrambi i casi, id è chiave primaria, di tipo contatore.
Il nome della squadra la leggerai da UTENTE.nome (inutile ricopiarla altrove).
In COMPONENTE_SQUADRA ci sono tutti i componenti della squadra.
id_utente conterrà il valore id dell'utente (campo UTENTE.id).

Esempio pratico:
UTENTE(5, 'user123',...)
COMPONENTE_SQUADRA(1, 5, 'pippo')
COMPONENTE_SQUADRA(2, 5, 'pluto')
COMPONENTE_SQUADRA(3, 5, 'paperino')
Risultato: l'utente 'user123' ha la squadra 'user123' composta da pippo, pluto e paperino.
 

bwasizi

Nuovo Utente
21 Ago 2009
15
0
0
Vi ringrazio per le risposte, vi ripeto che sono un mezzo principiante...

Nonostante ciò nulla ti vieta di creare decine di tabelle, ma ciò non toglie che si tratta di una strategia assolutamente errata.
ok, sarà meglio che riveda il progetto...

Se qualcuno indovina per caso il nome di una tua tabella 'fissa' non ne verresti più fuori.
il resto l'ho capito, ma questa non mi è chiara...ho un database mysql protetto da nome utente e password...è così facile bucarlo?:confused:

e per fissa intendi senza foreign key?
 

programmatore

Utente Attivo
21 Ago 2009
111
0
0
programmatore.altervista.org
il resto l'ho capito, ma questa non mi è chiara...ho un database mysql protetto da nome utente e password...è così facile bucarlo?:confused:

e per fissa intendi senza foreign key?
Per 'fissa' intendo che non viene creata 'al volo', ma che la crei durante la creazione del database (per intenderci). Ad esempio la tabella 'utente' deve esistere ed esisterà sempre nel tuo database, mentre la tabella pippo creata per l'utente pippo c'è solo se si registra un utente con nome pippo.
Ipotizziamo che quando un utente cancella l'account rimuovi anche la sua tabella. Quindi mi iscrivo come 'pippo', crei la tabella 'pippo'. Poi cancello l'account e rimuovi la tabella 'pippo'. Tutto ok.
Se però il mio account è 'utente', ci saranno degli errori in creazione della tabella (esiste già), quando cancello l'account, ti fai fuori tutti gli utenti in un colpo solo.
Questo è un esempio di cosa potrebbe succedere. Praticamente stai dando il potere ad un utente qualunque di creare e distruggere tabelle a suo piacimento. Con tabutente + id_utente la cosa è già più sicura (anche se ancora non bella da fare).
 

bwasizi

Nuovo Utente
21 Ago 2009
15
0
0
Compreso il tutto, io avevo ovviato a questo problema mandando un messaggio all'utente al momento dell'errore in fase di creazione e non creando successivamente l'utente...