Newsgroup: it.comp.www.php
Titolo: select con (eventuali) relationships

salve a tutti,
ho la necessita' di effetturare una select abbastanza complessa su una 
tabella.
in pratica devo fare in modo di accorgermi con php SE uno o piu' campi 
sono relazionati ad es. "1:n" o "n:n" o "n:1" con altri campi di altre 
tabelle.
di partenza non so niente, non so se la tabella in questione "ospita" un 
campo "padre" o "figlio" ne' quanti, caso mai, ce ne possono essere.
so solo il nome della tabella che sto visualizzando :-/
in piu', nel caso che vengano individuate le relazioni, nella <table> 
che stampa a video i records, vorrei mostrare lo "pseudo-valore" del 
campo relazionato (se, quindi, e' un campo "figlio") estratto dal valore 
del campo "padre".
non so se mi sono spiegato.
esempio: tabella giocatori
nella tabella "giocatori" c'e' un campo numerico "squadra" nel quale 
c'e' valorizzato l'id della squadra di appartenenza, la quale squadra e' 
un record della tabella "squadre" che ha, logicamente, un nome ;)
dovrei prima di tutto ricavarmi eventuali relazioni sui campi che legano 
le due tabelle, poi stampare a video (nella tabella "giocatori") il nome 
della squadra anziche' il valore numerico (della squadra).
l'e' un bel casotto :-/ e sono completamente in alto mare.
:(
sp-

 di partenza non so niente, 
Perche?
-- 
I am what I am, I do what I can
Cerchi un programmatore PHP/MySQL? 
http://url.repository.biz/go/1Y
Votami! 
http://www.phpclasses.org/vote.html
L'uomo, conscio di sbagliare, persevera.

 Perche?
perche' si tratta di una sorta di backoffice multi-utente multi-db 
(solita interfaccia, solite operazioni, soliti FILES php, ma con db 
diverso), al quale viene passato soltanto username, password e db.
al resto deve pensare l'interfaccia web con php.
una volta che mi ricavo il nome delle tabelle, da queste devo ottenere 
tutto il resto (+ o meno).
ad es. phpmyadmin ricava credo quasi tutto se non tutto da mysql.
nel mio caso le esigenze sono molto molto + modeste, in quanto 
l'applicazione non e' rivolta all'amministratore (che giustamente vuole 
poter sapere e fare tutto nel db in esame) ma all'utente finale.
quindi fra le prime cose da tener di conto c'e' l'usabilita' e la 
semplicita'.
e' facile pensare che ad es. se all'utente dico che il campo "squadra" 
della tabella "giocatori" ha valore 3 anziche' "juve", diventa difficile 
motivare la cosa (lui non capira' e se capira' gli tornera' difficile 
selezionare una voce "3" anziche' juve, per inserire che so.... buffon 
nella juve ;)
la facilita' di utilizzo verrebbe quindi compromessa e con essa diciamo 
lo "spirito" generale che regola un po' tutta l'applicazione.
per questo (ed altri) motivi sto cercando di "raggruppare" le cose che 
realmente servono all'utente, tralasciando tutto cio' che cmq non 
capirebbe e che, ovviamente, neanche potrebbe (in caso) apprezzare, ma 
anzi molto probabilmente gli complicherebbe la vita.
in piu' mettici che una volta finito vorrei mettere il tutto sotto GPL, 
quindi a chi interessera' dovra' presentarsi in modo che _qualunque_ sia 
la struttura del suo db, potra' lavorarci e volendo usarlo anche per 
scopi commerciali (a me interessa averne uno, e visto che ancora non ho 
trovato niente del genere in giro, penso che sarebbe bello se anche 
altri potessero usufruirne).
ecco in sostanza i principali motivi per i quali devo ottenere qualcosa 
di estremamente elastico, partendo da pochi dati e dinamicamente 
ricavandomi il resto :)
sinceramente: pensi che sia una select (sempre che ne basti una) 
parecchio perecchio complessa?
saluti
sp-

 parecchio perecchio complessa?
Assolutamente no, nessuna select puo' dirti come sono correlate
logicamente delle tabelle in MySQL, basta infatti che una tabella abbia
perso parte dell'integrita' referenziale (che al momento MySQL non
implementa) e qualsiasi algoritmo va a farsi benedire.
Se vuoi implementare un sistema del genere pensa piuttosto a definire
una struttura di configurazione con le contro palle (es. basata su XML)
in modo che sia sufficiente modificare la configurazione per cambiare
il funzionamento del backoffice.
-- 
I am what I am, I do what I can
Cerchi un programmatore PHP/MySQL? 
http://url.repository.biz/go/1Y
Vuoi supportarmi? 
http://url.repository.biz/go/3E


 il funzionamento del backoffice.
