Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

manolegal

Mostrar mensagem PHP

Recommended Posts

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.