Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

SeveroSoft

Campos Dinamicos []

Recommended Posts

Olá amigos tudo bem? estou precisando de uma "aulinha/ajudinha" com a seguinte situação:
 

<input type='checkbox' name='modificador[]' class='form-check-input' id='<?=$reg3["id"]?>' value='<?=$reg3["id"]?>'>

Tenho estes checkbox que são listados a partir de um banco de dados com um while.
Por isso todos os checkbox tendem a ter o mesmo NAME 'modificador[]'.

Até ai perfeito, consigo receber os valores quando dou Print ou echo.
 

acontece que quando vou enviar os valores para o banco de dados o valor exibido é sempre o ultimo selecionado.

Ou seja, se tiver 4 checkbox, e o value da ultima for 4, este será o numero que irá enviar ao banco de dados.

 

Oque preciso é de uma maneira de enviar todos os valores selecionados para o banco. Exemplo 1, 2, 3, 4

E também se possível me explicar como faço para receber esses valores separadamente com o select em outra pagina PHP.

 

Desde-já agradeço a atenção de todos. :)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá amigo.

 

Veja este exemplo:

<?php
$modificadores = $_POST[ 'modificador' ] ?? [];

foreach ( $modificadores as $i => $modificador ) {
    printf( '<b>#%d:</b> %s<br>', $i, $modificador );
}
?>
<form method="post">
    <input type="text" name="modificador[]" value="">
    <input type="text" name="modificador[]" value="">
    <input type="text" name="modificador[]" value="">
    <input type="text" name="modificador[]" value="">
    <input type="text" name="modificador[]" value="">
    <input type="text" name="modificador[]" value="">
    
    <input type="submit" value="ENVIAR">
</form>

 

Se você rodar na sua máquina, e preencher os campos ímpares (primeiro, terceiro, quinto), por exemplo, o resultado seria esse:

#0: 123
#1: 
#2: 456
#3: 
#4: 789
#5: 

 

Ou seja, quando você envia mais de um campo com o mesmo name seguido de colchetes, você está pedindo ao navegador que envie estes dados ao servidor em forma de array.

 

Depois que você tem o array, você pode extrair o dado que quiser, da forma que quiser.

1 - Se você precisa de todos, listados, por exemplo, para inserir em série no banco, poderia usar a forma que exemplifiquei acima.

2 - Se você deseja apenas os dados que foram preenhchidos, pode usar o array_filter.

3 - Se você deseja especificamente o primeiro campo, poderia fazer assim: echo $modificadores[ 0 ];

4 - Se você quer unir todos em uma string e exibir "123,,456,,789," pode usar o implode.

 

Caso estes campos possuam pares ID / VALOR e você queira saber qual é o id do campo, você pode fazer assim:

<?php
$modificadores = $_POST[ 'modificador' ] ?? [];

foreach ( $modificadores as $id => $modificador ) {
    printf( '<b>#%d:</b> %s<br>', $id, $modificador );
}
?>
<form method="post">
    <input type="text" name="modificador[ 10 ]" value="">
    <input type="text" name="modificador[ 20 ]" value="">
    <input type="text" name="modificador[ 30 ]" value="">
    <input type="text" name="modificador[ 40 ]" value="">
    <input type="text" name="modificador[ 50 ]" value="">
    <input type="text" name="modificador[ <?= mt_rand( 100, 200 ) //exemplo de um id aleatório ?> ]" value="">
    
    <input type="submit" value="ENVIAR">
</form>

 

Depois que eu escrevi isso tudo eu percebi que a sua dúvida era com checkbox e não com input, mas a ideia é a mesma. Testa aí:

<?php
$modificadores = $_POST[ 'modificador' ] ?? [];

foreach ( $modificadores as $i => $modificador ) {
    printf( '<b>#%d:</b> %s<br>', $i, $modificador );
}
?>
<form method="post">
    <input type="checkbox" name="modificador[]" value="aceita_termos_1">
    <input type="checkbox" name="modificador[]" value="aceita_termos_2">
    <input type="checkbox" name="modificador[]" value="aceita_politica_tal">
    <input type="checkbox" name="modificador[]" value="eh_maior_de_idade">
    <input type="checkbox" name="modificador[]" value="mora_no_brasil">
    
    <input type="submit" value="ENVIAR">
