TransWikia.com

Formulário com inputs dinâmicos em JS e PHP - Só estou recebendo o ultimo campo

Stack Overflow em Português Asked by Everson Carvalho on December 14, 2021

Estou criando um formulário de devolução, com um botão de adicionar mais produtos caso o cliente precise, mas quando o cliente preenche mais de um produto, só estou recebendo no e-mail o ultimo produto.

Acredito que preciso receber os produtos em array no php, mas não sei como fazer.

https://codepen.io/eversoncarvalho/pen/GRoepNV

$nome = $_POST['nome'];
$cnpj = $_POST['cnpj'];
$email = $_POST['email'];
$telefone = $_POST['telefone'];
$razaoSocial = $_POST['razaoSocial'];
$inscricaoEstadual = $_POST['inscricaoEstadual'];
$cep = $_POST['cep'];
$rua = $_POST['rua'];
$numero = $_POST['numero'];
$bairro = $_POST['bairro'];
$cidade = $_POST['cidade'];
$uf = $_POST['uf'];
$cfop = $_POST['cfop'];

$codProduto = ($_POST['codProduto']);
$dataProduto = $_POST['dataProduto'];
$nfEmpresaPlastic = $_POST['nfEmpresaPlastic'];
$valorNota = $_POST['valorNota'];
$qtd = $_POST['qtd'];
$defeito = $_POST['defeito'];


if (empty($nome) || empty($cnpj) || empty($email) || empty($telefone) || empty($razaoSocial) || empty($inscricaoEstadual) || empty($cep) || empty($rua) || empty($numero) || empty($bairro) || empty($cidade) || empty($uf) || empty($cfop) || empty($codProduto) || empty($dataProduto) || empty($nfEmpresaPlastic) || empty($valorNota) || empty($qtd) || empty($defeito))
{    
    echo "<script>alert('ATENÇÃO: Preencher todos os campos!');window.location='index.php'</script>";   
    exit;
}

$corpo = "<html><body>";

$corpo .= "<b>Formulário de devolução - Empresa Plastic</b><br><br>";

$corpo .= "<b>DADOS DO CLIENTE</b><br>";
$corpo .= "<b>Nome:</b> $nome <br>";
$corpo .= "<b>Razão Social:</b> $razaoSocial <br>";
$corpo .= "<b>CNPJ:</b> $cnpj <br>";
$corpo .= "<b>Inscrição Estadual:</b> $inscricaoEstadual <br>";
$corpo .= "<b>Telefone:</b> $telefone <br>";
$corpo .= "<b>E-mail:</b> $email <br>";
$corpo .= "<b>CEP:</b> $cep <br>";
$corpo .= "<b>Rua:</b> $rua <br>";
$corpo .= "<b>Número:</b> $numero <br>";
$corpo .= "<b>Bairro:</b> $bairro <br>";
$corpo .= "<b>Cidade:</b> $cidade <br>";
$corpo .= "<b>UF:</b> $uf <br>";
$corpo .= "<b>CFOP:</b> $cfop <br><br>";

$corpo .= "<b>PRODUTOS LISTADOS</b><br>";
$corpo .= "<b>Código do produto:</b> $codProduto <br>";
$corpo .= "<b>Data de emissão da nota fiscal:</b> $dataProduto <br>";
$corpo .= "<b>Nota Fiscal:</b> $nfEmpresaPlastic <br>";
$corpo .= "<b>Valor:</b> $valorNota <br>";
$corpo .= "<b>Quantidade:</b> $qtd <br>";
$corpo .= "<b>Defeito:</b> $defeito <br><br>";

$corpo .= "</body></html>";

2 Answers

Como resolver:

Escolha um dos arrays enviados e utilize a função foreach do php para passar por cada um desses valores:

$nome = $_POST['nome'];
$cnpj = $_POST['cnpj'];
$email = $_POST['email'];
...

$corpo = "<html><body>";
$corpo .= "<b>Formulário de devolução - Empresa Plastic</b><br><br>";

foreach($nome as $key => $valor) {
    $corpo .= "<b>DADOS DO CLIENTE</b><br>";
    $corpo .= "<b>Nome:</b> $valor <br>";
    $corpo .= "<b>CNPJ:</b> $cnpj[$key] <br>";
    $corpo .= "<b>E-mail:</b> $email[$key] <br>";
    ...
}

Como a ordem e quantidade das valores dos campos (nome, cnpj, etc...) são os mesmos, o número da chave ($key) de cada item também será igual, assim você poderá dentro do foreach do array $nome buscar os valores dos outros arrays ($cnpj, $email, etc...) através da $key

Observações

*Se você criar vários campos (inputs) como o mesmo nome deverá se certificar que os nomes (propriedade 'name') dos campos esteja com '[]' (colchetes) no final, para que seja enviado um array com todos os valores e não apenas o ultimo valor, assim:

<input type="text" name="codProduto[]" id="codProduto" class="form-control" placeholder="0000" required>

*Lembre-se que quando utiliza o sinal de '=' (igual) para atribuir um valor a uma variável, este, sobrescreve (apaga) o valor antigo, ou seja, ainda que adicione a vários valores dessa forma:

$variavel = 'valor 1'
$variavel = 'valor 2'
$variavel = 'valor 3'
...

a variável terá apenas o último recebido.

Answered by Douglas Takiuti on December 14, 2021

Você pode mudar o nome dos campos colocando "[]" no final, isso vai fazer o campo ser interpretado como um array. Depois de postar os dados, você pode recuperar o campo e fazer um "foreach" para listar todo o seu conteúdo. Um exemplo:

Formulário

<form method="POST" action="gravar.php">
    <label>Produto 1</label><input type="text" name="produto[]"><br/>
    <label>Produto 2</label><input type="text" name="produto[]"><br/>
    <label>Produto 3</label><input type="text" name="produto[]"><br/>
    <label>Produto 4</label><input type="text" name="produto[]"><br/>
    <label>Produto 5</label><input type="text" name="produto[]"><br/>
    <input type="submit" value="Gravar">
</form>

Página de gravar

<?
$produtos = $_POST["produto"];
foreach($produtos as $item) {
    echo ($item . "<br>");
}

?>

Como você tem vários campos, uma outra alternativa seria fazer o seguinte:

Formulário

<form method="POST" action="gravar.php">
    <label>Produto 1</label><input type="text" name="produto[]"><br/>
    <label>Modelo 1</label><input type="text" name="modelo[]"><br/>
    <label>Marca 1</label><input type="text" name="marca[]"><br/>
    <hr/>
    <label>Produto 2</label><input type="text" name="produto[]"><br/>
    <label>Modelo 2</label><input type="text" name="modelo[]"><br/>
    <label>Marca 2</label><input type="text" name="marca[]"><br/>
    <input type="submit" value="Gravar">
</form>

Página de gravar

<?
$produtos = $_POST["produto"];
$modelo = $_POST["modelo"];
$marca = $_POST["marca"];
foreach($produtos as $item => $chave) {
    echo ("produto" . $item . "<br>");
    echo ("modelo" . $modelo[$chave] . "<br>");
    echo ("marca" . $marca[$chave] . "<br>");
}

?>

Answered by Bins on December 14, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP