Gestione di una tabella dinamica

ypsilon86

Utente Attivo
18 Dic 2012
48
0
0
Roma
Dovrei creare nel mio DataBase, una tabella che raccolga le informazioni che inserisco tramite form.

Nella prima figura, ho un form diviso per categorie, ad ogni categoria è associato un campo testo dove inserire dei numeri. Non è necessario inserire un numero per ogni categoria.

Spingendo INVIA, mi si apre la seconda pagina dove ho una tabella dinamica col numero esatto di righe (es. categoria Lavoro ho 3 partecipanti), le categorie con nessun partecipante vengono nascoste.

Il punto è, come posso strutturare le tabelle nel mio DB MySql?
Io farei una tabella chiamata GARA così definita:

CAMPO TIPO EXTRA KEY
id_gara -> int (11) AUTO_INCREMENT Primary
nome_gara -> varchar(30)
data_gara -> varchar(30)
giudice_gara -> varchar(30)
luogo_gara -> varchar(40)

Devo poi inserire in tabella GARA i campi che contengono i partecipanti (VeteraniMaschi, VetreaniFemmine, CampioniMaschi, CampioniFemmine...), tutti i campi potrebbero essere di tipo:Varchar, ma se ho come nell'esempio 3 partecipanti o anche di più per ogni categoria come faccio? Lì posso inserire un solo partecipante.....
 

Allegati

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.039
146
63
PR
www.borgo-italia.it
ciao
per capirsi meglio:
1) tu hai un form come nella figura a dx in cui (per ogni categoria) puoi inserire un numero
2) a subim ti appare il form nella fig a destra, immagino che se non metti alcun numero il secondo form non appaia, giusto?
ok sin qui? se si suddividiamo il problema
a) indipendentemente dai numeri inseriti la parte prima di MASCHI (da inserimento nomeexpo a giudice) è comune?
b) supponiamo che tu abbia inserito (es) solo maschi veterani 3
ti appare nel form solo (a parte la prima sezione se è comune)
MASCHI veterani


3° con vicino una casella con menù a discesa?
sin qui il mio ragionamento è giusto?
se è giusto penso che ti convenga fare due tabelle (penso come)
una quella che hai postato (GARE) e una collegata a gare con gli altri dati.
una domanda:
tu parli di categorie: MASCHI e FEMMINE a cui sono legate diciamo delle sottocategorie: veterani, campioni...ecc..
le sottocategorie le hai su una tabella del db?

il tutto poi andrà gestito con un bello script php
 

ypsilon86

Utente Attivo
18 Dic 2012
48
0
0
Roma
Rispondo alle tue domande:

a) Si, si può suddividere il problema come suggerisci tu, vale a dire che la prima parte (da nome_expo a giudice) è comune a tutte le categorie.
b) Si, appare una classifica (1, 2, 3 e così via..), con vicino un campo testo dove scrivo il nome del partecipante, e vicino, sulla stessa riga un menù a tendina dove scegliere il giudizio

Le sottocategorie (veteraniMaschi, campioniMaschi, giovaniFemmine, puppyFemmine...) avevo pensato inizialmente di inserirle direttamente nella tabella GARE, ma se faccio in questo modo posso inserire un solo partecipante per ogni categoria, se la gara ha 3 partecipanti per quella categoria??

Ho provato a fare così, ma poi mi si presenta il problema di non poter inserire più partecipanti per la stessa categoria...

Dopo il Submit mi appare il form della figura piu a destra, riporto il codice:

PHP:
<?php
if (!function_exists("GetSQLValueString")) {
function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "") 
{
  if (PHP_VERSION < 6) {
    $theValue = get_magic_quotes_gpc() ? stripslashes($theValue) : $theValue;
  }

  $theValue = function_exists("mysql_real_escape_string") ? mysql_real_escape_string($theValue) : mysql_escape_string($theValue);

  switch ($theType) {
    case "text":
      $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
      break;    
    case "long":
    case "int":
      $theValue = ($theValue != "") ? intval($theValue) : "NULL";
      break;
    case "double":
      $theValue = ($theValue != "") ? doubleval($theValue) : "NULL";
      break;
    case "date":
      $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
      break;
    case "defined":
      $theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue;
      break;
  }
  return $theValue;
}
}

$editFormAction = $_SERVER['PHP_SELF'];
if (isset($_SERVER['QUERY_STRING'])) {
  $editFormAction .= "?" . htmlentities($_SERVER['QUERY_STRING']);
}

