Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Prezados,
Como eu faço para inserir dados no DB em uma tabela mestre e três outras detalhes tudo em um único submit? Quero um dica que seja segura, pois como se trata de dados, não quero correr risco de falta de consistência de informações.
Grato e aguardo qualquer orientação.
>
Ué...
- Insert na tabela mestre
- Pega o last_insert_id
- Insere na primeira tabela detalhe
- Insere na segunda tabela detalhe
- Insere na terceira tabela detalhe
- Redirect / Mensagem de confirmação.
Não entendi sua dúvida na verdade. Mas se for algo sobre a rotina de execução, espero ter ajudado.
Explicando melhor:
Eu quero informar tudo, ou seja, o mestre e todos os registros detalhes sem submeter nada, da[i quando eu fosse submeter faria a inserção dos dados de uma única vez. Entendeu?
Bom dia para todos, amigo, jé pensou em usar triggers, direto pelo banco, se tu consegue todos os dados no primeiro insert, depois é só criar as triggers que o banco faz sozinho, mas tem que ver no seu host se eles vão te dar suporte ao uso de triggers, pois tem alguns hosts que não liberam tal recurso.
Bom dia para todos, amigo, jé pensou em usar triggers, direto pelo banco, se tu consegue todos os dados no primeiro insert, depois é só criar as triggers que o banco faz sozinho, mas tem que ver no seu host se eles vão te dar suporte ao uso de triggers, pois tem alguns hosts que não liberam tal recurso.
Olá,
A minha preocupação não seria a inserção propriamente dita, mas sim a interface com o usuário. Quero o usuário faça tudo que seja necessário em "tela" e daí quando ele terminar tudo... submeter de uma só vez essas informações no banco.
Peço desculpa, se não fui claro nas minhas colocações relativas a minha dúvida.
Grato..
Use javascript e altere o DOM.
Crie elementos em um formulário, depois realize o submit, com todos os dados, de uma só vez.
Amigo, tenho isto aqui na nossa intranet, eu faço da seguinte forma:
salvo todo o pedido na sessão, e depois com um botão eu chamo o arquivo que finaliza o pedido e faz a inserção no BD, segue uma imagem do formulario
/applications/core/interface/imageproxy/imageproxy.php?img=http://i63.tinypic.com/1zpmdjc.png&key=b4d4c380728be4efed3f07091fe9bf960e6c01afd27b2b3c4ca9c3e16e2e830f" alt="1zpmdjc.png" />
Depois entra o php:
<?php
include_once './cabecalho.php';
$msg='';
$objProdutos = new Produtos();
$objFuncionario = new Funcionarios();
$objPedidos = new Pedidos();
//SELECT PRODUTOS
$produtos=$objProdutos->montaSelec('produto_id',null," WHERE pro.qtde > 0 "); //TRAZ SOMENTE PRODUTOS COM QTDE MAIOR QUE ZERO
$wLista='<tr>
<td>1</td>
<td>'. $produtos.'</td>
<td><input class="form-control" name="qtde" id="qtde" required=""></td>
</tr>';
//AQUI FAZER UM BACALHAO PARA IR PREECHENDO OS ITENS DO PEDIDO
if (isset($_SESSION['pedidoi'])){
$wCont=1;
$wLista='';
foreach ($_SESSION['pedidoi'] as $produto_id => $qtde) { $objProduto = new Produtos();
$objProduto->id=$produto_id;
$produto = $objProduto->SelectUm();
$wLista.='<tr>
<td>'.$wCont.'</td>
<td><input type="hidden" name="produto_id" value="'.$produto_id.'">'.$produto->nome.'</td>
<td><input type="text" class="form-control" value="'.$qtde.'" readonly="on"></td>
<td><button class="btn btn-danger btn-lx" type="button" onclick="ApagaColuna(this,'.$produto_id.');">Remover</button></td>
</tr>';
$wCont++;
}
}
if ($_GET){
//REMOVE ITEM DO PEDIDO
$id = intval($_GET['excluir']);
if(isset($_SESSION['pedidoi'][$id])){
unset($_SESSION['pedidoi'][$id]);
header("Location: pedidoIncluir.php");
exit();
}
}
if ($_POST){
//VERIFICA SE FOI SELECIONADO ALGUM PRODUTO
//ADICIONA ITENS AO PEDIDO
//CRIA A SESSÃO COM A CABEÇA DO PEDIDO
//CRIA A SESSÃO COM O CORPO DO PEDIDO
if ($_POST['produto_id']=="0"){
escreve("INFORMAR UM PRODUTO");
}else{
//VERIFICA SE TEM EMPRESA DEFINIDA
if (EMPRESA_ID=='' || EMPRESA_ID=='TD'){
if ($_POST['empresa']=='0'){
escreve("INFORMAR A EMPRESA");
}else{
if (EMPRESA_ID=='TD'){
$_SESSION['pedido']['empresa_id']=$_POST['empresa'];
}
//VERIFICA SE QUANTIDADE É IGUAL OU MAIOR QUE 0(ZERO)
if ($_POST['qtde']<='0'){
escreve("INFORMAR QTDE MAIOR QUE ZERO");
}else{
if (isset($_POST['adicionaItem'])){
$_SESSION['pedido']['data_cad']= date('y/m/d');
$_SESSION['pedido']['chave']= session_id().$objPedidos->pegaUltimaID(); //PEGAR ALGUM DADO PARA DESEMPATAR
//CASO JA TENHA ADICIONADO O PRODUTO DA UM ELE VAI PEGAR O ÚLTIMO LANÇAMENTO.
$qtde_pro = intval($_POST['qtde']);
$_SESSION['pedidoi'][$_POST['produto_id']] = $qtde_pro;
header("Location: pedidoIncluir.php");
exit();
}
}
}
}
}
}
?>Mas é o modo que eu consegui fazer.
Conseguiu solucionar amigo?
>
Use javascript e altere o DOM.
Crie elementos em um formulário, depois realize o submit, com todos os dados, de uma só vez.
Olá,
Entendi o seu raciocínio, mas te confesso que não sei como coloca-lo em prática. Exemplos de como fazer, mesmo que pequenos, me ajudariam muito.
Grato pela sua atenção.
Conseguiu solucionar amigo?
Olá,
Ainda não, mas estou correndo atrás...
Grato por perguntar.
>
Amigo, tenho isto aqui na nossa intranet, eu faço da seguinte forma:
salvo todo o pedido na sessão, e depois com um botão eu chamo o arquivo que finaliza o pedido e faz a inserção no BD, segue uma imagem do formulario
/applications/core/interface/imageproxy/imageproxy.php?img=http://i63.tinypic.com/1zpmdjc.png&key=b4d4c380728be4efed3f07091fe9bf960e6c01afd27b2b3c4ca9c3e16e2e830f" alt="1zpmdjc.png" />
Depois entra o php:
<?php
include_once './cabecalho.php';
$msg='';
$objProdutos = new Produtos();
$objFuncionario = new Funcionarios();
$objPedidos = new Pedidos();
//SELECT PRODUTOS
$produtos=$objProdutos->montaSelec('produto_id',null," WHERE pro.qtde > 0 "); //TRAZ SOMENTE PRODUTOS COM QTDE MAIOR QUE ZERO
$wLista='<tr>
<td>1</td>
<td>'. $produtos.'</td>
<td><input class="form-control" name="qtde" id="qtde" required=""></td>
</tr>';
//AQUI FAZER UM BACALHAO PARA IR PREECHENDO OS ITENS DO PEDIDO
if (isset($_SESSION['pedidoi'])){
$wCont=1;
$wLista='';
foreach ($_SESSION['pedidoi'] as $produto_id => $qtde) { $objProduto = new Produtos();
$objProduto->id=$produto_id;
$produto = $objProduto->SelectUm();
$wLista.='<tr>
<td>'.$wCont.'</td>
<td><input type="hidden" name="produto_id" value="'.$produto_id.'">'.$produto->nome.'</td>
<td><input type="text" class="form-control" value="'.$qtde.'" readonly="on"></td>
<td><button class="btn btn-danger btn-lx" type="button" onclick="ApagaColuna(this,'.$produto_id.');">Remover</button></td>
</tr>';
$wCont++;
}
}
if ($_GET){
//REMOVE ITEM DO PEDIDO
$id = intval($_GET['excluir']);
if(isset($_SESSION['pedidoi'][$id])){
unset($_SESSION['pedidoi'][$id]);
header("Location: pedidoIncluir.php");
exit();
}
}
if ($_POST){
//VERIFICA SE FOI SELECIONADO ALGUM PRODUTO
//ADICIONA ITENS AO PEDIDO
//CRIA A SESSÃO COM A CABEÇA DO PEDIDO
//CRIA A SESSÃO COM O CORPO DO PEDIDO
if ($_POST['produto_id']=="0"){
escreve("INFORMAR UM PRODUTO");
}else{
//VERIFICA SE TEM EMPRESA DEFINIDA
if (EMPRESA_ID=='' || EMPRESA_ID=='TD'){
if ($_POST['empresa']=='0'){
escreve("INFORMAR A EMPRESA");
}else{
if (EMPRESA_ID=='TD'){
$_SESSION['pedido']['empresa_id']=$_POST['empresa'];
}
//VERIFICA SE QUANTIDADE É IGUAL OU MAIOR QUE 0(ZERO)
if ($_POST['qtde']<='0'){
escreve("INFORMAR QTDE MAIOR QUE ZERO");
}else{
if (isset($_POST['adicionaItem'])){
$_SESSION['pedido']['data_cad']= date('y/m/d');
$_SESSION['pedido']['chave']= session_id().$objPedidos->pegaUltimaID(); //PEGAR ALGUM DADO PARA DESEMPATAR
//CASO JA TENHA ADICIONADO O PRODUTO DA UM ELE VAI PEGAR O ÚLTIMO LANÇAMENTO.
$qtde_pro = intval($_POST['qtde']);
$_SESSION['pedidoi'][$_POST['produto_id']] = $qtde_pro;
header("Location: pedidoIncluir.php");
exit();
}
}
}
}
}
}
?>Mas é o modo que eu consegui fazer.
Olá,
Aparentemente o seu exemplo servirá com ponto de partida para o que eu quero. Será que seguindo o seu método, eu não terei problemas com perda de dados no momento da inserção? Falo pelo fato de tudo estar em "memória".
Muito obrigatório pela sua atenção e se tiver algo a acrescentar, não se furte.
Abraço!
Amigo, aqui eu nunca tive estes tipos de problemas, até pq o tráfego na nossa rede não é tão grande, mas se esta na sessão e depois vai pro banco...acho que não tem o que dar erro, lógico, teriamos que tratar possíveis erros.
Mas esta é um norte só né...heheh
abraços...
Não precisa jogar em Sessions. Você pode passar em post desta mesma maneira. Apenas use inputs com o nome em comum e adicione "[]" ao final do name.
A lógica é esta (montei rapidamente para você):
http://codepen.io/maykelesser/pen/vGxVgp
Aí, quando der o submit, pega mais ou menos assim:
for ( $i = 0; $i < count( $_POST['txCampo'] ); $i++ ){
// * Faz a inserção no seu banco de dados ;)
}>
Não precisa jogar em Sessions. Você pode passar em post desta mesma maneira. Apenas use inputs com o nome em comum e adicione "[]" ao final do name.
A lógica é esta (montei rapidamente para você):
http://codepen.io/maykelesser/pen/vGxVgp
Aí, quando der o submit, pega mais ou menos assim:
for ( $i = 0; $i < count( $_POST['txCampo'] ); $i++ ){
// * Faz a inserção no seu banco de dados ;)
}
Olá Maykel-ctba, bom dia.
Pois é, acho que trabalhar com sessions tem lá as suas vantagens, mas penso que para o meu caso não ficaria muito legal não, haja vista que o meu "submit" será meio extenso, aonde o mesmo terá uma tabela mestre e quatro tabelas detalhes, e isso sem falar que uma dessas detalhes poderá ter até mais de cem registros por "submit" relacionado com a sua mestre.
Outra dúvidas:
Utilizando essa "técnica" não terei problemas com perda de registros? Não falo com relação ao DB, mas sim com os dados que estão nos inputs.
Muitíssimo obrigado pela sua atenção e aguardo pelo seu comentário.
Forte abraço!
Cara, eu uso isso num formulário enorme. Se você inserir corretamente, não terá riscos com perda de registros. Faça bastantes testes antes.
Bom dia.
Por que você não trabalha com tabelas temporárias?
Vamos supor um caso, como o que tenho aqui na empresa.Desenvolvi uma interface Web para inserção de pedidos no ERP.
A interface se conecta diretamente no SQL do ERP.
Quando o usuário inicia um novo pedido, o sistema automaticamente atribui um ID para ele, e o usuário seleciona o cliente, forma de pagamento e outros dados do pedido.
Em relação aos itens, conforme ele vai adicionando os produtos no pedido, eu vou gravando-os em uma tabela temporária, chamada "##PedidoDeVendaItem_" + o ID do pedido gerado.
Quando o usuário clica em "Gravar Pedido", eu insiro as informações do "cabeçalho do pedido", digamos assim, que são o cliente, o ID, o número e etc, na tabela de PedidoDeVenda, e na mesma hora faço uma consulta na tabela temporária de produtos, e adiciono os registros na tabela oficial.
Assim, existe apenas um submit de dados ao se gravar o pedido.
Cara, eu uso isso num formulário enorme. Se você inserir corretamente, não terá riscos com perda de registros. Faça bastantes testes antes.
Beleza.
Grato pela sua atenção.
>
Bom dia.
Por que você não trabalha com tabelas temporárias?
Vamos supor um caso, como o que tenho aqui na empresa.Desenvolvi uma interface Web para inserção de pedidos no ERP.
A interface se conecta diretamente no SQL do ERP.
Quando o usuário inicia um novo pedido, o sistema automaticamente atribui um ID para ele, e o usuário seleciona o cliente, forma de pagamento e outros dados do pedido.
Em relação aos itens, conforme ele vai adicionando os produtos no pedido, eu vou gravando-os em uma tabela temporária, chamada "##PedidoDeVendaItem_" + o ID do pedido gerado.
Quando o usuário clica em "Gravar Pedido", eu insiro as informações do "cabeçalho do pedido", digamos assim, que são o cliente, o ID, o número e etc, na tabela de PedidoDeVenda, e na mesma hora faço uma consulta na tabela temporária de produtos, e adiciono os registros na tabela oficial.
Assim, existe apenas um submit de dados ao se gravar o pedido.
Entendi. Vou teste isso depois.
Grato pela sua atenção.
O uso de tabelas temporárias é um contorno para as limitações de certas linguagens. Usadas principalmente em linguagens mais ultrapassadas ou, em alguns casos, pois "sempre foi assim". O caso mais simples é quando o sistema/linguagem não consegue manter dados em nível de aplicação, sessão ou client.
Além de gerar overhead de transação (aumentando o I/O com o SGBD) as tabelas temporárias são desnecessárias no seu caso.
Na época que me questionou sobre exemplos, acabei ficando sem acessar o fórum, veja se o que há abaixo pode lhe ajudar:
http://www.randomsnippets.com/2008/02/21/how-to-dynamically-add-form-elements-via-javascript/
http://www.dustindiaz.com/add-and-remove-html-elements-dynamically-with-javascript/
http://stackoverflow.com/questions/14853779/adding-input-elements-dynamically-to-form
http://jsfiddle.net/jaredwilli/tzpg4/4/ (usando jQuery, o que não é necessário, mas a lógica vai ajudar)
Enviando array através de post:
http://forum.imasters.com.br/topic/462549-resolvidoretornar-array-de-inputs-com-mesmo-nome/
Ué...
- Insert na tabela mestre
- Pega o last_insert_id
- Insere na primeira tabela detalhe
- Insere na segunda tabela detalhe
- Insere na terceira tabela detalhe
- Redirect / Mensagem de confirmação.
Não entendi sua dúvida na verdade. Mas se for algo sobre a rotina de execução, espero ter ajudado.