Aiuto struttura tabella mysql nel DB

  • Creatore Discussione Creatore Discussione bwasizi
  • Data di inizio Data di inizio

bwasizi

Nuovo Utente
21 Ago 2009
15
0
0
Buongiorno, sto organizzando un fantacalcio online (qualcuno di voi conoscerà sicuramente il famoso gioco) con php e mysql. Avevo bisogno di un vostro consiglio perchè non trovo la soluzione migliore. Per ogni giornata del campionato ho una tabella con 22 giocatori e rispettivo voto che si incrociano con i nomi delle squadre. In seguito viene eseguito il totale dei voti per ogni squadra.
Detto questo, è più giusto mettere come campi numero giocatore, nome gioc squadra 1, voto gioc squadra 1,nome gioc squadra2, voto gioc squadra 2..(in questa maniera potrei utilizzare il sum di mysql, ma all'iscrizione di ogni squadra dovrei modificare le colonne delle tabelle tramite alter) OPPURE mettere come campi nome squadra, nome gioc1, voto gioc1, nome gioc 2, voto gioc2...in questa maniera non potrei usare sum perchè i voti della stessa squadra sarebbero "in orizzontale", ma non altererei mai più la tabella...
Spero di essermi spiegato, grazie per l'attenzione.
 
Non ti sei spiegato... :cool:

Tabelle necessarie:

SQUADRA
-id
-squadra

GIOCATORI
-id
-giocatore

GIORNATE
-id
-data

VOTI
-idgiornata
-idsquadra
-idgiocatore
-voto

Spero possa esserti di aiuto a risolvere il problema...
 
---è simile a quello che ho fatto io...ma l'update automatico dei voti (li prendo da una pagina internet pubblica cercando il nome) in questa maniera risulta abbastanza lungo perchè per ogni giocatore è necessario un update ed all'aumentare del numero delle squadre potrebbe sforare il timeout della pagina php...è per questo che pensavo di aggiungere una colonna ogni squadra mentre ogni riga sarà riservata al primo giocatore, la seconda riga al secondo giocatore...eccetera...in questa maniera devo sempre fare al massimo 18 update (che è il numero di giocatori presentati in una formazione comprensivo dei panchinari..)
 
ok, stai lavorando un DB relazionale quindi attento a replicare ogni volta un campo, potrebbe andarti bene all'inizio ma poi col tempo ti ritroveresti un DB lento lento nelle query.

Non riesco a capire bene come fai a reperire le info che necessiti dalla pagina remota (preg_match?) e come è formata la pagina (se me la indichi potrei aiutarti meglio).

Cmq per prima cosa è meglio che ti salvi la pagina in locale e da li la analizzi una volta che hai finito la elimini.

Per ovviare al problema del timeout prova con

system('/usr/bin/php path/dello/script.php');

facendo così in teoria non incorri nel timeout perchè fai girare lo script in background. (sempre che l'hosting su cui stai implementi il php in maniera CGI).

ciao
 
dunque....con php utilizzo file_get_contents con il quale reperisco l'html, poi utilizzo str_pos per reperire giocatore e relativo voto....la pagina è quella della gazzetta ufficiale...http://magic.gazzetta.it/magiccampionato/09-10/free/statistiche/?98e3c4b503...io ho fatto una tabella per ogni giornata dando ad ogni squadra tre colonne per ogni tabella...(id, ruoloid, votoid)...sono consapevole che è una soluzione non ottima, ma mi viene comodo quando poi faccio la query per calcolare il totale di giornata...che ne pensi? grazie per le risposte...
ps: il mio hosting è uno dei peggiori dal punto di vista della flessibilità (aruba), ma anche il fattore economico ha la sua importanza....0:)
 
Spero di aver capito male quando ho letto che fai una tabella nuova per ogni giornata... :cool:

Sorvolando su questo per fare il grab delle pagine mi permetto di consigliarti questa classe: http://sourceforge.net/projects/simplehtmldom/

La metti nella stessa cartella dove esegui il codice (o dove ti piace di più) e la richiami nel tuo script.

Sotto ti posto il codice per estrarre tutte le info di cui hai bisogno (sei fortunato che sono in giornata ... 0:))

include('simple_html_dom.php');

$content = file_get_html('http://magic.gazzetta.it/magiccampionato/09-10/free/statistiche/?98e3c4b503...io');

$tmpGiornata = $content->find('div[class=freeTableTitle]',0)->find('span[class=giornata]',0)->innertext;

$giornata = trim(str_replace('Giornata','',$tmpGiornata)); //qui esce il numero di giornata

//echo $giornata."\n";

unset($tmpGiornata); //svuoti la variabile non si sa mai

$tmpGiornata = $content->find('div[class=freeTable]',0)->find('table',0);