if ((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "form1")) {
  $insertSQL = sprintf("INSERT INTO expo (nome_expo, data_expo, paese_expo, citta_expo, giudice, veteraniM, veteraniF, campioniM, campioniF, liberaM, liberaF, lavoroM, lavoroF, intermediaM, intermediaF, giovaniM, giovaniF, junioresM, junioresF, puppyM, puppyF) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)",
                       GetSQLValueString($_POST['nome_expo'], "text"),
                       GetSQLValueString($_POST['data_expo'], "text"),
                       GetSQLValueString($_POST['paese_expo'], "text"),
                       GetSQLValueString($_POST['citta_expo'], "text"),
                       GetSQLValueString($_POST['giudice'], "text"),
                       GetSQLValueString($_POST['veteraniM'], "text"),
                       GetSQLValueString($_POST['veteraniF'], "text"),
                       GetSQLValueString($_POST['campioniM'], "text"),
                       GetSQLValueString($_POST['campioniF'], "text"),
                       GetSQLValueString($_POST['liberaM'], "text"),
                       GetSQLValueString($_POST['liberaF'], "text"),
                       GetSQLValueString($_POST['lavoroM'], "text"),
                       GetSQLValueString($_POST['lavoroF'], "text"),
                       GetSQLValueString($_POST['intermediaM'], "text"),
                       GetSQLValueString($_POST['intermediaF'], "text"),
                       GetSQLValueString($_POST['giovaniM'], "text"),
                       GetSQLValueString($_POST['giovaniF'], "text"),
					   GetSQLValueString($_POST['junioresM'], "text"),
					   GetSQLValueString($_POST['junioresF'], "text"),
					   GetSQLValueString($_POST['puppyM'], "text"),
					   GetSQLValueString($_POST['puppyF'], "text"));

  mysql_select_db($database_conLup, $conLup);
  $Result1 = mysql_query($insertSQL, $conLup) or die(mysql_error());

  $insertGoTo = "prova2.php";
  if (isset($_SERVER['QUERY_STRING'])) {
    $insertGoTo .= (strpos($insertGoTo, '?')) ? "&" : "?";
    $insertGoTo .= $_SERVER['QUERY_STRING'];
  }
  header(sprintf("Location: %s", $insertGoTo));
}
?>
 

ypsilon86

Utente Attivo
18 Dic 2012
48
0
0
Roma
HTML:
<body>
<form action="<?php echo $editFormAction; ?>" method="post" name="form_expo" id="form_expo">
  <table align="center" border="1">
<tr valign="baseline">
      <td nowrap="nowrap" align="right">Nome expo:</td>
      <td colspan="2"><input type="text" name="nome_expo" value="" size="32" /></td>
    </tr>
    <tr valign="baseline">
      <td nowrap="nowrap" align="right">Data:</td>
      <td colspan="2"><input name="data_expo" type="text" value="" size="10" maxlength="11" /> es. (gg/mm/aaaa)</td>
    </tr>
    <tr valign="baseline">
      <td nowrap="nowrap" align="right">Paese:</td>
      <td colspan="2"><select name="paese_expo">
        <option value="AU" <?php if (!(strcmp("A", ""))) {echo "SELECTED";} ?>>Austria</option>
        <option value="CY" <?php if (!(strcmp("CY", ""))) {echo "SELECTED";} ?>>Cipro</option>
      </select></td>
    </tr>
    <tr valign="baseline">
      <td nowrap="nowrap" align="right">Città:</td>
      <td colspan="2"><input type="text" name="citta_expo" value="" size="32" /></td>
    </tr>
    <tr valign="baseline">
      <td nowrap="nowrap" align="right">Giudice:</td>
      <td colspan="2"><select name="giudice">
<option value="AN" <?php if (!(strcmp("Andrea", ""))) {echo "SELECTED";} ?>>Andrea</option>
        <option value="MA" <?php if (!(strcmp("Marco", ""))) {echo "SELECTED";} ?>>Marco</option>

<?php
if ((int) ($_POST['veteraniM'] + $_POST['campioniM'] + $_POST['liberaM'] + $_POST['lavoroM'] + $_POST['intermediaM'] + $_POST['giovaniM'] + $_POST['junioresM'] + $_POST['puppyM']) > 0) {
?> 
  <tr>
    <td colspan="3" align="center"><h2>MASCHI</h2></td>
  </tr>
<?php
}
?>