</form>

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Matheus Tavares Obrigado por responder amigo. Admiro seu trabalho.

Estou me complicando na hora de particionar isso ao banco de dados, e depois para filtrar esse valor para opções separadas.

 

Precisava entender como que esse valor entra na tabela pelo INSERT INTO.

e depois como ele volta pro script pelo SELECT.

 

se pudesse me mostrar um exemplo me ajudaria muito.

 

Obrigado.

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom... para armazenar todas as opções que o usuário marcou no checkbox, você faria assim:

$selecionados = implode( ',', $marcadores );

Isso iria gerar uma string com os valores separados por vírgula. O passo seguinte seria fazer um insert assim:

$sql = "INSERT INTO tabela SET coluna = '{$selecionados}'";

Seguindo o exemplo anterior, iria gerar "aceita_termos_1,mora_no_brasil" se o usuário tivesse selecionado o primeiro e o último checkboxes.

 

Essa abordagem é mais simples, mas possui falhas graves, que podem ou não incomodar você nesse momento:

1 - A edição fica problemática, pois você teria que manipular esse texto/string para conseguir fazer isso.

2 - Seu banco teria muita informação repetida.

 

Existem duas formas de resolver esse problema de forma elegante: normalizando suas tabelas ou armazenando a informação de forma "lógica". Vou explicar a segunda alternativa, pois me parece ser mais eficiente para o seu problema.

 

Primeiro armazenamos as opções. Isso pode ser feita via código ou via banco de dados, como você preferir. Exemplo:

/**
 * Observe que as chaves desse array crescem em base de 2.
 * Isso é importante para impedir repetição de valores.
 * A regra é bem simples:
 *
 * 2 ^ 0 = 1
 * 2 ^ 1 = 2
 * 2 ^ 2 = 4
 * 2 ^ 3 = 8
 * ...
 */
$opcoes_do_sistema = [
    1   => 'aceita_termos_1',
    2   => 'aceita_termos_2',
    4   => 'aceita_politica_de_privacidade',
    8   => 'maior_de_idade',
    16  => 'mora_no_brasil',
    32  => 'outra_regra',
];

 

Beleza. Agora vamos criar duas pequenas funções auto-explicativas para nos auxilixar:

/**
 * Essa você nem precisa usar, mas é simples: você dá o nome da opção e ele retorna o código.
 * Exemplo: $getCodigoModificador( 'maior_de_idade' ) retorna 8
 * 
 * Ela é usada pela outra função.
 */
$getCodigoModificador = function( $nome_modificador ) use ( $opcoes_do_sistema ) {
    $codigo = array_search( $nome_modificador, $opcoes_do_sistema );
    if ( $codigo === false )
        throw new \InvalidArgumentException( 'O modificador informado é inválido.' );
    
    return $codigo;
};

/**
 * O operador & utilizado nessa função se chama AND bitwise.
 * Entenda melhor sobre ele aqui: http://php.net/manual/pt_BR/language.operators.bitwise.php
 * 
 * Procure no youtube também. É um pouquinho complexo no início, mas não é um bixo de sete cabeças.
 * 
 * A função retorna TRUE / FALSE ao verificar se um modificador/opção está selecionado. Veja os exemplos...
 */
$modificadorEstaSelecionado = function( $nome_modificador, $selecionados ) use ( $getCodigoModificador ) {
    return $selecionados & $getCodigoModificador( $nome_modificador );
};

 

De preparação é isso. Vou postar um exemplo completo agora para você poder testar, analisar e estudar.

<?php
// AQUI VOCÊ COLA AS $opcoes_do_sistema e as duas funções!


// Essa variável é apenas a soma de todos os modificadores selecionados. Exemplo: 2 + 16 = 18
// Esse é o valor que deve ser salvo no seu banco. Um inteiro.
// O insert é bem simples mesmo: INSERT INTO meus_modificadores SET opcoes_marcadas = $selecionados
$selecionados = array_sum( $_POST[ 'modificador' ] ?? [] );

echo 'Soma dos selecionados: ' . $selecionados . '<br>';

