Json php javascript

ola pessoal
estou tentando problema com o redorno do json php para integrar com jquery
esta aparecendo uma mensagem assim

codigo php

$arr = array('dados' => array());
        $i =1;
        while ($row = $stmt->fetch(PDO::FETCH_OBJ)) {

            $arr['idnf']  = ($row->idnotaEntrada);
            $arr['pedido'] = ($row->numeroPedido);
            $arr['forn'] = ($row->descricao);
            $arr['entrada'] = ($row->dataEnt);
            $arr['emissao'] = ($row->dataEmi);
            $arr['valor']  = ($row->valorFinal);
            $arr['x'] = $i;

            $i++;
        }
        echo json_encode($arr);
        

javascript

 success: function( data )  
                {   
                    var n = data.x;
                    
                    //aqui ja aparece a mensagem  -  undefined  - parece que nao consegue reconher o argumento do php
                    alert(n);
                    
                    for(i = 0; i < data.x; i++) {     
                                            
                    var n = "idnf :" + data.idnf + "\n";
                    alert(data.idnf); 
                    }
                 } 

o array do php sai assim

se puder me ajudar agradeço

Ola,

Faz tempo que eu nao mexo com PHP, mas o seu codigo me parece errado, tipo vc cria um array, faz um loop para adicionar dados nesse array, mas vc esta sobrescrevendo os dados a cada interacao do loop e nao adicionando um novo element no array.

$arr = array('dados' => array());  
        $i =1;  
        while ($row = $stmt->fetch(PDO::FETCH_OBJ)) {  
  
            $arr['idnf']  = ($row->idnotaEntrada);  
            $arr['pedido'] = ($row->numeroPedido);  
            $arr['forn'] = ($row->descricao);  
            $arr['entrada'] = ($row->dataEnt);  
            $arr['emissao'] = ($row->dataEmi);  
            $arr['valor']  = ($row->valorFinal);  
            $arr['x'] = $i;  
  
            $i++;  
      }  
echo json_encode($arr); 

Olhando o JSON que vc passou prova a minha teoria, porque nao eh um array e sim um unico objeto:

{"idnf":"31","pedido":"552","forn":"CASA","entrada":"10\/09\/2012","emissao":"20\/09\/2012","valor":"4.44","x":9} 

Os mestres do PHP me corrijam se eu estiver errado mas eu acho que vc teria que fazer algo do tipo:

$arr = array();
while ($row = $stmt->fetch(PDO::FETCH_OBJ)) {
     $arr[] = array(
          'idnf'  => $row->idnotaEntrada,
          'pedido' => $row->numeroPedido,
          'forn' => $row->descricao,
          'entrada' => $row->dataEnt,
          'emissao' => $row->dataEmi,
          'valor'  => $row->valorFinal,  
     );    
}
echo json_encode($arr); 

Ok, agora que a gente arrumou o seu PHP, vamos ver o seu javascript! :slight_smile:
Para que vc precisa do valor “x” ?? Olhando pra sua funcao (client-side), “x” nao eh usado para absolutamente nada alem de ser usado do loop.

success: function( data ) {     
        var n = data.x;  
                    
        //aqui ja aparece a mensagem  -  undefined  - parece que nao consegue reconher o argumento do php  
        alert(n);  
                    
        for(i = 0; i < data.x; i++) {                                                    
             var n = "idnf :" + data.idnf + "\n";  
             alert(data.idnf);   
       }  
}   

Se vc tivesse enviado um array corretamente, mais ou menos assim (repare as chaves [ ] indicando que eh um array):

[{"idnf":"31","pedido":"552","forn":"CASA","entrada":"10\/09\/2012","emissao":"20\/09\/2012","valor":"4.44"},
{"idnf":"32","pedido":"666","forn":"BLABLA","entrada":"10\/09\/2012","emissao":"20\/09\/2012","valor":"4.44"}]

Voce poderia fazer:

sucess: function(data) {
	$.each(data, function(idx, reg) {		
		console.info("idnf: " + reg.idnf);
		console.info("pedido: " + reg.pedido);
		console.info("forn: " + reg.forn);
		console.info("entrada: " + reg.entrada);
		console.info("emissao: " + reg.emissao);
		console.info("valor: " + reg.valor);
	});
}

Entao, minha dica eh, revise o seu codigo PHP, se a sua intencao eh enviar um varios registros, vc precisa montar o seu array corretamente, se a sua intencao eh somente um registro, vc nao precisa criar um array e nem ter aquelo loop. De qualquer forma eu acho desnecessario vc criar esse contador “x” para saber quantos elementos vc tem no array.

Acho que se vc fizer essas modificacoes que eu sugeri para voce, tudo deve funcionar de qualquer forma aqui tem uns links que eu achei que podem te ajudar com o PHP:


//Daniel

usa $stmt->fetchAll() q ele retona um array certinho pra vc, lembre o json deve estar em utf8.
o q é aquele data.x? da onde vem esse x?

[quote=perdeu]usa $stmt->fetchAll() q ele retona um array certinho pra vc, lembre o json deve estar em utf8.
o q é aquele data.x? da onde vem esse x?[/quote]

Problema do fetchAll eh que:

  1. talvez nao seja necessario todos os campos do select e segundo

  2. talvez voce queria simplificar, modificar ou ate mesmo nao expor os nomes reais dos campos, no exemplo que ele passou ele esta modificando os nomes:

$arr['idnf']  = ($row->idnotaEntrada);  

idnf ao invez de idnotaEntrada. Porem, daria para fazer tudo isso no SQL e retornar os dados corretos, ai o fetchAll seria ok de usar.

Quanto, ao data.x, eu acredito que a ideia era obter o numero de registros retornados para fazer o loop no client-side. Como eu disse nao eh necessario, porque ele poderia pegar o numero de registros simplesmente usando a propriedade length do array (data.length) ou como eu coloquei no exemplo, usando a funcao each do jquery.

//Daniel