<?php
if (((int) $_POST['veteraniM']) > 0) {
?> 
    <tr valign="baseline">
      <td colspan="3" align="center" valign="middle"><h4>Veterani</h4></td>
</tr>
<?php
}
?>




  <?php
  for ($vm = 0; $vm < (int) $_POST['veteraniM']; $vm++) {
    $tag="tag".$vm;
    echo "<tr>"; 
    echo "<td align='center' valign='middle'>" . ($vm+1) . "°</td>";  
    echo "<td>
          <input type='text' id='$tag' name='$tag' class='maschi' placeholder='Inserisci veterano...' onfocus='auto_complete($tag)'/>
          <input type='hidden' id='tagid' name='tagid' /></td>"; 
	echo "<td><select name='valutazione'><option value='-'>-</option><option value='eccellente'>eccellente</option><option value='moltobuono'>molto buono</option><option value='buono'>buono</option><option value='insufficiente'>insufficiente</option><option value='squalificato'>squalificato</option></td>"; 
    echo "</tr>"; 
}
?> 


</body>
Però così facendo il databse poi non mi inserisce tutti i partecipanti, ma forse solo che è in posizione 1°
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.039
146
63
PR
www.borgo-italia.it
ciao
prima di guardare il codice una cosa: quello che vuoi salvare è anonimo e generico o si riferisce ad un utente in particolare, poi prima penso a come dovrebbero essere fatte le tabelle.
scusa se ti faccio una piccola osservazione, ma le case si costruiscono dalle fondamenta non dal tetto, prima si deve pensare alle tabella (quante, quali e loro struttura) poi allo script che deve gestirle e come
 

Nefyt

Utente Attivo
17 Apr 2012
1.102
0
0
Per quanto ho capito il tuo problema principale è registrare tutti i partecipanti per una gara in un unico record? (correggimi se sbaglio)

Potresti utilizzare un unico campo di tipo text semplice dove memorizzerai un array codificato in json con i tipi di partecipanti, e a sua volta lo riconvertirai in array php quando ti servirà


esempio di base per rendere l'idea
Codice:
{
"Maschi":
   {
    "Veterani":['nome_partecipante','altro_nome'],
    "Intermedi":['nome_partecipante','altro_nome'],
    "Lavoro":['nome_partecipante','altro_nome']
},
"Femmine":
   {
    "Veterani":['nome_partecipante','altro_nome'],
    "Intermedi":['nome_partecipante','altro_nome'],
    "Lavoro":['nome_partecipante','altro_nome']
   }
}
Quando lo avrai ricavato da php e riconvertito in array associativo potrai accederci come un array, idem per settarlo per poi convertirlo (come ad esempio quando invii gli user da un form)
PHP:
//esempio di partecipante
echo $array['Maschi']['Veterani'][0];

//aggiunta partecipante
$altro['Maschi']['Lavoro'][] = $partecipante;
ps: ovviamente la codifica e la decodifica in json puoi gestirle tranquillamente con json_encode() e json_decode()
 

ypsilon86

Utente Attivo
18 Dic 2012
48
0
0
Roma
Hai pienamente ragione Borgo riguardo alle fondamenta della casa. Ma non ho capito a cosa ti riferisci quando scrivi: "quello che vuoi salvare è anonimo e generico o si riferisce ad un utente in particolare". Io vorrei inserire la classifica di ogni gara nella tabella GARE, i nominativi dei partecipanti che inserisco nei campi testo dentro la tabella Gare li prendo direttamente dal mio DB.
Nel DB, ho anche una tabella PARTECIPANTI con: id_partecipante [int(11) - autoincrement - Primary] , nome-partecipante [varchar(30)].
 

ypsilon86

Utente Attivo
18 Dic 2012
48
0
0
Roma
Si in sostanza io ho un DB con tre tabelle:

GARE
id_gara*
nome_gara
data_gara
giudice_gara
luogo_gara

PARTECIPANTI
id_partecipante*
nome_partecipante

e poi ho le tabelle che contengono tutte le Categorie

VETERANIm
id_gara*
id_partecipante*

VETERANIf
id_gara*
id_partecipante*

CAMPIONIm
id_gara*
id_partecipante*

CAMPIONIf
id_gara*
id_partecipante*

....
In questo modo collego ad ogni Categoria la tabella PARTECIPANTI(con id_partecipanti) e la tabella GARE(con id_gara)


Fin quì può andare?
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.039
146
63
PR
www.borgo-italia.it
ciao
partiamo dalla tabella GARE che grosso modo è ok (io modificherei il campo data_gara)

