ciao ragazzi, vi pongo un quesito di logica.
Io ho una struttura così fatta (rimuovo i campi inutili allo scopo del 3d):
tabella categorie
id | nome | totale
1 | nero | 100
2 | blu | 50
3 | rosso | 175
(in realtà, il totale lo prendo da un'altra tabella oggetti, ma credo sia ininfluente..)
tabella totali
id | nome | regola
abbreviando molto, l'utente deve poter definire i propri totali.. ad esempio, io voglio che
'totale A' = nero + blu;
'totale B' = nero + rosso - blu;
e così via.
per realizzare questo, io usavo delle stringhe nela tabella totali:
id | nome | regola
1 | totaleA | `1|add_2`
2 | totaleB | `1|add_3|sot_2`
e, nella pagina php, questo codice per stampare i risultati:
(codice abbreviato, tutti i vari controlli sui risultati li ho tolti)
ora, questo funziona, ha un problemino:Codice PHP:
//tolgo i vari cicli di controllo, dò per scontato sia tutto ok
$j = 0;
$rayRegole = mysql_query("SELECT nome, regola FROM totali");
if(mysql_num_rows($rayRegole) != 0){
while( list($testoRegola, $rayRegola) = mysql_fetch_array($rayRegole)){
echo $testoRegola;
echo ' ( ';
$segmentiRegola = explode('_', $rayRegola);
$init = 0;
$a = 0;
$totale = 0;
foreach($segmentiRegola as $mySegmento){
list($idCategoria, $operazioneNew) = explode('|', $mySegmento);
list($nomeCategoria, $totaleCategoria) = mysql_fetch_array(mysql_query("SELECT nome, totale FROM categorie WHERE id = '$idCategoria'"));
echo $nomeCategoria;
if($operazioneNew == 'add'){ echo ' + '; }else if($operazioneNew == 'sot'){ echo ' - '; }
if($init == 0){
$operazione = $operazioneNew;
$myTotale = $totaleCategoria;
$init++;
}else{
if($operazione == 'add'){
$myTotale = $myTotale + $totaleCategoria;
}else if($operazione == 'sot'){
$myTotale = $myTotale - $totaleCategoria;
}
$operazione = $operazioneNew;
}
}
echo ' ) ';
echo " = ";
echo $myTotale;
$j++;
}
}else{
echo "<span class=\"commento\">Non sono state impostate regole sui totali.</span>";
}
1. Ogni totale deve essere almeno un'operazione (cioè il totaleA non può essere solo blu, deve essere blu +- nero ecc..)
2. Funziona, si, ma l'ho scritto abbastanza in fretta e credo ci sia un metodo per semplificarlo..
3. Sarebbe possibile (credo di si) eseguire delle query che mi stampano direttamente il risultato, senza quei cicli for? come la posso costruire partendo dalla regola che ora utilizzo
4. La regola (1|add_3|sot_2) come potrei scriverla per semplificare il tutto?
idee?