Form with dynamic inputs in JS and PHP - I’m only getting the last field

Asked

Viewed 211 times

-1

I am creating a return form, with a button to add more products if the customer needs, but when the customer fills more than one product, I am only receiving in the email the last product.

I believe I need to receive the products in array in php, but I don’t know how to do it.

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

0


How to solve:

Choose one of the sent arrays and use the function foreach php to go through each of these values:

$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>";
    ...
}

Since the order and quantity of the values of the fields (name, cnpj, etc...) are the same, the key number ($key) of each item will also be equal, so you can within the foreach of the $name array fetch the values of the other arrays ($cnpj, $email, etc...) through the $key

Remarks

*If you create multiple fields (inputs) as the same name you should make sure that the names ('name' property) of the fields are with '[]' (square brackets) at the end, so that an array of all values is sent, not just the last value, like this:

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

*Remember that when you use the sign of '=' (equal) to assign a value to a variable, this, overrides (deletes) the old value, that is, even if you add to several values in this way:

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

the variable will only have the last received.

  • Thank you very much, it was exactly what I needed. Great explanation, congratulations!

0

You can rename the fields by putting "[]" at the end, this will make the field be interpreted as an array. After posting the data, you can retrieve the field and do a "foreach" to list all your content. An example:

Form

<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>

Save page

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

?>

As you have several fields, another alternative would be to do the following:

Form

<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>

Save page

<?
$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>");
}

?>

Browser other questions tagged

You are not signed in. Login or sign up in order to post.