Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Estou criando um projeto para efetuar chamada eletrônica (um sistema web em Php).
Eu fiz um formulário que lista os alunos do curso que o professor pretende efetuar a chamada.
Neste formulário tem 3 campos: idAluno, nomeAluno e um CheckBox para marcar presença ou não do aluno.
Agora preciso que ao clicar no botão "Salvar", os dados sejam enviados para o banco de dados (todos os registros).
Como proceder?
Certo, e pra fazer o Sql (insert) é não necessário um loop?
Sim, use um loop para inserir todos em um único INSERT.
Veja: http://rberaldo.com.br/inserindo-multiplos-registros-em-tabela-de-banco-de-dados/
Muito bom o artigo.
Mas minha dúvida é: quando clicar no "Salvar", devo pegar os dados através do $_POST? Poderia me fazer um código de exemplo?
Baseando-se no exemplo do William, $_POST['idAluno'] e $_POST['present'] serão arrays (por causa do "[]" no name).
Logo, basta usar um loop para buscar os dados digitados:
$idAluno = isset( $_POST['idAluno'] ) ? $_POST['idAluno'] : array();
$present = isset( $_POST['present'] ) ? $_POST['present'] : array();
for ( $i = 0, $total = count( $idAluno ); $i < $total; $i++ )
{
echo $idAluno[$i] . ' => ' $present[$i];
}Por exemplo:
Arquivo: insertFrequencia.php
<?php
include("conexao.php");
$id = $_POST['id'];
$statusPresenca = $_POST['statusPresenca'];
$curso = $_POST['curso'];
$datacadastro = date("d/m/y");
if ($nomeAluno==''|| $curso=='') {
echo "<script>alert('O nome do Aluno e Curso não pode ficar em branco!');window.location='javascript:window.history.go(-1)'</script>";
} else {
//print mysqli_error();
$sql = "INSERT INTO alunos (nomeAluno, email, idade, foneCelular, curso, datacadastro)
VALUES ('$nomeAluno', '$email', '$idade', '$foneCelular', '$curso', '$datacadastro')";
mysql_query($sql);
print mysql_error();
echo "<script>alert('Aluno incluído com sucesso!');window.location='cadAluno.php'</script>";
}
?><?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$sql = "INSERT INTO presence (student_id, student_name, is_present) VALUES ";
echo sizeof($_POST['student_id']);
$values = [];
for($i=0; $i<sizeof($_POST['student_id']); $i++) {
$presence = isset($_POST['presence'][$i]) ? 'true' : 'false';
$values[] = "({$_POST['student_id'][$i]}, '{$_POST['student_name'][$i]}', '{$presence}')";
}
echo $sql.implode(',', $values);
//$sql .= implode(',', $values);
//mysql_query($sql) or die (mysql_error());
}
?><!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<form action="" method="post">
<fieldset>
<input type="text" readonly="readonly" name="student_name[0]" value="Flavia" /><br />
id: <input type="text" name="student_id[0]" value="42">
<input type="checkbox" name="is_present[0]" checked="checked">
</fieldset>
<fieldset>
<input type="text" readonly="readonly" name="student_name[1]" value="Carla" /><br />
id: <input type="text" name="student_id[1]" value="1">
<input type="checkbox" name="is_present[1]" checked="checked">
</fieldset>
<fieldset>
<input type="text" readonly="readonly" name="student_name[2]" value="Joaquina" /><br />
id: <input type="text" name="student_id[2]" value="2">
<input type="checkbox" name="is_present[2]">
</fieldset>
<fieldset>
<input type="text" readonly="readonly" name="student_name[3]" value="Daiane" /><br />
id: <input type="text" name="student_id[3]" value="3">
<input type="checkbox" name="is_present[3]" checked="checked">
</fieldset>
<fieldset>
<input type="text" readonly="readonly" name="student_name[4]" value="Julia" /><br />
id: <input type="text" name="student_id[4]" value="4">
<input type="checkbox" name="is_present[4]" checked="checked">
</fieldset>
<fieldset>
<input type="text" readonly="readonly" name="student_name[5]" value="Samantha" /><br />
id: <input type="text" name="student_id[5]" value="5">
<input type="checkbox" name="is_present[5]" checked="checked">
</fieldset>
<fieldset>
<input type="text" readonly="readonly" name="student_name[6]" value="Cinthia" /><br />
id: <input type="text" name="student_id[6]" value="6">
<input type="checkbox" name="is_present[6]" checked="checked">
</fieldset>
<fieldset>
<input type="text" readonly="readonly" name="student_name[7]" value="Jessica" /><br />
id: <input type="text" name="student_id[7]" value="7">
<input type="checkbox" name="is_present[7]">
</fieldset>
<fieldset>
<input type="text" readonly="readonly" name="student_name[8]" value="Raquel" /><br />
id: <input type="text" name="student_id[8]" value="8">
<input type="checkbox" name="is_present[8]" checked="checked">
</fieldset>
<fieldset>
<input type="text" readonly="readonly" name="student_name[9]" value="Mia" /><br />
id: <input type="text" name="student_id[9]" value="9">
<input type="checkbox" name="is_present[9]">
</fieldset>
<fieldset>
<input type="text" readonly="readonly" name="student_name[10]" value="Patrícia" /><br />
id: <input type="text" name="student_id[10]" value="10">
<input type="checkbox" name="is_present[10]">
</fieldset>
<input type="submit" value="Enviar">
</form>
</body>
</html>
saída:
INSERT INTO presence (student_id, student_name, is_present) VALUES (42, 'Flavia', 'true'),(1, 'Carla', 'true'),(2, 'Joaquina', 'false'),(3, 'Daiane', 'true'),(4, 'Julia', 'true'),(5, 'Samantha', 'true'),(6, 'Cinthia', 'true'),(7, 'Jessica', 'false'),(8, 'Raquel', 'true'),(9, 'Mia', 'false'),(10, 'Patrícia', 'false')
Note que numerei os arrays, para contornar o fato de que checkbox não marcado não é enviado.
Entendi, agora eu adaptei no meu código, mas ainda não roda:
Arquivo: Formulário:
<?php
include("conexao.php");
echo "Curso Selecionado: <b>" . $CursoFiltrado . "</b>.";
?>
<tr>
<td align="center"><b>Cód.</b></td>
<td align="center"><b>Nome do Aluno</b></td>
<td align="center"><b>Ações</b></td>
</tr>
<?php
$query = mysql_query("SELECT * FROM alunos WHERE curso = '$CursoFiltrado' ORDER BY `nomeAluno`");
while ($pesquisa = mysql_fetch_assoc($query)) { ?>
<tr>
<td width="50" align="center"><input type="text" name="id[<?=$pesquisa['id']?>]" id="id" value="<?=$pesquisa['id']?>"></td>
<td width="300"><?=$pesquisa['nomeAluno']?></td>
<td width="300"><input type="checkbox" name="presenca[<?=$pesquisa['id']?>]" value="<?=$pesquisa['id']?>"> Presente</td>
</tr>
<?php } ?>
Arquivo: insertFrequencia.php
<?php
include("conexao.php");
$dataChamada = date("d/m/y");
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$sql = "INSERT INTO frequencia (id_aluno, presenca, dataChamada) VALUES ";
// echo sizeof($_POST['id']);
$values = [];
for($i=0; $i<sizeof($_POST['id']); $i++) {
$presence = $_POST['presenca'][$i] ? 'true' : 'false';
$values[] = "({$_POST['id'][$i]}, '{$presence}', '$dataChamada')";
}
echo $sql.implode(',', $values);
}
?>
Mas ainda não está funcionando...
Tenho que passar o idAluno como referência para persistir no banco de dados.
Não cara..
$i=0;
while ($pesquisa = mysql_fetch_assoc($query)) { ?>
<tr>
<td width="50" align="center"><input type="text" name="id[<?php echo $i; ?>]" id="id" value="<?=$pesquisa['id']?>"></td>
<td width="300"><?=$pesquisa['nomeAluno']?></td>
<td width="300"><input type="checkbox" name="presenca[<?php echo $i; ?>]" value="true"> Presente</td>
</tr>
<?php $i++; } ?>O ID do aluno já está em:$_POST['id'][$i]
Falar "ainda não roda", não ajuda em nada.. descreva qual a dificuldade, e o que aconteceu de errado.
Fiz as alterações do último código que você passou, e o erro é o da imagem em anexo.
( ! ) Notice: Undefined offset: 2 in C:\wamp\www\weblist\integrador\insertChamadaProfessor.php on line 15
Call Stack
# Time Memory Function Location
1 0.0020 247760 {main}( ) ..\insertChamadaProfessor.php:0
( ! ) Notice: Undefined offset: 3 in C:\wamp\www\weblist\integrador\insertChamadaProfessor.php on line 15
Call Stack
# Time Memory Function Location
1 0.0020 247760 {main}( ) ..\insertChamadaProfessor.php:0
( ! ) Notice: Undefined offset: 4 in C:\wamp\www\weblist\integrador\insertChamadaProfessor.php on line 15
Call Stack
# Time Memory Function Location
1 0.0020 247760 {main}( ) ..\insertChamadaProfessor.php:0
( ! ) Notice: Undefined offset: 5 in C:\wamp\www\weblist\integrador\insertChamadaProfessor.php on line 15
Call Stack
# Time Memory Function Location
1 0.0020 247760 {main}( ) ..\insertChamadaProfessor.php:0
INSERT INTO frequencia (id_aluno, presenca, dataChamada) VALUES (9, 'true', '17/06/15'),(7, 'true', '17/06/15'),(6, 'false', '17/06/15'),(2, 'false', '17/06/15'),(4, 'false', '17/06/15'),(10, 'false', '17/06/15')
Como está o teu código agora ?
Arquivo: Formulário
<table border="1">
<?php
include("conexao.php");
echo "Curso Selecionado: <b>" . $CursoFiltrado . "</b>.";
?>
<tr>
<td align="center"><b>Cód. Aluno</b></td>
<td align="center"><b>Nome do Aluno</b></td>
<td align="center"><b>Ações</b></td>
</tr>
<?php
$query = mysql_query("SELECT * FROM alunos WHERE curso = '$CursoFiltrado' ORDER BY `nomeAluno`");
$i=0;
while ($pesquisa = mysql_fetch_assoc($query)) { ?>
<tr>
<td width="50" align="center"><input type="text" name="id[<?php echo $i; ?>]" id="id" value="<?=$pesquisa['id']?>"></td>
<td width="300"><?=$pesquisa['nomeAluno']?></td>
<td width="300"><input type="checkbox" name="presence[<?php echo $i; ?>]"> Presente</td>
</tr>
<?php $i++; } ?>
</table>
<br>
<a href="efetuarChamada.php">Voltar</a> <button id="btCadastrar">Salvar</button>
</form>
Insert:
<?php
include("conexao.php");
$dataChamada = date("d/m/y");
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$sql = "INSERT INTO frequencia (id_aluno, presenca, dataChamada) VALUES ";
// echo sizeof($_POST['id']);
$values = [];
for($i=0; $i<sizeof($_POST['id']); $i++) {
$presence = $_POST['presence'][$i] ? 'true' : 'false';
$values[] = "({$_POST['id'][$i]}, '$presence', '$dataChamada')";
}
echo $sql.implode(',', $values);
}
?>
Está assim!
Ok, troque:
for($i=0; $i<sizeof($_POST['id']); $i++) {por
for($i=0; $i<sizeof($_POST['presence']); $i++) {Fiz a troca, aparece outro erro: Notice: Undefined offset: 1 in C:\wamp\www\weblist\integrador\insertChamadaProfessor.php on line 14
Pronto, corrigi o erro, porém ele está mostrando:
INSERT INTO frequencia (id_aluno, presenca, dataChamada) VALUES (9, 'true', '17/06/2015'),(7, 'true', '17/06/2015') mas não persisti no banco de dados.
Pronto, corrigi o erro, porém ele está mostrando:
INSERT INTO frequencia (id_aluno, presenca, dataChamada) VALUES (9, 'true', '17/06/2015'),(7, 'true', '17/06/2015') mas ainda não persisti no banco de dados.
Lógico.. hehe
Troca o echo pela query no banco.
mysql_query()... isso vc sabe fazer, certo ?
Outro erro que detectei, foi o seguinte:
Quando o primeiro aluno e o último estão "presentes", dá erro.
"Que erro" que dá ?
Tecnicamente o script que eu postei funciona perfeitamente em qualquer situação.
Explique o que aconteceu ai.
Então vamos lá.
Quando selecione apenas: o 1º e 3º aluno, erro abaixo:
Notice: Undefined offset: 1 in C:\wamp\www\weblist\integrador\insertChamadaProfessor.php on line 14
*A linha 14 é "*$presence = $_POST['presence'][$i] ? 'true' : 'false';".
Com relação ao mysql_query(), sei construí-lo normal, mas ali estou um pouco confuso se é antes ou na linha onde tem o "echo" >> echo $sql.implode(',', $values);Okay, quanto ao Notice, é tranquilo, veja:
$presence = $_POST['presence'][$i] ? 'true' : 'false';troca por
$presence = isset($_POST['presence'][$i]) ? 'true' : 'false';E sobre a query, troca:
echo $sql.implode(',', $values);por
$sql .= implode(',', $values);
mysql_query($sql) or die (mysql_error());Simplesmente Perfeito!
Funcionou alterando conforme suas instruções.
Melhor do que tudo isso, foi que eu consegui aprender para inserir múltiplos registros no BD.
Cara, sensacional!
Muito Obrigado!
Faça um único formulário com os campos em arrays.