Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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. :)@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.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](http://www.dsc.ufcg.edu.br/~pet/jornal/maio2011/materias/recapitulando.html) 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// 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
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
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ê.
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
E novamente agradeço por tudo.
>
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.
Olá amigo.
Veja este exemplo:
#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.