Codice:
id_gara -> int (11) AUTO_INCREMENT Primary
nome_gara -> varchar(30)
data_gara -> varchar(30)#poi in fondo ti dico
giudice_gara -> varchar(30)
luogo_gara -> varchar(40)
poi farei una tabella collegata chiamata (es.) partecipanti
Codice:
id -> int (11) AUTO_INCREMENT Primary
id_gara -> int (11) #collega il partecipante alla gara
sesso -> set("M","F") #sarà da ricavare da dove proviene il $_POST
categoria -> varchar(30) #salvo che tu non abbia una tabella categorie per cui e meglio l'id della categoria, anche questo da ricavare dal tipo del $_POST
giudizio -> varchar(30)#dato provieniente dal menu a tendina
quindi facciamo un esempio coi dati che hai messo nelle immagini, per prima cosa si riempirù la tabella gare (separo i vari campi con|)
Codice:
27|internazionale|11/11/2012|italia|maratona|enrico
poi la tabella partecipanti
Codice:
33|27|M|veterani|eccellente
34|27|M|veterani|buono
35|27|M|intermedia|eccellente
36|27|M|intermedia|moltobuono
37|27|F|campioni|squalificato
38|27|F|lavoro|eccellente
39|27|F|lavoro|eccellente
40|27|F|lavoro|molto buono
poi facendo la join tra le due tabelle atrai quello che vuoi.
sto procedendo per la via giusta?

p.s.
la data_gara io la metterei in timestamp int(15) poi diventa più facile es l'ordinamento e (salvo che non sia tu l'unico ad inserirla)
farei il campo anzi i campi:
HTML:
inserisci data
<select name="gg">
<option value="01">1</option>ecc... sino a 31
</select>
<select name="mm">
<option value="01">gennaio</option>ecc... sino a dicembre
</select>
<select name="aa">
<option value="2013">2013</option>ecc... sino a quello che vuoi
</select>
poi nella parte php prima fai il chekdate poi la trasformi in timestamp
 

ypsilon86

Utente Attivo
18 Dic 2012
48
0
0
Roma
Borgo ma nella tabella PARTECIPANTI, devo mettere anche all' id_gara -> PRIMARY? Altrimenti non riesco a collegarid_gara della tab. PARTECIPANTI all'id_gara della tab. GARE.

Sempre nella "tab. Partecipanti", il campo CATEGORIA -> varchar(30) non ho ben capito cosa devo fare...
Devo fare un'altra tabella chiamata CATEGORIE, che la collego al campo Categoria della tab. Partecipanti?

Potrei strutturarla così:
CATEGORIE
id_categoria -> int(11) - Primary - Autoincrement
nome-categoria -> varchar(30)

quindi avrò la tab. CATEGORIE così:

1|veteraniM
2|veteraniF
3|campioniM
4|campioniF
5|liberaM
6|liberaF
7|lavoroM
8|lavoroF
9|giovaniM
10|giovaniF
...

Inoltre ho cambiato il campo "data_gara" nella tab. GARE come hai suggerito tu: (data_gara -> TIPO= timestamp LUNGHEZZA=15).
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.039
146
63
PR
www.borgo-italia.it
ciao
ma nella tabella PARTECIPANTI, devo mettere anche all' id_gara -> PRIMARY?
no, perche se la metti primary non possono esistere nella tabella due valori uguali (in tabella gare: si primary)
Devo fare un'altra tabella chiamata CATEGORIE, che la collego al campo Categoria della tab. Partecipanti?
ti conviene, da quella tabella poi poi ricavare la <select>dinamica facilitandoti così eventuali modifiche
Potrei strutturarla così:
si va bene, poi vedi tu se inserere in "partecipanti" per collegarle l'id o il nome_categoria (attento non nome-categoria, per separare usa sempre l'undescore)
(data_gara -> TIPO= timestamp LUNGHEZZA=15).
no, se usi il timestamp unix (che è quello che uso sempre io) il tipo deve essere INTERO cioè int(15), il timestamp che trovi es usando phpmyadmin è un altro formato (formato sql), si può usare anche quello, ma io preferisco (opinione personale) il timestamp unix
 

ypsilon86

Utente Attivo
18 Dic 2012
48
0
0
Roma
Ciao Borgo,

- scusa la mia ignoranza ma non riesco a capire come sistemare la voce "data_gara" nel database, in Tipo metto: INT(15) , ma in questo modo non visualizzo la data così: 17/01/2013, credo che si visualizzi così -> 17012013, giusto?

- Poi ho fatto la INNER JOIN fra le tabelle Partecipanti, Gare, Categorie e ho aggiunto un tabella (Clienti):

Gare
id_gara*
nome_gara
data_gara
giudice_gara
paese_gara
citta_gara

Partecipanti
id_partecipante*
id_gara
nome_cliente
sesso
nome_categoria
giudizio

Categorie
id_categoria*
nome_categoria

