PHP PHP error Parse error: syntax error, unexpected ';', expecting ')' when doing an array foreach

0

I'm having trouble making an array foreach, it's displaying an error, follow the code below:

<table style="width: 100%;">
<thead>
<tr>
<th>Item</th>
<th>Código</th>
<th>Produto</th>
<th>Valor</th>
</tr>
</thead>
<tbody>
<?php while($dado_produto = $result_produtos->fetch_array()){ ?>
<tr>
<td>1</td>
<td><?php echo $dado_produto['cod']; ?></td>
<td><?php echo $dado_produto['descricao']; ?></td>
<td><input type = "text" name="valor[<?php echo $dado_produto['cod']; ?>]"/>
<input type = "hidden" name="linha[<?php echo $dado_produto['linha']; ?>]"/>
</td>
</tr>
<?php } ?> 
</tbody>
</table>
</div> 
<input type="submit"/>
</form>

value.php receives the values by the POST method

<?php
header('Content-Type: text/html; charset=utf-8');
include_once("../../controle/conexao.php");
// Início da consulta
$sql = "INSERT INTO 'produtos' ('cod', 'valor', 'linha') VALUES";

// Para cada elemento produto:
foreach($_POST['valor'] as $cod=>$val; $_POST['linha'] as $linha){

// Monta a parte consulta de cada produto
$sql .= " ('{$produto}', '{$valor}', '{$linha}'),";}

// Tira o último caractere (vírgula extra)
$sql = substr($sql, 0, -1);

// Executa a consulta
mysqli_query($sql);
$cadastrados = mysqli_affected_rows();
?> 

But the error is returning to me

  

PHP Parse error: syntax error, unexpected ';', expecting ')'

The line that the error occurs is:

  ($ _ POST ['value'] as $ code => $ val; $ _POST ['line'] as $ line) {

I have already changed by comma but it still gives error, this code I got from a web site as a reference, but apparently it is incorrect. What would be the correct method?

    
asked by anonymous 03.07.2017 / 13:34

1 answer

4

This syntax is totally wrong:

foreach($_POST['valor'] as $cod=>$val; $_POST['linha'] as $linha){

According to doc the syntax is just this:

foreach (array_expression as $key => $value)
    statement

Do not use two expressions at the same time, the ; unexpected is probably within foreach

Another problem is that your query has 4 values :

$sql .= " (1, '{$produto}', '{$valor}', '{$linha}'),";}

But it's only calling 3 columns in the insert:

$sql = "INSERT INTO 'produtos' ('cod', 'valor', 'linha') VALUES";

mysql will fire such an error

Resolving iteration

To be honest I could not quite understand the meaning of the code, but I believe that if the goal is to insert a value for each product you can change the HTML to this:

<td><?php echo $dado_produto['cod']; ?></td>
<td><?php echo $dado_produto['descricao']; ?></td>
<td>

    <input type="hidden" name="novo_valor[]" value="" />
    <input type="hidden" name="cod[]" value="<?php echo $dado_produto['cod']; ?>" />
    <input type="hidden" name="linha[]" value="<?php echo $dado_produto['linha']; ?>"/>
</td>

And for would look like this:

$sql = "INSERT INTO 'produtos' ('cod', 'valor', 'linha') VALUES";

$novos_valores = $_POST['novo_valor'];

// Para cada elemento produto:
for ($i = 0; $i < count($novos_valores); $i++){

    $novo_valor = $novos_valores[$i];
    $linha = $_POST['linha'][$i];
    $cod = $_POST['cod'][$i];

    // Monta a parte consulta de cada produto
    $sql .= " ('{$cod}', '{$novo_valor}', '{$linha}'),";
}

//IMPORTANTE: o mysql_query tem que ficar fora do 'for'

// Tira o último caractere (vírgula extra)
$sql = substr($sql, 0, -1);

// Executa a consulta
mysqli_query($sql);
$cadastrados = mysqli_affected_rows();
  

note: The way this code can be attacked by SqlInjection I recommend changing the approach to Prepared Statements

    
03.07.2017 / 13:41