// Beleza. Agora vamos ver como fazemos para verificar se uma opção está selecionada:
echo '<br>aceita_termos_1 selecionado? ';
echo $modificadorEstaSelecionado( 'aceita_termos_1', $selecionados ) ? 'SIM' : 'NÃO';

echo '<br>aceita_termos_2 selecionado? ';
echo $modificadorEstaSelecionado( 'aceita_termos_2', $selecionados ) ? 'SIM' : 'NÃO';

echo '<br>aceita_politica_de_privacidade selecionado? ';
echo $modificadorEstaSelecionado( 'aceita_politica_de_privacidade', $selecionados ) ? 'SIM' : 'NÃO';

echo '<br>maior_de_idade selecionado? ';
echo $modificadorEstaSelecionado( 'maior_de_idade', $selecionados ) ? 'SIM' : 'NÃO';

echo '<br>mora_no_brasil selecionado? ';
echo $modificadorEstaSelecionado( 'mora_no_brasil', $selecionados ) ? 'SIM' : 'NÃO';

echo '<br>outra_regra selecionado? ';
echo $modificadorEstaSelecionado( 'outra_regra', $selecionados ) ? 'SIM' : 'NÃO';


echo '<br><br>';
?>
<form method="post">
    <?php
    foreach( $opcoes_do_sistema as $chave => $nome )
        printf( '<input type="checkbox" name="modificador[]" value="%d"> %s<br>', $chave, $nome );
    ?>
    
    <input type="submit" value="ENVIAR">
</form>

 

E aqui um exemplo prático desse código rodando:

Soma dos selecionados: 33

aceita_termos_1 selecionado? SIM
aceita_termos_2 selecionado? NÃO
aceita_politica_de_privacidade selecionado? NÃO
maior_de_idade selecionado? NÃO
mora_no_brasil selecionado? NÃO
outra_regra selecionado? SIM

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entendi a forma principal que você disse que pode haver erros, mas o modo final de fazer vou demorar um pouco pra entender, bem complexo haha. Mas vou estudar.

 

Oque estou tentando desenvolver é um cadastro de produto, onde existe a tabela PRODUTOS e outra tabela MODIFICADORES.

 

O cliente cadastra por exemplo:

Produto: Pizza

Modificador: Tamanho, Gigante, 60,00

Modificador: Sabores, Calabresa, Bacon, Ovo, Milho com bacon, Nutella(6,00)

Podendo abrir novos campos nos modificadores para adicionar outros sabores e valor por exemplo

 

Se caso você esteja interessado em me ajudar, até mesmo por um custo X podemos conversar :)

 

Mesmo assim agradeço de coração por toda ajuda. Vlw @Matheus Tavares

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então... na verdade tudo o que eu expliquei será inútil para o seu problema, pois você não precisa apenas dos valores, como eu havia entendido inicialmente. Você precisa das chaves também.

Exemplo: chave: tamanho / valor: gigante.

 

Seu problema é parecido com esse aqui. Veja o exemplo postado e a discussão feita: https://forum.imasters.com.br/topic/566731-resolvido-dúvida-com-query-um-pouco-complexa/

 

O que você deve estudar é modelagem de banco de dados. Procure por tutoriais e vídeos no youtube a respeito.

 

16 minutos atrás, SeveroSoft disse:

Se caso você esteja interessado em me ajudar, até mesmo por um custo X podemos conversar :)

Bacana, mas no momento estou sobrecarregado e não teria como pegar :(

Sugiro que poste na nossa área de classificados, pois tem muita gente capacitada aqui disponível pra fazer isso pra você.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mesmo assim agradeço por toda atenção, vou estudar mais sobre tudo isso.

Sabe me dizer o nome dessa função que preciso?

 

é array, vetor, dinamico? haha me perdi um pouco.

Ai vou estudar sobre isso tudo :smiley:

 

E novamente agradeço por tudo.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
13 horas atrás, SeveroSoft disse:

Sabe me dizer o nome dessa função que preciso?

 

é array, vetor, dinamico? haha me perdi um pouco.

Você precisa apenas modelar melhor seu banco e depois inserir em lotes (um INSERT para cada modificador).

Você não deve ter uma coluna chamada modificadores, mas sim uma tabela inteira. Isso se chama relacionamento muitos-para-muitos ou um-para-muitos, dependendo de como você organizar sua aplicação.

 

Além do link que citei, veja este aqui tb: https://forum.imasters.com.br/topic/563844-resolvido-criar-tabela-de-mata-mata/

 

O ideal é você pegar um curso de php/mysql que ilustre processos (inserções, seleções, joins, etc) de relacionamentos entre tabelas e modelagem/normalização de banco de dados. É isso que você precisa estudar :)

