Visualizzazione dei risultati da 1 a 10 su 10

Discussione: Gestione Calendario

  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2004
    Messaggi
    54

    Gestione Calendario

    Buondì forum,
    sto creando il sito alla mia squadra di calcio e vorrei creare in modo dinamico il calendario delle giornate di campionato.. in un primo momento avevo pensato di "risolvere" con pagine html (per ogni giornata una pagina... ma sarebbero 28 pagine :berto: ) che linkavo fra di loro.. poi visto che mi sembrava abbastanza dispendioso in termini di tempo per creare le pagine e aggiornamento delle stesse, stavo pensando di implementare il tutto in pagine php con le quali mi appoggiavo al database.. Mi conviene più le pagine hmtl? E' fattibile come soluzione? Se si, come potrei implementare il tutto? :master:
    grazie per le risposte!

  2. #2
    mmm di sicuro ti è più semplice implementare un DB in MySQL con PHP. Per creare il db corrispondente devi farti un paio di domande:

    1- Che dati vuoi visualizzare nella pagina di una singola giornata di campionato?
    2- Questi dati di che tipo sono (numeri, testo, data, booleani (vero falso), etc)
    3- Quando hai risposto alle prime domande, puoi creare la tabella Giornata_Campionato, ma andiamo con ordine, prima le due domande sopra ;-P

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2004
    Messaggi
    54
    allora..
    nella pagina vorrei visualizzare le partite e il relativo punteggio..
    Esempio:

    Squadra_1 0 - 0 Squadra_2

    ovviamente per 7/8 incontri.. i dati sarebbero numeri (gol) e testo(nome squadra).. un tocco in + sarebbe aggiornare un'eventuale classifica in base ai risultati ma quello è un passo successivo..

  4. #4
    ti conviene pensare a questo passo mentre pensi al DB ...

    Allora, io farei così:

    una tabella Incontro:
    codice:
    CREATE TABLE `Incontro` (
      `id` INT NOT NULL AUTO_INCREMENT,
      `casa` VARCHAR(100) NOT NULL,
      `ospiti` VARCHAR(100) NOT NULL,
      `punteggioCasa` INT NOT NULL,
      `punteggioOspiti` INT NOT NULL,
      `risultato` ENUM('1','2','X') NOT NULL DEFAULT 'X',
      `id_giornata` INT NOT NULL,
      PRIMARY KEY (`id`) 
    )
    CHARACTER SET utf8;
    Dai un occhiata a questa tabella:

    L'incontro (la partita, io l'ho chiamato incontro, ma tu puoi dargli il nome che vuoi) avrà un Identificatore Primary KEY (id) che significa che sarà unico e verrà usato per le ricerche nella tabella.

    Poi gli ho messo 2 varchar (casa e ospiti) che sono i nomi delle squadre che hanno giocato, poi il punteggio di ogni squadra (come INT).

    Il risultato mi sembra una buona idea per permettere di fare ricerche intuitive, ma in effetti puoi evitarlo facendo query apposite (cioè se punteggioCasa > punteggioOspiti sarà 1, < sarà 2, X altrimenti), potresti fare anche una procedura puramente SQL per inserire il risultato a partire dai dati della riga, ma è roba un po' avanzata, per questa versione è meglio se lo togli.

    L'ultima riga "id_giornata" necessita una piccola spiegazione:

    Io penso che, in una determinata giornata, potrebbero avvenire anche altre cose che non rigurdano la partita in generale, o comuque che non avrebbero senso nella tabella dell'incontro (che indica che partita c'è stata ed il punteggio). Per esempio potresti voler stilare la lista dei Gol della giornata, oppure, degli acquisti o prestiti (che non c'entrano con le partite). A questo proposito ti consiglio di creare un'altra tabella Giornata:

    codice:
    CREATE TABLE `Giornata` (
      `id` INT NOT NULL AUTO_INCREMENT,
      `data` DATE NOT NULL COMMENT '	',
      PRIMARY KEY (`id`)
    )
    CHARACTER SET utf8;
    Comq puoi notare, non ho messo praticamente niente solo l'id e la data della giornata. Quando andrai a visualizzare le partite per una determinata giornata, andrai ad indicare l'Id della giornata stessa, durante la query:

    "SELECT * FROM Incontro WHERE id_giornata = $id_giornata"

    In questo modo otterrai tutti gli incontri per una determinata giornata.

    Vuoi fare la classifica dei punti in base hai gol:

    fai così: metti di avere il nome delle squadra salvato in $squadra:

    "SELECT punteggioCasa FROM Incontro WHERE casa LIKE '$squadra'" e "SELECT punteggioOspiti FROM Incontro WHERE ospiti LIKE '$squadra'"
    La somma di questi risultati ti darà il totale dei gol (di TUTTE le giornate, se invece vuoi solo per alcune giornate fai "SELECT punteggioCasa FROM Incontro WHERE Incontro.casa LIKE '$squadra' AND Giornata.data >= '2008-01-01' AND Giornata.data <= '2008-12-31' AND Giornata.id = Incontro.id_giornata" per avere i gol solo del 2008)

    Questo sistema è chiamato, database relazionale, cioè si crea una relazione tra Incontro e Giornata in modo che i dati siano distributi su due tabelle e tu non abbia bisogno di replicare tutti i dati della tabella giornata nella tabella incontro. Inoltre, questo sistema, permette di legare la tabella giornata ad altre (tipo i Gol)

    codice:
    CREATE TABLE `Gol` (
      `id` INT NOT NULL AUTO_INCREMENT,
      `giocatore` VARCHAR(200) NOT NULL,
      `id_incontro` INT NOT NULL,
      `tempo` INT NOT NULL,
      PRIMARY KEY (`id`),
      CONSTRAINT `incontro` FOREIGN KEY `incontro` (`id_incontro`)
        REFERENCES `Incontro` (`id`)
        ON DELETE CASCADE
    )
    CHARACTER SET utf8;
    Questa tabella conterrà ogni gol fatto,ciascun gol avrà il nome del giocatore, ed il tempo (da 0 a 90, o 120 in caso di supplementari) passato dall'inizio.
    Colgo l'occasione per mostrarti una particolarità dei DB relazionali: le FOREIGN KEY.

    Possiamo dire con tranquillità che se non esiste l'incontro, non esiste il Gol. Per questo motivo, ho indicato una Foreign Key sul campo id_incontro legata al campo id di Incontro con regola DELETE CASCADE , significa che, se cancelli l'incontro corrispondente, anche tutti i gol legati a quell'incontro verranno cancellati.

    Possiamo fare lo stesso per gli incontri sulle giornate: se non esiste la giornata come può esistere l'Incontro?

    Si può fare allora:
    codice:
    ALTER TABLE `Incontro` ADD CONSTRAINT `giornata` FOREIGN KEY `giornata` (`id_giornata`)
        REFERENCES `Giornata` (`id`)
        ON DELETE CASCADE;
    Non ho fatto altro che aggiungere una Foreign Key ad Incontro, tale che se una Giornata viene cancellata, tutti gli incontri legati a quella giornata (con id_giornata = all' id della giornata cancellata) vengono a loro volta cancellati e, di consequenza, tutti i Gol legati a quell'incontro vengono cancellati automaticamente.

    le Foreign Key sono uno strumento potentissimo per evitare di lasciare nel DB dati inutili.

    Ora, a te la scelta, vuoi parlare dell'interfaccia in PHP o hai in mente altre possibilità da implementare?

  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2004
    Messaggi
    54
    VVoVe:

    mamma mia.. spiegazione dettagliata e grazie alla quale ho capito la tua idea che mi pare ben strutturata!

    All'uso dei vincoli interelazionali fra le tabelle c'avevo pensato proprio per legare eventualmente la giornata di campionato e la classifica in modo da aggiornare tutto nel modo più conveniente possibile..

    riguardo al campo ID_GIORNATA della tabella INCONTRO potrebbe tornarmi utile se decido di mettere i marcatori/diffidati/ammoniti/espulsi.. ma questa cosa non so quanto mi tornerebbe tanto utile in quanto vorrei tenere traccia solo dei dati dei giocatori che fanno parte della mia squadra..

    per l'interfaccia php ho creato una pagina per la classifica ed una per il calendario.. quella della classifica è già scritta e prende i dati da una tabella che ho già creato e che ha la seguente struttura:

    Classifica
    {
    Id tinyint(4) PRIMARY KEY AUTO_INCREMENT
    Pos. tinyint(4)
    Squadra tinytext
    Punti tinyint(4)
    Giocate tinyint(4)
    Vinte tinyint(4)
    Pareggiate tinyint(4)
    Perse tinyint(4)
    Gol Fatti tinyint(4)
    Gol Subiti tinyint(4)
    CD tinyint(4) (Classifica disciplina)
    }

    per il calendario avevo pensato ad una pagina con la lista delle partite della giornata X ma che mette a disposizione di che le consulta anche la possibilità di vedere le giornate precedenti a quella da giocare.. non so se mi sono spiegato bene..

  6. #6
    scusa ma le righe della classifica che rappresentano?


    Poi tinyint per un ID?? sono solo 255 record...

    Punti tinyint(4)
    Giocate tinyint(4)
    Vinte tinyint(4)
    Pareggiate tinyint(4)
    Perse tinyint(4)
    diventano inutili se usi l'altro sistema, dato che, con query appropriate ottieni gli stessi dati senza replicarli in più tabelle.

    Gol Fatti tinyint(4)
    Gol Subiti tinyint(4)
    Stesso discorso, ci tengo a precisare che nel tuo modo, puoi sono avere i totali e non discriminarli per anno, stagione, mese o anche solo giornata.

    CD tinyint(4) (Classifica disciplina)
    Non ho idea di che sia ma sono sicuro che un ENUM sarebbe più efficace.

    Comunque se ho capito che rappresenta Classifica, non ha senso fare un TABELLA per la classifica, dato che la stessa non ha DATI propri ma solo DERIVAZIONI da altri dati. Devi vedere il DB come un Pezzo di carta nella quale vanno indicari i dati il più possibile invariabili, mentre dati come la classifica li ottieni analizzando i dati del DB con una procedura. In un secondo momento puoi pensare di aggiungere campi autogenerarti tramite STORE PROCEDURE, come il punteggio che, se non mi ricordo male è calcolato sulla base delle partite vinte, e con quale vantaggio, e partite pareggiate, che potrebbe essere utile avere sempre pronto e non calcolarlo tutte le volte.

    A quel punto ti farebbe più comodo una tabella Squadra (avente come contenuto le appartenenti alla stessa categoria della tua), con id, nome e punteggio (calcolato con una STORE PROCEDURE), poi relazionarla alle altre tabelle (tipo in Incontro al posto di ospite e casa ci metti id_ospite ed id_casa, legato all'id di Squadra)

  7. #7
    Utente di HTML.it
    Registrato dal
    Mar 2004
    Messaggi
    54
    L'Id l'ho messo tinyint perchè tanto le squadre sono 12/14 quindi non mi servirebbe un numero alto..

    per gli altri campi hai ragione te.. posso derivarli dalle tabelle che hai scritto te prima..

    infatti la soluzione più logica e quella che hai suggerito te cioè quella di fare una tabella per le squadre e poi da quella ricavare il calendario e la classifica..

    non ho capito molto le STORE PROCEDURE in cosa consistono.. fanno parte di PHP o di Mysql? :master:

  8. #8

  9. #9
    Utente di HTML.it
    Registrato dal
    Mar 2004
    Messaggi
    54
    grazie per il link..
    quindi grazie alle store procedure riesco ad ottenere i dati che mi serviranno per costruire, per esempio la classifica.. giusto?

  10. #10
    ma, io la classifica (se per classifica intendi le squadre in ordine di punti fatti) la otterrei con una

    select * from Squadra ODER BY punteggio DESC

    Per il punteggio, in effetti sarebbe un po' difficile farlo con le funzioni MySQL, ti conviene magari fare un UPDATE a in PHP ogni volta che inserisci una partita (Incontro), aggiornando il punteggio in caso di vittoria, o pareggio.

    tu potresti fare un Trigger per la tabella Incontro, in modo che il risultato (1,2,X) si autoaggiornasse ad ogni inserimento o modifica.

    Successivamente, per ottenere il punteggio di una squadra ti basterebbe fare:

    "SELECT COUNT(id) FROM Incontro WHERE casa LIKE '$squadra' AND risultato = '1'" * 3 +
    "SELECT COUNT(id) FROM Incontro WHERE casa LIKE '$squadra' AND risultato = 'X'" +
    "SELECT COUNT(id) FROM Incontro WHERE ospiti LIKE '$squadra' AND risultato = '2'" * 3 +
    "SELECT COUNT(id) FROM Incontro WHERE ospiti LIKE '$squadra' AND risultato = 'X'"

    Poi, così su due piedi, non mi viene in mente come farlo fare a MySQL con una sola query, ma sicuramente qualcun'altro ti potrà dare una mano.

    L'unica cosa che non mi piace è che in Incontro una squadra può essere sia casa che ospiti, quindi devi controllarle entrambe. Sfortunatamente, non vedo modo per taglare la tabella in modo da gestire l'incontro per singola squadra...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.