manolegal 12 Denunciar post Postado Outubro 30, 2016 Boa tarde Tenho arquivo que grava registro e retorna último registro gravado. Inicialmente este arquivo somente gravava no BD e estava utilizando o seguinte código: if ($_SERVER['REQUEST_METHOD'] == "POST") { $pessoa_nome = $_POST['pessoa_nome']; $erro=0; if (empty($pessoa_nome)){ $erro=1; $msg_erro[] = "<center><b><font color=#FF0000>Informe o Nome!</font></b></center>"; } if (($erro==0) AND (!isset($msg_erro))){ $Sql = "INSERT INTO ........."; $Resultado = executa($Sql); if ($Resultado) { echo true; // Estava utilizando este valor para mostrar mensagem no retorno } else{ echo "Não foi possível realizar o cadastro!"; } } } No meu formulário estava mostrando as mensagens de retorno da seguinte maneira: success: function(retorno){ if (retorno != true) { $("#mensagem").html(retorno); } else{ $("#mensagem").html("Cadastro efetuado com sucesso!"); $("#pessoa_nome").val(""); $("#teste_coluna").val(""); } } Porém alterei para que o arquivo mostre o último registrado cadastrado após o insert, e trago este valor para atualizar um campo do meu formulário: if (($erro==0) AND (!isset($msg_erro))){ $Sql = "INSERT INTO ......"; $Resultado = executa($Sql); if ($Resultado) { $Sql_lista = "SELECT id_teste as id_pessoa, coluna_teste as nome FROM aaa_teste ORDER BY id_teste DESC LIMIT 1"; $Resultado_lista = executa($Sql_lista); while ($linha = pg_fetch_array($Resultado_lista)){ $id_pessoa = $linha["id_pessoa"]; $pessoa_nome = $linha["nome"]; echo "<option value='$id_pessoa'>$pessoa_nome ($id_pessoa)</option>"; // Utilizado para atualizar campo do formulário return true; // Isso é possível? } } else{ echo false; // Isso é possível? echo "Não foi possível realizar o cadastro!"; } } // Fecha "if (($erro==0) AND (!isset($msg_erro))){ " Como estou enviando echo "<option value='$id_pessoa'>$pessoa_nome ($id_pessoa)</option>"; como faço para continuar mantendo as mesmas mensagens, uma vez "que não existe mais" o retorno if (retorno != true) { ?. Compartilhar este post Link para o post Compartilhar em outros sites
manolegal 12 Denunciar post Postado Outubro 30, 2016 Alterei para: if (($erro==0) AND (!isset($msg_erro))){ $Sql = "INSERT INTO ........"; $Resultado = executa($Sql); if ($Resultado) { $resposta = "Inserido"; // Havendo inserção no BD }else{ $resposta = "Não inserido"; // Não havendo inserção no BD } echo $resposta; // Retorna $Sql_lista = "SELECT id_teste as id_pessoa, coluna_teste as nome FROM aaa_teste ORDER BY id_teste DESC LIMIT 1"; $Resultado_lista = executa($Sql_lista); while ($linha = pg_fetch_array($Resultado_lista)){ $id_pessoa = $linha["id_pessoa"]; $pessoa_nome = $linha["nome"]; echo "<option value='$id_pessoa'>$pessoa_nome ($id_pessoa)</option>"; // Retorna também } } // Fecha "if (($erro==0) AND (!isset($msg_erro))){ " Alterei também para: success: function(retorno){ console.log(retorno); if (retorno != "Inserido") { $("#mensagem").html(retorno); } else{ $("#mensagem").html("_Cadastro efetuado com sucesso!"); $("#pessoa_nome").val(""); $("#teste_coluna").val(""); } } A primeira está funcionando: if (retorno != "Inserido") {. O problema é que se os dados forem gravados no BD estou retornando 02 valores: Inserido e <option value='$id_pessoa'>$pessoa_nome ($id_pessoa)</option>, e aí está o problema para comparação. Teoricamente teria que utilizar no if do retorno: if (retorno != "Inserido<option value='$id_pessoa'>$pessoa_nome ($id_pessoa)</option>"), mas acho que não é isso. 1 - Como faço para verificar corretamente se houve sucesso na gravação do BD. 2 - Preciso do echo "<option value='$id_pessoa'>$pessoa_nome ($id_pessoa)</option>"; no arquivo de inserção no BD, ou há outra forma de trazer este dado no arquivo com ajax? Compartilhar este post Link para o post Compartilhar em outros sites
manolegal 12 Denunciar post Postado Novembro 1, 2016 Alterei meus códigos: grava.bd: $Sql_insert = "INSERT INTO......"; $Resultado_insert = executa($Sql_insert); if ($Resultado_insert) { // Se houve Insert $resposta = "Inserido"; $Sql_lista = "SELECT ......."; // Faço busca último dado inserido $Resultado_lista = executa($Sql_lista); $total_registros_lista = pg_num_rows($Resultado_lista); $array_dados = array(); while ($dados = pg_fetch_assoc($Resultado_lista)){ $array_dados[] = $dados; } } else{ $resposta = "Não inserido"; } echo $resposta; echo json_encode($array_dados); meu_arquivo.php success: function(retorno){ console.log(retorno); if (retorno != "Inserido") { $("#mensagem").html(retorno); } else{ $("#mensagem").html("Cadastro efetuado com sucesso!"); $("#pessoa_nome").val(""); $("#teste_coluna").val(""); O problema é como enviar os dados "separadamente" (ou enviá-los em uma mesma variável e depois dividi-los no retorno) e poder separar o valor de $resposta de json_encode($array_dados);, para que eu possa tornar correta a expressão if (retorno != "Inserido") {, pois no momento ao invés de Inserido está retornando Inserido[{"id_pessoa":"278","nome":Teste nome"}]. Se alguém puder me ajudar, agradeço. É muito importante para mim. Compartilhar este post Link para o post Compartilhar em outros sites
saidmrn 26 Denunciar post Postado Novembro 1, 2016 Você poderia colocar tudo dentro do JSON. Ficaria: [{"id_pessoa":"278","nome":"Teste nome","inserido":"1"}] Depois para separar: var resposta = jQuery.parseJSON(retorno); if(resposta.inserido == "1") { // cadastro feito com sucesso $("#mensagem").html("Cadastro efetuado com sucesso!"); $("#pessoa_nome").html(resposta.nome); // id da pessoa: console.log(resposta.id_pessoa); } Compartilhar este post Link para o post Compartilhar em outros sites
manolegal 12 Denunciar post Postado Novembro 1, 2016 Saidmrn, obrigado pela ajuda. É meu primeiro código ajax/Json e estou com bastante dificuldades. Para colocar tudo dentro do JSON seria? echo json_encode($array_dados, $resposta); Compartilhar este post Link para o post Compartilhar em outros sites
manolegal 12 Denunciar post Postado Novembro 1, 2016 Fiz da seguinte maneira: $array_dados = array(); $array_dados[] = $dados; // Dados vindo do BD (id_pessoa e nome) $array_dados[] = $resposta; // Inserido ou Não inserido echo json_encode($array_dados, true); Retornando: [{"id_pessoa":"290","nome":"Nome_testes"},"Inserido"] // Um pouco diferente da sua sugestão Ao incluir na função ajax no meu form de cadastro: dataType: 'json', Está retornado: Array [ Object, "Inserido" ] Está correto esta forma? Compartilhar este post Link para o post Compartilhar em outros sites
saidmrn 26 Denunciar post Postado Novembro 2, 2016 Você pode fazer assim: var json = jQuery.parseJSON('[{"id_pessoa":278,"nome":"teste nome"},"inserido"]'); if(json[1] == "inserido") { // inseriu console.log("Nome:"+ json[0].nome); } Compartilhar este post Link para o post Compartilhar em outros sites
manolegal 12 Denunciar post Postado Novembro 2, 2016 Está retornando <unavailable>. Pesquisei mais alguns tutoriais e alterei partes do meu código. Novas dúvidas surgiram. grava.bd header ('Content-type: text/plain; charset=UTF-8'); if ($_SERVER['REQUEST_METHOD'] == "POST") { $array_dados = array(); $pessoa_nome = $_POST['pessoa_nome']; // Recebo dado digitado no campo do meu form $erro=0; // Dados digitados válidos // Se dados digitados não são válidos atribuo erro como 1 if (empty($pessoa_nome)){ $erro=1; $msg_erro[] = "Informe o Nome!"; } if (strlen($pessoa_nome) <3 ){ $erro=1; $msg_erro[] = "Nome inválido!"; } $array_dados['erros'] = $msg_erro; // Mensagens de erro em array if ($erro==0){ // Se dados digitados estão OK $Sql_insert = "INSERT INTO ..."; $Resultado_insert = executa($Sql_insert); if ($Resultado_insert) { // Se insert OK $array_dados['inserido'] = true; // Insert OK $Sql_lista = "SELECT ..."; // Listo último dado inserido $Resultado_lista = executa($Sql_lista); while ($dados = pg_fetch_assoc($Resultado_lista)){ $array_dados['dados'] = $dados; // Dados do registro inserido } } else{ $array_dados['inserido'] = false; // Se não houve inserção } } // Fecha "$erro==0" else{ // Se existem mensagens de erro ($erro=1;) $array_dados['inserido'] = false; $array_dados['dados'] = $dados; } echo json_encode($array_dados, true); } Quando existe alguma mensagem de erro ($erro=1;), está passando JSON o seguinte: Object { erros: Array[2], inserido: false, dados: false } // Sendo: Array[2] 0:"Informe o Nome!" 1:"Nome inválido!" length:2 __proto__:Array[0] Quando não há erros, havendo inserção: Object { erros: null, inserido: true, dados: Object } // Sendo Object id_pessoa: "100" // Id inserido no BD nome: "Teste nome" __proto__: Object No ajax está assim: $.ajax({ .... dataType: 'json', encode: true, success: function(retorno){ console.log(retorno); //var json = jQuery.parseJSON(retorno); if (retorno.inserido == true) { // Se insert no BD $("#mensagem").html("Cadastro efetuado com sucesso!"); $("#pessoa_nome").val(""); $("#teste_coluna").val(""); //console.log("Nome:"+ json[0].nome); } else{ if (retorno.erros){ $("#mensagem").html(retorno.erros); } } } Algumas dúvidas: Mantendo var json = jQuery.parseJSON(retorno); comentado: Se dados forem inseridos corretamente (if (retorno.inserido == true) {) está mostrando corretamente a mensagem html e limpando os campos. Se dados não foram inseridos e existem mensagem de erros (if (retorno.erros){), está mostrando as mensagens de erro, porém uma ao lado da outra: Informe o Nome!Nome inválido! Gostaria de saber como faço para colocar cada mensagem de erro em uma linha: Informe o Nome! Nome inválido! Porque ao incluir var json = jQuery.parseJSON(retorno); não aparecem as mensagens na tela? Compartilhar este post Link para o post Compartilhar em outros sites
saidmrn 26 Denunciar post Postado Novembro 2, 2016 Acho que a resposta "retorno" já vem automaticamente com o jQuery.parseJSON,logo não é necessário usar. Em relação a por uma linha embaixo da outra Você tá fazendo isso : if (retorno.erros){ $("#mensagem").html(retorno.erros); } Deste modo,você vai "concatenar" tudo que está em erros. Para separar,pode fazer assim: if (retorno.erros){ for(var i=0;i<json.erros.length;i++) { $('#mensagem').append(json.erros[i] + "<br>"); } } Ou seja,você vai percorrer todos os erros que existiram e ir imprimindo um embaixo do outro :) Compartilhar este post Link para o post Compartilhar em outros sites
manolegal 12 Denunciar post Postado Novembro 2, 2016 Em relação aos erros está funcionando, porém os erros estão sendo repetidos: a cada tentativa de gravar os erros são adicionados novamente ao invés de substituir os erros da requisição anterior. Em relação ao var json = jQuery.parseJSON(retorno); não consegui implementá-lo. Ao utilizá-lo as mensagens continuam não aparecendo. Fiz da seguinte forma, e acho q não deve estar correto: success: function(retorno){ var json = jQuery.parseJSON(retorno); if (json.inserido == true) { ...... Compartilhar este post Link para o post Compartilhar em outros sites
saidmrn 26 Denunciar post Postado Novembro 2, 2016 Se você tirou o var json =jQuery.... e funcionou,então deixa sem,pelo visto está funcionando tudo certo. Em relação ao substituir,é so substituir if (retorno.erros){ for(var i=0;i<json.erros.length;i++) { $('#mensagem').append(json.erros[i] + "<br>"); } } por: if (retorno.erros){ $('#mensagem').html(""); for(var i=0;i<json.erros.length;i++) { $('#mensagem').append(json.erros[i] + "<br>"); } } limpando o campo antes de colocar denovo. Compartilhar este post Link para o post Compartilhar em outros sites
manolegal 12 Denunciar post Postado Novembro 3, 2016 Funcionou certinho as mensagens de erro. Se possível, contando com sua colaboração, para finalizar gostaria de incluir os valores cadastrados: id_pessoa e nome no campo #funcionario do meu formulário. Preciso inserir da seguinte forma: <option value='$id_pessoa'>$pessoa_nome ($id_pessoa)</option> Tentei da seguinte forma, mas não funcionou: }).done(function(e){ for(var i=0;i<e.dados.length;i++) { $('#funcionario').prepend($('<option>', { value: i, text : "Option "+i })); } E tentei ainda: for(i=0; i<e.length; i++) { $('#funcionario').append("<option value="+e[i][id_pessoa]+"/option>"); } Compartilhar este post Link para o post Compartilhar em outros sites
saidmrn 26 Denunciar post Postado Novembro 3, 2016 não entendi. for(var i=0;i<e.dados.length;i++) { $('#funcionario').prepend($('<option>', { value: i, text : "Option "+i })); } Esse código seria para listar todos os funcionários inseridos correto ?,mas você está inserindo um de cada vez,logo sua resposta só virá com um funcionário. Tente da seguinte forma : $('#funcionario').append($('<option>', { value: e.dados.id_pessoa, text :e.dados.nome })); Compartilhar este post Link para o post Compartilhar em outros sites
manolegal 12 Denunciar post Postado Novembro 3, 2016 Realmente. Na verdade preciso adicionar com append, somente este funcionário cadastrado, pois os demais já estão cadastrados e listados em #funcionario. Ao acessar meu formulário, o usuário já terá a relação de todas as pessoas cadastradas: <div class="form-group col-md-4 col-md-offset-1"> <select class="form-control" id="funcionario" name="funcionario"> <option value="">- Selecionar Funcionário(a) (Obrigatório) -</option> <?php $Sql = "SELECT id_teste as id_pessoa, coluna_teste as nome FROM aaa_teste ORDER BY id_teste DESC"; $Resultado = executa($Sql); while ($linha = pg_fetch_array($Resultado)){ $id_pessoa = $linha["id_pessoa"]; $pessoa_nome = $linha["nome"]; if ($_POST ["funcionario"] == $id_pessoa){ echo "<option value='$id_pessoa' selected = 'selected'>$pessoa_nome ($id_pessoa)</option>";} else{ echo "<option value='$id_pessoa'>$pessoa_nome ($id_pessoa)</option>";} } ?> </select> </div> E caso a pessoa ainda não estiver cadastrada (listada neste campo) ele faz o cadastro pelo form modal, e ao finalizar o cadastro via modal este dado da pessoa cadastrada deve ser adicionado ao option. Ao implementar o código sugerido, aconteceu o seguinte: Ao cadastrar nova pessoa pelo modal, sem ter havido qualquer mensagem de erro, não adicionou nova linha ao option. Ao cadastrar pessoa em que a mensagem de erro foi mostrada 01 vez, houve a inclusão de 01 linha em branco. Com 02 mensagens de erro, inserido 02 linhas em branco e assim sucessivamente. foi incluída uma linha, porém nenhum dado é mostrado (linha em branco). Compartilhar este post Link para o post Compartilhar em outros sites
manolegal 12 Denunciar post Postado Novembro 3, 2016 Tentei alterar para: success: function(retorno){ if (retorno.inserido == true) { $("#mensagem").html("Cadastro efetuado com sucesso!"); $("#pessoa_nome").val(""); $("#teste_coluna").val(""); $('#funcionario').append($('<option>', { value: retorno.dados.id_pessoa, text :retorno.dados.nome })); E nesta situação nenhuma linha é adicionada. Compartilhar este post Link para o post Compartilhar em outros sites
saidmrn 26 Denunciar post Postado Novembro 3, 2016 simule o cadastro de um funcionário e poste aqui o json retornado pelo servidor. Compartilhar este post Link para o post Compartilhar em outros sites
manolegal 12 Denunciar post Postado Novembro 3, 2016 Object { erros: null, inserido: true, dados: Object } // Sendo dados: Object id_pessoa = "40" nome: "Nome Teste" _proto_: Object Compartilhar este post Link para o post Compartilhar em outros sites
saidmrn 26 Denunciar post Postado Novembro 3, 2016 Testei aqui e está inserindo o funcionário. Deve ser algo em seu projeto que tá impedindo isso ou alguma informação não bate. Compartilhar este post Link para o post Compartilhar em outros sites
manolegal 12 Denunciar post Postado Novembro 3, 2016 Estou usando assim: success: function(retorno){ if (retorno.inserido == true) { $("#mensagem").html("Cadastro efetuado com sucesso!"); $("#pessoa_nome").val(""); $("#teste_coluna").val(""); $('#funcionario').append($('<option>', { value: retorno.dados.id_pessoa, text :retorno.dados.nome })); Está cadastrando no BD, porém não está adicionando este funcionário cadastrado, no campo #funcionario do meu formulário principal. Compartilhar este post Link para o post Compartilhar em outros sites
manolegal 12 Denunciar post Postado Novembro 3, 2016 Funcionou quando retirei o código após o sucess e incluí após .done: }).done(function(retorno){ if (retorno.inserido == true) { $("#mensagem").html("Cadastro efetuado com sucesso!"); $("#pessoa_nome").val(""); $("#teste_coluna").val(""); $('#funcionario').append($('<option>', { value: retorno.dados.id_pessoa, text: retorno.dados.nome })); } else{ ................. Resolvido. Se achar interessante deixar mais alguma observação sobre o código fique a vontade. De qualquer forma, muito obrigado pela disponibilidade em ajudar. Valeu mesmo. Compartilhar este post Link para o post Compartilhar em outros sites