Ir para conteúdo
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

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • Por gersonab
      há tempos utilizo para cadastrar data no BD a instrução :
      implode('-',array_reverse(explode('/',$data)))
      com isso no input posso colocar 09/02/2019 e no banco de dados grava 2019-02-09 , até ai sem problemas, porém ao atualizar um sistema para pdo, estou com problema no insert dinâmico, onde posso fazer 1 ou mais inserts, da forma abaixo cadastro quantos eu quiser :
      $sql = "INSERT INTO cantos ( id_t, id_c, data, ca, cant, po, des) VALUES (:id_t, :id_c, :data, :ca, :cant, :po, :des)";              $stmt = $pdo->prepare($sql);             foreach($_POST['idp'] as $indice => $valor) {             $stmt->bindParam(':id_t', $_POST['id_tor'][$indice], PDO::PARAM_STR);             $stmt->bindParam(':id_c', $_POST['idp'][$indice], PDO::PARAM_STR);             $stmt->bindParam(':data', $_POST['data'][$indice], PDO::PARAM_STR);             $stmt->bindParam(':ca', $_POST["ca"][$indice], PDO::PARAM_STR);             $stmt->bindParam(':cant', $_POST['cant'][$indice], PDO::PARAM_STR);             $stmt->bindParam(':po', $_POST['po'][$indice], PDO::PARAM_STR);             $stmt->bindParam(':des', $_POST['des'][$indice], PDO::PARAM_STR);                              if ($stmt->execute()){                     echo "Cadastrado com sucesso.";             }
      no entento a data vai no formato do input 09/02/2019.
      caso utilize :
      $stmt->bindParam(':data', implode('-',array_reverse(explode('/',$_POST['data'][$indice]))), PDO::PARAM_STR);
      tenho o erro Strict standards: "Only variables should be passed by reference in "que significa "Apenas as variáveis podem ser passadas por referência"
      qual a melhor forma de se fazer neste caso ?
    • Por WictorP
      Olá, tudo bem? Eu espero que esteja!
       
      Estou com um pequeno problema em uma medida de segurança que estou fazendo, acho que vocês podem me ajudar.
       
      Estou tentando criar uma defesa global de todos os valores obtidos através de formulários, ao qual o usuário irá preencher, ou seja, uma pequena defesa contra SQLInjection.
      Sei que isto está longe de resolver o problema, mas acho que é só o que precisa para um projeto de pequeno porte.
      Para esta segurança eu pego tudo que vem por $_POST e passo na função addslashes e verifico se é uma string. Este método funciona, porém tem um defeito.
      Eu também trabalho com envio de Arrays no formulário, e para que a função addslashes funcione, todas as variáveis passadas pelo $_POST deve ser uma string (basicamente todo conteúdo não array de um formulário pode ser tratado como string, até as que contém só números).
       
      Tentei fazer uma verificação nesta função, que caso seja array, ele não faz essa adesão do addslashes e passa o array cru que será tratado mais pra frente na página que o requisitar, porém, não consigo fazer esta verificação com o is_array(), o IF passa como se fosse outra coisa e trata como se fosse string normal.
       
      Segue o código:

              $formulario = $_POST;         foreach($formulario AS $key => $valor) {             if(is_array($_POST[$key])) {                 $_POST[$key] = $_POST[$key];             }else {                 $_POST[$key] = filter_var(addslashes($_POST[$key]), FILTER_SANITIZE_STRING);             }         }
       
      Espero que possam me dar uma luz referente à isto.
      Grato, Wictor Pamplona.
    • Por maruanbredoff
      Boa tarde pessoal,
      Estou com quebrando a cabeça com uma situação no meu sistema.
      No sistema eu tenho uma tabela tratamento, clientes, dentista e procedimento. 
      Dentro do sistema tenho uma tela onde a pessoa vai cadastrar o tratamento para o paciente e nessa tela a pessoa escolhe quais os procedimento, e qual o dentista que vai realizar.
      O campo idprocedimento é um array pois o mesmo tratamento pode ter varios procedimentos.
       
      O meu problema está em apresentar esses dados do array na tabela. o Select é esse a seguir
       
      SELECT t.idtratamento,t.idprocedimento,c.idcliente,c.nome as cliente,d.iddentista,d.nome as dentista,p.descricao as procedimento,t.idtratamento,t.datainicio,t.obs,t.status_tratamento
      FROM tratamento t
      INNER JOIN clientes c ON t.idcliente = c.idcliente
      INNER JOIN dentista d ON d.iddentista = t.iddentista
      INNER JOIN procedimento p ON p.idprocedimento = t.idprocedimento
      where t.idcliente = 1 and p.idprocedimento in (t.idprocedimento)
       
      Com esse select o retorno é o seguinte:
      idtratamento idprocedimento cliente iddentista dentista procedimento   76 260 Paciente teste 1 Dentista Teste Aparelho extra-bucal 77 31,5,6 Paciente teste 1 Dentista Teste Alveoloplastia   
      Como podem ver, o campo idprocedimento está caindo junto no array, eu queria separar e em vez de 1 linha na tabela aparecesse 3 linhas com esses procedimentos separados. Alguem pode me ajudar?
    • Por sheepziiin
      Boa tarde colegas !
      Estou quebrando a cabeça com um job para tratamento de logradouros. Segue o raciocínio:  
      Tenho uma lista com todos os endereços do estado de São Paulo, onde os mesmos são extraídos da seguinte forma:
       
      Exemplo:
      AL-AFONSO SCHMIDT/CDM:ED. SOPHIS SANTANA_COM PRUMADA/BLC:A-555-AP - Apartamento: 61 A AL-ANAPURUS/EDI:BOULEVARD/BLC:A-777-AP - Apartamento: 131 AL-ARAPANES/EDI:CDOE,6-5ºANDAR-309-AP - Apartamento: 42 AL-ARAPANES/EDI:COND.ED.MOEMA DUPLEX LIFE-1142-AP - Apartamento: 102 AL-ARAPANES/EDI:COND.ED.MOEMA DUPLEX LIFE-1142-AP - Apartamento: 42 AL-ARAPANES/EDI:PARC BRUMENADI-982-AP - Apartamento: 191 AL-BARROS/EDI:PERVAL-186-AP - Apartamento: 1601 AL-BARROS/EDI:PERVAL-186-BL - Blocos: B AP - Apartamento: 1302 AL-CAETANO,S/CDM:ED. GIARDINO_CDOE_1_ANDAR_11 A 13-165-AP - Apartamento: 63 AL-CAETANO,S/EDI:ESPLENDOR-1234-AP - Apartamento: 71 AL-CAETANO,S/EDI:MAGENTA I_CDOE_1_ANDAR_7 A 10-2575-AP - Apartamento: 94 AL-CALCUTA-195-AP - Apartamento: 02 AL-CAMPESTRE-728-CS - Casa: 1 AL-CASA BRANCA/CDM:BRISTOL-851-CJ - Conjunto: 11 AN - Andar: 01 AL-CASA BRANCA/CDM:SAINT SIMON-667-AP - Apartamento: 11
      Notem que os casos "não tem um padrão" (até tem por tipo de residencia). Utilizei inúmeras postagens aqui do fórum e consegui solucionar os casos para residencias (padrão TIPO_LOG;LOG;COMPL;NUM), no entanto as formulas e soluções aqui indicadas por vocês "param" na primeira sequencia numérica, entretanto para a maioria dos casos, o texto continua com letras, números e caracteres.
       
      Segue o padrão final que preciso chegar.
      Exemplo: AL-AFONSO SCHMIDT/CDM:ED. SOPHIS SANTANA_COM PRUMADA/BLC:A-555-AP - Apartamento: 61 A
      Resultado Tratado: AFONSO SCHMIDT 555
       
      Desde de já muito obrigado pelos retornos que certamente virão.
    • Por cauai
      Olá,
      Eu estou tentando criar uma lista de vendedores que irão receber o contato de clientes através do meu site. É uma plataforma wordpress, porém tenho completo acesso ao código php.
      Até agora, só achei maneiras de enviar para múltiplos e-mails, como cópia, ou separando por departamento à escolha do cliente, utilizando o Contact Form 7, o que não é meu desejo.
      Quero algo como isso:
       
      Não sei se o Contact Form 7 me permitiria algo desse tipo, ou se teria mesmo que fazer pelo php. Mas aceito ajuda para ambos os casos.
×

Informação importante

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