foreach($tmpGiornata->find('tr') as $tr) {

$arr['giornata'] = $giornata;
$arr[$n]['codice'] = $tr->find('td',0)->innertext;
$arr[$n]['giocatore'] = $tr->find('td',1)->innertext;
$arr[$n]['squadra'] = $tr->find('td',2)->innertext;
$arr[$n]['voto'] = $tr->find('td',3)->innertext;
$arr[$n]['gol'] = $tr->find('td',4)->innertext;
$arr[$n]['rig'] = $tr->find('td',5)->innertext;
$arr[$n]['amm'] = $tr->find('td',6)->innertext;
$arr[$n]['esp'] = $tr->find('td',7)->innertext;
$arr[$n]['ax'] = $tr->find('td',8)->innertext;
$arr[$n]['pm'] = $tr->find('td',9)->innertext;

$n++;

}

//print_r($arr);

Provato ed eseguito correttamente in una manciata di secondi

come risultato otterrai un array simile a questo

[1] => Array
(
[codice] => 101
[giocatore] => ABBIATI Christian
[squadra] => MIL
[voto] => 0,00
[gol] => 0
[rig] => 0
[amm] => 0
[esp] => 0
[ax] => 0
[pm] => 0,00
)

[2] => Array
(
[codice] => 102
[giocatore] => AMELIA Marco
[squadra] => GEN
[voto] => 6,00
[gol] => 1
[rig] => 0
[amm] => 0
[esp] => 0
[ax] => 0
[pm] => 5,00
)
per tutti i giocatori che compongono la tabella

Poi con i dati riempi le tabelle del db

Per sapere il totale di giornata basterà eseguire

select sum(tb.voto) as totale from db.voti tb where idgiornata = id-della-tabella-giornata and idsquadra = id-della-tabella-squadra

Se vuoi anche la media scrivi sum(tb.voto) as totale, avg(tb.voto) as media ecc. ecc.

Se proprio vogliamo fare i "seri" crea anche il campo anno nella tabella giornate (id,giornata,anno).

Come ogni lavoro progetta bene la partenza perchè se fai una partenza così così il seguito sarà un disastro. Te lo dico per esperienza e notti insonne :cool:.

Se hai bisogno siamo qui ciao
 
Per correttezza ho provato ad eseguire il codice anche per altri link e con tabella simile (portieri, difersori ecc.) e l'array è esatto quindi lo puoi utilizzare tranquillamente su tutte le tabelle, fai sempre delle prove prima.

ciao
 
Ok, quello che dici tu è perfetto ( a parte la somma che non è così semplice perché ci sono titolari e riserve e non tutti portano punti alla somma finale, ma è un dettaglio), ma non risolve il motivo per cui ho cambiato strada, cioè il timeout...in questa maniera ho un update se ho ben capito per ogni giocatore...e con l'aumentare delle squadre puó essere un problema...
Inoltre, da ignorante ti chiedo: c'è così tanta differenza a livello di prestazioni tra 1 tabella per tutte le giornate e 38 tabelle una per ogni giornata...ripeto che ho aumentato il numero per ovviare al timeout e fare meno update...grazie, ciao
 
Scusami te se non riesco a capire la storia degli update, con il metodo che ti ho indicato hai solo inserimenti. Se non vuoi avere una cronistoria dei dati puoi sempre usare truncate su voti per svuotare la tabella.
Credimi che se ci pensi bene stai facendo un lavoro veramente macchinoso, poi ognuno è libero di procedere come meglio crede. Stai lavorando con un database relazionale e una volta inseriti i dati per mezzo delle query te li giri come vuoi.

Non riesco a capire dove sta il problema di timeout, come fai ad avere timeout su uno script de genere, forse è meglio che posti il codice della pagine che ti provoca il timeout.

Ciao.
 
...aspetta mi spiego meglio...nel fantacalcio ogni squadra ha un gruppo di giocatori. Ogni giornata ogni squadra decide di schierarne un sottoinsieme alcuni titolari ed alcune riserve...la cosiddetta consegna della formazione prima dell'inizio della partita. Questo corrisponde ad un insert multiplo nella tabella voti nel tuo schema...nel momento in cui vengono pubblicati i voti, allora l'inserimento degli stessi corrisponde ad un update perchè i record della formazione ci sono già...e questo a quanto ne so io non può essere multiplo, ma uno ogni riga...
A questo punto all'aumentare delle squadre diventerebbe proibitivo l'update...spero di raseremo spiegato...
 
Ciao, ho risolto utilizzando la tua struttura e mettendo un campo formazione nella tabella squadre...in questo modo posso utilizzare l'insert....quindi GRAZIE e scusa per il disturbo...:cool::cool::cool:
 

Discussioni simili