in parte lo sta gia' facendo, ma con gli array (che non so se sia la 
scelta giusta).
quel che devo fare (e che sta gia' facendo) e' molto semplice: creo un 
nuovo utente, per ogni tabella imposto i campi che deve vedere e quelli 
"nascosti" e li attivo/disattivo commentando o decommentando una riga 
dell'array $grid_tabella.
il tutto finisce in un : include $user."config.php"; //a inizio pagina
volendo lato admin, posso crearmi un'interfaccina php che edita tale 
file, per mezzo di checkbox che scrivono o tolgono "//" alla sx del nome 
del campo.
es:
$giocatori = array(
	id_giocatore,
//	nome,
	cognome,
	squadra,
//	reti
	);
$squadre = array(
	id_squadra,
	squadra,
//	scudetti,
	punteggio
	);
stesso discorso per le operazioni disponibili:
$op1 = array(
	visualizza,
	);
$op2 = array(
	visualizza,
	modifica,
	aggiungi,
	cancella
	);
$tabelle = array (
	"giocatori" => array(
		"oper" => implode(",",$op2),
		"campi" => $giocatori),
/*
	"risultati" => array(
		"oper" => implode(",",$op2),
		"campi" => $risultati),
*/
	"squadre" => array(
		"oper" => implode(",",$op1),
		"campi" => $squadre),
		);
per ora questo mi basta (e' anche abbastanza intiutivo e veloce da 
configurare, credo).
il file generato non pesera' granche' (siamo nell'ordine dei 10kb per un 
db con una decina di tabelle, e una decina di campi per ogni tabella.
adesso pero' dovrei trovare un metodo per ottenere le eventuali 
relazioni e mostrare a video non il valore dei due ID (id_giocatore e 
id_squadra) correlati ma il valore del campo es. "squadra".
potrei in sostanza impostare da innoDB le relazioni e dal solito file 
config le impostazioni sulle relazioni.
se cambiasse la struttura del db dovrei cambiare il file config, ok, ma 
questo non dovrebbe essere molto faticoso.
salu'
sp-

 questo non dovrebbe essere molto faticoso.
dimenticavo: in caso cambiasse la struttura del db significherebbe che o 
non e' stato ben progettato in fase iniziale, oppure ci sono delle 
modifiche sostanziali da fare, tali che coinciderebbero con la 
variazione delle pagina php del sito stesso, agganciato a questo backoffice.
quindi in linea di massima rientrerebbe nelle operazioni di 
straordinaria amministrazione, le quali esulano (un po') dal contesto 
"quotidiano", diciamo cosi', dell'utilizzo del backoffice.
riassumendo, potrei costruire le relazioni tra campi (penso che saranno 
praticamente sempre CASCADE) via innoDB e da un file di config configurarle.
ma cosa scrivere nel file config? :-/
un altro array - mantenendo lo "stile" attuale - oppure qualcos'altro, 
che comporterebbe per ragioni di conformita' il cambiamento anche 
dell'attuale file di config?
dubbio atroce...
sp-

per relazioni 1:n semplici potrebbe essere una cosa del genere?
$relationships = array(
   "child_tb.nomecampox" => "parent_tb.nomecampow",
   "child_tb.nomecampoy" => "parent_tb.nomecampok",
   "child_tb.nomecampoz" => "parent_tb.nomecampoj",
   );
ovvero, date le due tabelle in questione:
squadre:
id		smallint(10) auto_increment PK
squadra		varchar(50) notnull
altri campi	....
giocatori:
id		smallint(10) auto_increment PK
nome		varchar(50) notnull
cognome		varchar(50) notnull
squadra		smallint(10) unsigned notnull
reti		smallint(10)
potrei quindi impostare le relazioni 1:n da innoDB, della serie:
(parent) 
squadre.id
 -> (child) giocatori.squadra
quindi l'array diventerebbe:
$relationships = array(
   "giocatori.squadra" => "squadre.nome",
   );
ipotizziamo di essere quindi in SELECT della tabella "giocatori".
scorro tutti i record, cercando su $relationships:
array_search($tab . mysql_field_name(blabla), $relationships)
dato quindi l'id del record in corso su (id giocatori), se viene 
trovata, allora dalla "parent" (con "===" se non erro) otterrei 
"squadra.nome", dalla quale estrarre (nometabella) e (nomecampo) con le 
regex, ad es.
quindi fare una SELECT id, (nome campo) FROM (nometabella) WHERE id=(id 
record "giocatori" in corso) e ottenermi mysql_result(...nomecampo...) 
come valore.
non so, l'ho buttata li'...
e' una boiata? ^__^
sp-

 di compatibilita' a seconda di piattaforma/ambiente in uso?
XML e' pertabile alla nascita.
-- 
I am what I am, I do what I can
Vuoi supportarmi? 
http://url.repository.biz/go/3E
Votami! 
http://www.phpclasses.org/vote.html


 referenziale, ma relazioni "logiche", sono cose ben diverse.
si hai ragione, pardon.
;)
sp-