Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Estou tentando inserir esses dados no banco mysql mas esta gravando duplicado os dados.
a tabela é essa
CREATE TABLE IF NOT EXISTS `atendi` (
`id_atendimento` int NOT NULL AUTO_INCREMENT,
`pacie_id` int NOT NULL,
`agen_id` int NOT NULL,
`data_atendimento` datetime NOT NULL,
`num_dente` int NOT NULL,
`obs` text NOT NULL,
`valor` decimal(10,2) NOT NULL,
PRIMARY KEY (`id_atendimento`)
) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=utf32;
O formulario
<input type="hidden" name="pacie_id" id="num_dente" value="<?php echo $pacie_id ?>"/>
<input type="hidden" name="id_agen" id="num_dente" value="<?php echo $id_agen ?>"/>
<label>Nome: </label>
<input type="text" name="num_dente[]" id="num_dente"/>
<label>Obs: </label>
<input type="text" name="obs[]" id="obs" placeholder="Obs" />
<label>Valor </label>
<input type="text" name="valor[]" id="valor" placeholder="R$" />
<button type="button" onclick="adicionarCampo()"> + </button>
</div>
</div>
<div class="form-group">
<input type="submit" value="Cadastrar" name="Salvar" />
</div>
</form>
<script src="js/custom.js"></script>
A consulta
$pacie_id = $_GET['pacie_id'];
$agen_id = $_GET['id_agen'];
$dados = filter_input_array(INPUT_POST, FILTER_DEFAULT);
if(!empty($dados['CadUsuario'])){
foreach($dados['num_dente'] as $chave => $num_dente){
$query_usuario = "INSERT INTO atendimento (pacie_id, agen_id, num_dente, obs, valor) VALUE (:pacie_id, :agen_id, :num_dente, :obs, :valor)";
$cad_usuario = $pdo->prepare($query_usuario);
$cad_usuario->bindParam(':pacie_id', $pacie_id);
$cad_usuario->bindParam(':agen_id', $agen_id);
$cad_usuario->bindParam(':num_dente', $dados['num_dente'][$chave]);
$cad_usuario->bindParam(':obs', $dados['obs'][$chave]);
$cad_usuario->bindParam(':valor', $dados['valor'][$chave]);
$cad_usuario->execute();
E esse é o javascript do arquivo custom.js que clicando no "+" ele adiciona mais um campo
var controleCampo = 1;
function adicionarCampo() {
controleCampo++;
//console.log(controleCampo);
document.getElementById('formulario').insertAdjacentHTML('beforeend', '
<div class="form-group" id="campo' + controleCampo + '">
<label></label><input type="hidden" name="pacie_id" id="num_dente" value="<?php echo $pacie_id ?>"/>
<label></label><input type="hidden" name="agen_id" id="num_dente" value="<?php echo $agen_id ?>"/>
<label class="form-label"> Dente: </label><input type="text" class="formcodac-text-input-dente" name="num_dente[]" id="num_dente" placeholder="Nº Dente" />
<label class="form-label"> Obs: </label><input type="text" class="formcodac-text-input-obs" name="obs[]" id="obs" placeholder="Observações required "/>
<label class="form-label"> Valor: </label><input type="text" class="formcodac-text-input-valor" name="valor[]" id="valor" placeholder="Valor required "/>
<button class="btn btn-danger" type="button" id="' + controleCampo + '" onclick="removerCampo(' + controleCampo + ')"> X </button></div>');
}
function removerCampo(idCampo){
//console.log("Campo remover: " + idCampo);
document.getElementById('campo' + idCampo).remove();
}
Faz alguns dias que estou quebrando a cabeça e não consigo resolver...
Frank editei o post, tinha colocado o arquivo que estava testando, foi mal, se precisar de mais alguma coisa avise, obrigado>
2 horas atrás, Frank K Hosaka disse:
A sua listagem é parcial, mas eu consegui improvisar alguma coisa. Eu não consigo é improvisar o botão + que você menciona na sua mensagem e nem a variável $dados[cad_atend] e $dados[num_roda]. Tem jeito de mostrar como eles aparecem no seu código?
Editei o post Frank, a variável $dados[cad_atend] e $dados[num_roda] era testes, desconsidere, já não fazem mais parte do código
OS input aparecem com um botão ao lado
<button type="button" onclick="adicionarCampo()"> + </button>
Onde clicando ele repete a linha de inputs. e estes com um botão para excluir essa linha, que esta no js acima.Já estou usando a nova versão, mas estou enfrentando problema com o formulário. Desconfio que ele usa o método GET, logo o comando correto para pegar todos os dados é:
$dados = filter_input_array(INPUT_GET, FILTER_DEFAULT).
Mesmo assim, eu não consigo pegar o valor de $_GET['pacie_id'].
Eu desconfio que o problema está nos nomes dos campos, alguns você chama de "pacie_id" e outros de "obs[ ]". Não consigo enxergar o propósito de dar o nome simples a alguns campos <input> e nome de vetores para outros <input>. Para prosseguir no meu estudo, vou dar nome simples para todos <input>, e ver se consigo enxergar o propósito do código.Testei o seu código JavaScript, usando esse código:
<?php $pacie_id=1; $agen_id=1 ?>
<script>
var controleCampo = 1;
function adicionarCampo() {
controleCampo++;
novocampo='<div id=campo' + controleCampo + '>'
novocampo+='<input type=hidden name=pacie_id id=num_dente value=' + <?=$pacie_id?> + '>'
novocampo+='<input type=hidden name=agen_id id=num_dente value=' + <?=$agen_id?> + '>'
novocampo+='<Dente: <input name=num_dente >Obs: <input name=obs>Valor: <input name=valor>'
novocampo+='<button onclick=removerCampo(' + controleCampo + ')> X </button></div>'
formulario.insertAdjacentHTML('beforeend',novocampo)}
function removerCampo(idCampo){document.getElementById('campo' + idCampo).remove();}
</script>
<input type=submit value=teste onclick=adicionarCampo()>
<form id=formulario></form>
É um código interessante, ele duplica o formulário com os mesmos campos e com os mesmos nome.
O problema aqui é de lógica: se você já tem um formulário para cadastrar o dente, para que pedir para o JavaScript para duplicar o formulário?>
47 minutos atrás, Frank K Hosaka disse:
É um código interessante, ele duplica o formulário com os mesmos campos e com os mesmos nome.
O problema aqui é de lógica: se você já tem um formulário para cadastrar o dente, para que pedir para o JavaScript para duplicar o formulário?
Porque uma pessoa tem 32 dentes e o dentista pode fazer duas ou três restauração e cada dente tem um número
Cada dente tem um nº uma observação (o que foi feito) e um valor
Preciso que isso seja gravado no banco relacionando o pacie_id e o agen_id (paciente e agendamento), alguma sugestão melhor para atingir esse objetivo no código?
Odontologia não é a minha praia, mas eu suponho que no dia a dia a coisa é assim
João agenda para 22/03/2023 às 10 hs o implante do dente 14 de cima, o clareamento do dente 24 debaixo, a retirada do dente 13 de cima. O id_serviço do implante é 1, clareamento é 2 e retirada 3.
O formulário deveria contemplar uma única agenda, com um único cliente e com vários serviços.
Nesse caso, precisamos de duas tabelas: a agenda (o id_agenda, data-hora, o id_cliente) e o serviço (id_agenda, id_serviço,id_dente)
Temos duas tarefas no banco de dados
insert into tbagenda (horario,id_cliente) values ("2023-03-21 10:00",15) // 15 é o id do João.
Vamos supor que o id_agenda que foi criado nesse processo seria 115, assim podemos seguir assim
insert into tbservicosagendados (id_agenda, id_servico, id_dente) values (115,1,14C), (115,2,24B), (115,3,13C)
Ou seja, precisariamos de dois formulários, um para abrir a agenda, e outra para cadastrar os serviços para essa agenda.
Banco de dados é muito chato, para cada tipo de evento tem que ter um única tabela. Agenda é uma coisa. Cliente é outra coisa. Serviço é outra coisa. Cobrança é outra coisa. Mas quanto melhor você atribuir a responsabilidade de cada tabela melhor será produtivo a manutenção da informação.>
9 horas atrás, Frank K Hosaka disse:
Temos duas tarefas no banco de dados
insert into tbagenda (horario,id_cliente) values ("2023-03-21 10:00",15) // 15 é o id do João.
Vamos supor que o id_agenda que foi criado nesse processo seria 115, assim podemos seguir assim
insert into tbservicosagendados (id_agenda, id_servico, id_dente) values115,1,14C, (115,2,24B), (115,3,13C)
Ou seja, precisariamos de dois formulários, um para abrir a agenda, e outra para cadastrar os serviços para essa agenda.
Sim, mas o meu maior problema é o código estar gravando repetido com um submit ele repete os mesmo dadosO problema não está no código, o problema está no banco de dados, você precisa consertá-lo. Não adianta mexer no código, se o banco de dados não está preparado para receber as informações. Para tornar um banco de dados funcional você precisa aplicar o princípio da atomização da informação. Você não pode colocar o compromisso, o serviço e o valor do serviço numa só tabela, você tem que separar tudo, para depois ajuntar.
Um exemplo prático de atomização é esse daqui: João marcou consulta no dia 22. Logo a tabela agenda só pode ter apenas essa informação, não pode repetir tantas vezes para quantos dentes o João precisa tratar.
Caso você ache pouco prático esse tipo de enfoque, melhor largar o MySQL, o PHP, e trabalhar com o Microsoft Excel, o Excel aceita qualquer coisa.
Mas se você quiser apostar no banco de dados, aqui eu fiz um código bem básico que separa a agenda e os serviços prestados ao paciente:
<!--mysql
CREATE TABLE agenda (id int AUTO_INCREMENT, data date not null,
paciente varchar(45) not null, PRIMARY KEY (id))
ENGINE=InnoDB AUTO_INCREMENT=1;
CREATE TABLE servicos (id int AUTO_INCREMENT, id_agenda int not null,
servico varchar(45) not null, PRIMARY KEY (id))
ENGINE=InnoDB AUTO_INCREMENT=1 -->
<?php $pdo=new PDO('mysql:host=localhost;dbname=astudy','root',''); ?>
<form>
<div style="width:25%;margin:0 auto;margin-top:5%"><table>
<tr><td><td>Agendamento
<tr><td>Data:<td><input type=date name=data>
<tr><td>Paciente:<td><input name=paciente>
</table></div>
</form>
<?php
if(isset($_GET['id_agenda'])){
$id_agenda=$_GET['id_agenda'];
if(isset($_GET['limpeza'])){
$stm=$pdo->prepare("insert into servicos (id_agenda,servico) values ($id_agenda,'limpeza')");
$teste=$stm->execute();
if(!$teste){echo "problema";exit;}}
if(isset($_GET['obturação'])){
$stm=$pdo->prepare("insert into servicos (id_agenda,servico) values ($id_agenda,'obturacao')");
$stm->execute();}
exit;}
if(!isset($_GET['data'])){exit;}
$data=$_GET['data'];
$paciente=$_GET['paciente'];
$stm=$pdo->prepare("insert into agenda (data,paciente) values (?,?)");
$stm->execute([$data,$paciente]);
$id_agenda=$pdo->lastInsertId(); ?>
<form>
<div style="width:25%;margin:0 auto;margin-top:5%"><table>
<tr><td>Escolha os serviços para o paciente <?=$paciente?>
<tr><td><input type=checkbox name=limpeza>Limpeza
<tr><td><input type=checkbox name=obturação>Obturação
<input type=hidden name=id_agenda value=<?=$id_agenda?>>
<tr><td><input type=submit>
</table></div>
</form>
A sua listagem é parcial, mas eu consegui improvisar alguma coisa. Eu não consigo é improvisar o botão + que você menciona na sua mensagem e nem a variável $dados[cad_atend] e $dados[num_roda]. Tem jeito de mostrar como eles aparecem no seu código?