Depois de ver esse material, tente reproduzir, e poste suas dúvidas para lhe ajudarmos.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por ILR master
      Boa tarde, pessoal.
      Espero que todos estejam bem.
       
      Seguinte:
      Tenho a seguinte consulta:
       
      $usuarios= "SELECT * FROM usuarios";
      $query= mysqli_query($conexao, $usuarios) or die ("Usuário não encontrado");
      $usuario = mysqli_fetch_array($query);
       
      Quero pegar apenas o campo 'nome' da tabela 'usuarios' e colocar todos os resultados da seguinte forma:
       
      $nomes = array("Rafael", "João", "Maria", "Pedro", "Patricia", "Camila");
       
      Agradeço desde já.
      Abs
       
       
    • Por mateus.andriollo
      Existe uma forma de fazer um IF na select e comparar com Array de dados?
       
      algo como
       
      Select if( in_array(idCliente,'1,2,3,4,5')=true,'Tem','Não') ) as cliente Não consigo usar inner ou where pois esse array é algo q tem varias regras...
       
      Precisava saber se existe uma função assim em MySQL
    • Por mateus.andriollo
      Existe uma forma de fazer um IF na select e comparar com Array de dados?
       
      algo como
       
      Select if( in_array(idCliente,'1,2,3,4,5')=true,'Tem','Não') ) as cliente Não consigo usar inner ou where pois esse resultado do array é algo q tem varias regras...
       
      Precisava saber se existe uma função assim em MySQL
    • Por clovis.sardinha
      Bom dia.
      Meu problema é o seguinte:
      Estou fazendo uma tabela e preciso mostrar o usuário e várias cidades que pertencem a este usuário.
      O resultado do array é o seguinte:

      Quando passo para a tabela os valores de cidade se repetem para o mesmo usuário até o final e retorna fazendo o mesmo para o próximo usuário. 
      Veja abaixo

       
      Meu código para a tabela é a seguinte:
      <tr> <td align="left"><?php echo $usuario['nome'] ?></td> <td align="left"><?php echo $usuario['nome_orgao'] ?></td> <td align="left"><?php echo $usuario['nome_funcao'] ?></td> <?php foreach($destinos as $key=>$destino):?> <?php $key=0;?> <td align="left"> <?php foreach($destino as $chave=> &$cidade): ?> <?php echo $cidade['cid_nome']."-";?> <?php endforeach;?> </td> <?php $key+=$key; ?> <?php endforeach;?> <td><?php echo date('d/m/Y', strtotime( $usuario['created_at'])) ?></td> <td align="left"><a href="<?php echo base_url('UserAdmin/Usuario/getUsuarioById')."/".$usuario['id_user'] ?>">DETALHES</a></td> </tr> <?php endforeach ?> Onde estou errando? O que tenho de fazer para percorrer este array de modo a aparecer apenas as cidades pertencentes a cada usuário?

    • Por Giovanird
      Listo um array pelo foreach e preciso pegar os valores fora do foreach.
      Abaixo tenho o exemplo do foreach com os valores
       
      <?php foreach($turma $rsturma): if(($rsturma['id'] == 1){ echo $rsturma['nome']."<br>"; echo $rsturma['idade']."<br><br>"; } endforeach; //Dentro do foreach me retorna: Luis 13 Maria 12 Carlos 12 Matheus 14 Andréa 12 //Preciso pegar a posição e o valor desta lista $posicao1 = 1; $nome1 = Luis; $posicao2 = 2; $nome2 = Maria; $posicao3 = 3; $nome3 = Carlos; $posicao4 = 4; $nome4 = Matheus; $posicao5 = 5; $nome5 = Andréa;  
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.