CheckBox with PHP [closed]

-1

The site has 3 checkbox , but I'll implement a lot more. The problem is that my code is not very cool since I need to calculate the total value

Code looks like this:

$hena = filter_input(INPUT_POST, "hena", FILTER_SANITIZE_MAGIC_QUOTES);
$simples = filter_input(INPUT_POST, "simples", FILTER_SANITIZE_MAGIC_QUOTES);
$maquiagem = filter_input(INPUT_POST, "maquiagem", FILTER_SANITIZE_MAGIC_QUOTES);

$valorHena = 20; // Valor da Hena
$valorSimples = 15; // Valor da Simples
$valorMaquiagemIndividual = 100; // Valor da maquiagem individual

if (isset($hena) && !isset($simples) && !isset($maquiagem)) {
        $dado->setResultado($valorHena);
    }elseif (isset($simples) && !isset($hena) && !isset($maquiagem)) {
        $dado->setResultado($valorSimples);
    }elseif (isset($maquiagem) && !isset($hena) && !isset($simples)) {
        $dado->setResultado($valorMaquiagemIndividual);
    }elseif (isset($hena) && isset($simples) && !isset($maquiagem)) {
        $resultado = $valorHena + $valorSimples;
        $dado->setResultado($resultado);
    }elseif (isset($hena) && isset($maquiagem) && !isset($simples)) {
        $resultado = $valorHena + $valorMaquiagemIndividual;
        $dado->setResultado($resultado);
    }elseif (isset($maquiagem) && isset($simples) && !isset($hena)) {
        $resultado = $valorMaquiagemIndividual + $valorSimples;
        $dado->setResultado($resultado);
    }elseif (isset($maquiagem) && isset($simples) && isset($hena)) {
        $resultado = $valorHena + $valorSimples + $valorMaquiagemIndividual;
        $dado->setResultado($resultado);
    }

As you can see, it is quite confusing, I wanted to give an improvement and I tried everything could anyone give a tip?

    
asked by anonymous 28.03.2017 / 03:00

3 answers

1

I will demonstrate two ways to improve this, one easier to understand (using explicit loops) and another using array manipulation functions, in the end both reach the same goal. Both allow you to add and remove items without the need to change or add comparators / conditions to the code, just by adding an item in the array .

First in both cases set an array with the values:

$valoresProdutos = [

    'Hena' => 20,
    'Simples' => 15,
    'MaquiagemIndividual' => 100

];

Then you need to add the values:

/*1*/ $produtosEscolhidos = $_POST;

/*2*/ $valoresEscolhidos = array_intersect_key($valoresProdutos, $produtosEscolhidos);

/*3*/ $valoresSomados = array_sum($valoresEscolhidos);

/*4*/ echo $valoresSomados;

TEST THIS HERE

If you want "everything in one line":

echo $valoresSomados = array_sum(array_intersect_key($valoresProdutos, $_POST));

Translating what is done:

  • $produtosEscolhidos has all the $_POST information, in array , so if the body of POST is Hena=Qualquer_Coisa&Simples=ABC then the array will be array( "Hena" => "Qualquer_Coisa", "Simples" => "ABC" ) .
  •   

    You could also use $produtosEscolhidos = array_flip(array_keys($_POST)) to make it clear that what matters is the key and not the values, the array_keys " takes the keys from POST , this will generate something of type ( [0]=> "Hena" ), however we need Hena as a key and not a value, so we use array_flip and then this will be ["Hena"]=> 0 .

  • array_intersect_key returns all values of the $valoresProdutos array % if you select only "Hena" will be $produtosEscolhidos and if you select "Hena" and "Simple" will be ["Hena"]=> 20 , remembering that this is case-sensitive .

  • Finally we use the ["Hena"]=> 20, ["Simples"]=> 15 to add the values of the array_sum , so we add everything that has been selected by the user.

  • As I said it is possible to do this without the need to use these functions, after all maybe you do not know them or think it is complex, I believe the important thing is to understand how it works (I recommend you read the documentation) instead of giving a CTRL + C and CTRL + V. Anyway, we can use $valoresEscolhidos and check whether or not the user selected that item.

    $valoresSomados = 0;
    
    foreach($valoresProdutos as $_nomeProduto => $_valorProduto){
    
        if( isset($_POST[$_nomeProduto]) ){
            $valoresSomados += $_valorProduto;
        }
    
    }
    
    echo $valoresSomados;
    

    TEST THIS HERE

    I believe that in this case it is self-explanatory, you have echo of initially foreach , so it takes the $valoresSomados list and checks if user selected (ie if 0 exists because user selected ), then we add the price of "Hena" to $valoresProdutos .

    You could also generate the checkbox as follows:

    $valoresProdutos = [
    
        'Hena' => 20,
        'Simples' => 15,
        'MaquiagemIndividual' => 100
    
    ];
    
    echo '<form action="sua_pagina.php" method="post">';
    
    foreach($valoresProdutos as $_nomeProduto => $_valorProduto){
    
        echo '<label>';
        echo    '<input type="checkbox" name="'.$_nomeProduto.'" value="true">';
        echo    $_nomeProduto;
        echo '</label>';
    
        echo '<br>';
    }
    
    echo '<input type="submit" name="Enviar">';
    
    echo '</form>';
    

    So automatically when you add a new item in array would exist in a new checkbox. Another option would be to create functions that create HTML, for example .

        

    28.03.2017 / 05:37
    0

    I think this would simplify as follows:

    $isHena = isset($hena); 
    $isSimples = isset($simples); 
    $isMaquiagem = isset($maquiagem);
    $resultado = $isHena * $valorHena + $isSimples * $valorSimples + $isMaquiagem * $valorMaquiagem;
    $dado->setResultado($resultado);
    

    Because the value of isset will return true or false , which will be 0 or 1 in multiplication.

        
    28.03.2017 / 05:11
    0

    I was able to solve my problem by following the code below

    <?php
    
      if (isset($_POST['ok'])) {
          // checkbox ta assim name="servico[simples] servico[hena]...." no value ta o valor total.
    $servicos = $_POST['servico'];
    // Devino os valores aqui
    $post = array(
        'servico' => array(
            0 => 15,
            1 => 20,
            2 => 100,
            3 => 30,
            )
    );
    
    if (!empty($servicos)){
        $variavel = "";
        foreach ($servicos as $campo => $valor) {
              // pego o nome (hena,simples, blábáblá)  
            $variavel .= $campo . ' ';      
            // soma de todos os checkbox que foi digitado
            $re = array_sum($servicos);
    
        }
        // apartir daqui jogo no setter e mando bala.
       echo $re . '<br/>';
       echo $variavel;
    
    
    }else{
        echo "não foi passado";
    }
    }
    
    ?>
    
        
    29.03.2017 / 03:15