Receber array e gravar várias linhas no MySQL – php mysql
Pergunta:
Tenho o seguinte form em HTML:
<h2>Sessao 1</h2>
<input type="text" name="ipl[]" class="span12 ">
<input type="text" name="spot[]" class="span12 ">
<input type="text" name="energia[]" class="span12 ">
<input type="text" name="dcd[]" class="span12 ">
<input type="text" name="dis_inicial[]" class="span12 ">
<input type="text" name="dis_final[]" class="span12 ">
<h2>Sessao 2</h2>
<input type="text" name="ipl[]" class="span12 ">
<input type="text" name="spot[]" class="span12 ">
<input type="text" name="energia[]" class="span12 ">
<input type="text" name="dcd[]" class="span12 ">
<input type="text" name="dis_inicial[]" class="span12 ">
<input type="text" name="dis_final[]" class="span12 ">
<h2>Sessao [....]</h2>
<input type="text" name="ipl[]" class="span12 ">
<input type="text" name="spot[]" class="span12 ">
<input type="text" name="energia[]" class="span12 ">
<input type="text" name="dcd[]" class="span12 ">
<input type="text" name="dis_inicial[]" class="span12 ">
<input type="text" name="dis_final[]" class="span12 ">
<h2>Sessao 200</h2>
<input type="text" name="ipl[]" class="span12 ">
<input type="text" name="spot[]" class="span12 ">
<input type="text" name="energia[]" class="span12 ">
<input type="text" name="dcd[]" class="span12 ">
<input type="text" name="dis_inicial[]" class="span12 ">
<input type="text" name="dis_final[]" class="span12 ">
Ao realizar o Submit gostaria de incluir cada sessao em uma nova linha na base de dados MySQL. Ou seja, preciso de um “foreach”, “loop”, “while” no PHP para separar as sessoes e realizar o Insert de cada uma.
Autor da pergunta Felipe
Esse é o escopo para múltiplas inserções no MySQL:
INSERT INTO NOME_DA_TABELA (COLUNA1,COLUNA2,COLUNA3) VALUES
(VALOR1,VALOR2,VALOR3),
(VALOR4,VALOR5,VALOR6),
(VALOR7,VALOR8,VALOR9);
No PHP, itere o array recebido:
*Pressuponho que esteja usando método POST:
$sql = "INSERT INTO NOME_DA_TABELA (ipl,spot,energia) VALUES";
$data = $_POST;
foreach( $data['ipl'] as $k => $v ){
$sql .= PHP_EOL . "('" . $v . "','" . $data['spot'][$k] . "','" . $data['energia'][$k] . "')";
if( $k > 0 ){
$sql .= ",";
}
}
$sql .= ";";
// Query:
echo $sql; exit;
obs: Coloquei apenas um exemplo com 3 colunas. O restante você mesmo pode fazer após compreender a lógica.
Há outras formas de resolver e obviamente precisa fazer os tratamentos no recebimento dos dados antes de montar a query SQL. Como esses outros detalhes não são o foco principal da questão, preferi não comentar sobre para evitar uma resposta longa e complicada.
Veja o manual do MySQL (5.5): http://dev.mysql.com/doc/refman/5.5/en/insert.html
Pode ser feito um INSERT a cada linha, ou concatenar todos valores em uma string e executar apenas essa consulta.
Exemplo:
// utilizei o filter_input para receber os dados do formulário, com o parâmetro FILTER_REQUIRE_ARRAY, declarando que o dado é um array
$ipl = filter_input(INPUT_POST,'ipl',FILTER_DEFAULT, FILTER_REQUIRE_ARRAY);
$spot = filter_input(INPUT_POST,'spot',FILTER_DEFAULT, FILTER_REQUIRE_ARRAY);
$energia = filter_input(INPUT_POST,'energia',FILTER_DEFAULT, FILTER_REQUIRE_ARRAY);
$dcd = filter_input(INPUT_POST,'dcd',FILTER_DEFAULT, FILTER_REQUIRE_ARRAY);
$dis_inicial = filter_input(INPUT_POST,'dis_inicial',FILTER_DEFAULT, FILTER_REQUIRE_ARRAY);
$dis_final = filter_input(INPUT_POST,'dis_final',FILTER_DEFAULT, FILTER_REQUIRE_ARRAY);
// comando para múltiplas inserções
$sql = "INSERT INTO SESSAO (ipl,spot,energia,dcd,dis_inicial,dis_final) VALUES ";
$dados = array();
// concatena os dados linha por linha
for($i= 0;$i<count($ipl);i++) {
$dados[] = "("
. "'$ipl[$i]', "
. "'$spot[$i]', "
. "'$energia[$i]', "
. "'$dcd[$i]', "
. "'$dis_inicial[$i]', "
. "'$dis_final[$i]'"
. ")";
}
// concatena a consulta com os valores
$sql .= implode(',', $dados);
// execulta a consulta
$mysqli->query($sql);
Concatenar todos os valores em uma string não deve ser feito pois pode ultrapassar o tamanho máximo da string, a melhor maneira seria criar um laço e gerar um INSERT por vez ou utilizar a classe PDO do PHP. A classe PDO seria a melhor opção pois você pode enviar os parâmetros em uma matriz e ainda possui segurança contra Injeção SQL.
Exemplo:
srtSQL = "INSERT INTO tblnivestate (codnivestate, nomnivestate) VALUES (:codigo, :nome)"
$parametros = array(":codigo" => 10, ":nome" => Teste);
try {//Define comando de tratamento de erro e exceções
$sqlalt = $this->conexao->prepare($strSQL); //Prepara a consulta SQL (Query)
foreach($parametros as $key => $value){//Laço verifica matriz de parametros
$sqlalt->bindValue($key, $value);//Atribui parametros para execução
}
$sqlalt->execute()
} catch(PDOException $err) {//Gera exceção caso seja gerado erro na instrução SQL
return $err;//Retorna erro gerado
}



