Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it L'avatar di strae
    Registrato dal
    Apr 2008
    Messaggi
    407

    [logica] Strutturare `totali` personalizzati

    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)
    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>";

    ora, questo funziona, ha un problemino:

    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?
    You HAVE to assume your visitor is a maniac serial killer, out to destroy your application. And you have to prevent it.
    I can accept failure, everyone fails at something - But I can't accept not trying.

  2. #2
    Utente di HTML.it L'avatar di strae
    Registrato dal
    Apr 2008
    Messaggi
    407
    vi posto anche la bozza delle tabelle
    Codice PHP:
    CREATE TABLE IF NOT EXISTS `categorie` (
      `
    idint(11NOT NULL auto_increment,
      `
    nomevarchar(150NOT NULL default '',
      `
    totaleint(11NOT NULL default '0',
      
    PRIMARY KEY  (`id`)
    ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=;

    INSERT INTO `categorie` (`id`, `nome`, `totale`) VALUES
    (1'nero'100),
    (
    2'blu'56),
    (
    3'rosso'74),
    (
    4'verde'96);

    CREATE TABLE IF NOT EXISTS `totali` (
      `
    idint(11NOT NULL auto_increment,
      `
    nomevarchar(250NOT NULL default '',
      `
    regolatext NOT NULL,
      
    PRIMARY KEY  (`id`)
    ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=;
    INSERT INTO `totali` (`id`, `nome`, `regola`) VALUES
    (1'totaleA''1|add_2'),
    (
    2'totaleB''1|add_3|sot_2'); 
    You HAVE to assume your visitor is a maniac serial killer, out to destroy your application. And you have to prevent it.
    I can accept failure, everyone fails at something - But I can't accept not trying.

  3. #3
    Utente di HTML.it L'avatar di strae
    Registrato dal
    Apr 2008
    Messaggi
    407
    ninzuno?
    fà proprio così schifo il codice che ho scritto?
    You HAVE to assume your visitor is a maniac serial killer, out to destroy your application. And you have to prevent it.
    I can accept failure, everyone fails at something - But I can't accept not trying.

  4. #4
    Utente di HTML.it L'avatar di strae
    Registrato dal
    Apr 2008
    Messaggi
    407
    up...
    You HAVE to assume your visitor is a maniac serial killer, out to destroy your application. And you have to prevent it.
    I can accept failure, everyone fails at something - But I can't accept not trying.

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.