La tab. Clienti prevede una serie di campi, alcuni clienti potrebbero NON partecipare ad alcuna gara
Clienti
id_cliente*
nome_cliente
data_nascita INT(15) #stesso discorso della data_gara
luogo_nascita VARCHAR(30)
domicilio VARCHAR(45)

- Devo collegare id_gara (tab. Gare) -> id_gara (tab. Partecipanti):

SELECT g.nome_gara, g.data_gara, g.giudice_gara, g.paese_gara, g.citta_gara FROM gare AS g INNER JOIN partecipanti AS p ON g.id_gara = p.id_gara;
(in MySql dove devo scrivere questa cosa? Ho provato dentro "SQL" ma non so se ho fatto bene, non lo visualizzo ora se volessi modificarlo!)

- Devo collegare nome_categoria (tab. Partecipanti) -> nome_categoria (tab. Categorie):

SELECT c.nome_categoria FROM categorie AS c INNER JOIN partecipanti AS p ON c.nome_categoria = p.nome_categoria;
(Devo scrivere questa parte di codice nella tab. Categorie, tab. Partecipanti oppure basta riportarlo indifferentemente in una delle due?)

- Devo collegare il campo nome_cliente (tab. Clienti) -> nome_cliente (tab. Cliente):

SELECT c.nome_cliente FROM clienti AS c INNER JOIN partecipanti AS p ON c.nome_cliente = p.nome_cliente;
(Idem sopra :) )
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.039
146
63
PR
www.borgo-italia.it
ciao
prima la data, poi leggo tutto il resto per capire meglio.
si la data viene salvata con un numero intero
credo che si visualizzi così -> 17012013, giusto?
si
per visualizzarla in formato umano basta che quondo la prelevi dal db tu faccia
PHP:
<?php
//es sia prelevata con $riga['data']
echo date("d-m-y",$riga['data']);// o se ti serve assegnata ad una variabile  $data = date("d-m-y",$riga['data']); e poi vine visualizzata es.=>14-01-2013
//...
?>
in funzione di come formatti la stringa in date ti verrà stampata in formato "umano" cioè comprensibile.
se guardi http://it2.php.net/manual/en/function.date.php
trovi tutti i caratteri per formattare la data, es. "d-m-y H:i:s" => 14-01-2013 12:26:33
 
Ultima modifica:

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.039
146
63
PR
www.borgo-italia.it
ciao

- Devo collegare id_gara (tab. Gare) -> id_gara (tab. Partecipanti):
prova così
Codice:
SELECT * FROM gare AS g, partecipanti AS p WHERE g.id_gara = p.id_gara
- Devo collegare nome_categoria (tab. Partecipanti) -> nome_categoria (tab. Categorie):
domanda: ma a che ti serve estrre da "categorie" il nome della categoria, da quanto intuisco è giò presente in "partecipnati"

poi piu che le select dovresti spiegare cosa vuoi ottenere, saputo cosa vuoi ottenere si fa la select (ricorda fondamanta>=tetto)
 

ypsilon86

Utente Attivo
18 Dic 2012
48
0
0
Roma
Si vero ho scritto male, voelvo dire che dovevo collegare il nome_cliente della Tab. Clienti al nome_cliente della Tab. Partecipanti

Tab. PARTECIPANTI
id_partecipante*
id_gara
nome_cliente
sesso
nome_categoria
giudizio


Tab. CLIENTI
id_cliente* INT(11) - AutoIncrement - Primary
nome_cliente VARCHAR(40)
data_nascita INT(15)
luogo_nascita VARCHAR(30)
domicilio VARCHAR(45)

In MySql, nella sezione SQL ho scritto
SELECT * FROM partecipanti INNER JOIN clienti ON partecipanti.nome_cliente = clienti.nome_cliente
 

ypsilon86

Utente Attivo
18 Dic 2012
48
0
0
Roma
L'essenza di tutto è che tramite il Form iniziale vorrei inserire tutta la classifica (veteraniMaschi, veteranifemmine...)nel mio DB, ma non so come collegare le tabelle in MySql.

Ho scritto nel pannello SQL (di Mysql), -> " SELECT * FROM gare AS g, partecipanti AS p WHERE g.id_gara = p.id_gara " e il database mi trova i risultati corretti.
Non ho capito se questo è un modo per verificare che le connessioni fra tabelle funzionano correttamente oppure è uno script che stabilisce un collegamento fra tabelle. Per esempio se mi sposto di tabella e poi ritorno in quella, il codice che avevo scritto precedentemente è sparito...
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.039
146
63
PR
www.borgo-italia.it
ciao
è lo script che tramite la join (essendoci quel campo uguale) collega le due tabelle.
poi per fare l'insert ora do un occhio hai form poi (spero) ti so dire