AJAX envia, PHP consulta e retorno JSON e AJAX não entende com "dataType: 'json'"

2,446 views
Skip to first unread message

Wagner Silva

unread,
Jan 5, 2014, 9:11:08 AM1/5/14
to jque...@googlegroups.com
Bom dia,

Sou novo aqui e em desenvolvimento jQuery, estou com uma dúvida, pq não consigo utilizar o dataType nem o $.parseJSON para manipular um retorno de uma consulta do PHP para o AJAX em (jQuery).



reader.js
$(function(){
        //Modal encapsula o formulario onde ocorrerá o carregamento das informações
var modal = $('.modal');
        //Lista encapsula os elementos existente ou na lista, cada elemento tem um botão "editar"
var lista = $('.lista');

lista.on('click','.actionedit',function(){
var id = $(this).attr('href');
var li = lista.find('li[class*="j_'+id+'"]');

$.ajax({
url: 'php/controller.php',
data: 'acao=consulta&editid='+id,
type: 'POST',
//contentType:    'application/json; charset=utf-8;',
dataType: "json",
error: function (xhr, ajaxOptions, thrownError) {
alert('Erro: "'+ xhr.status + '"\nMensagem: " ' + thrownError +'"');
  },
beforeSend: function(){ 
li.css("background","#0F6") },
success: function( carga ){

        //alert( carga );
alert( carga.nome );

//modal.fadeIn("slow");
//modal.find('form span[class="filebar"]').text(carga.nome);
//modal.find('form input[name="titulo"]').val(carga.titulo);
//modal.find('form textarea').append(carga.descricao);
},
complete: function(){ loader.fadeOut("slow"); },
});

return false;
});
});

controller.php
<?php
require_once("conexao.php");

switch($_POST['acao']){

case 'consulta':
//Consulta valida, que retorna uma string json
$editid = $_POST['editid'];
$qr = "SELECT * FROM mod6_uploads WHERE id = '$editid'";
$ex = mysql_query($qr);
$st = mysql_fetch_array($ex);
//Retorno array em formato string json para teste...
$u['nome'] = 'Arquivo 1';
$u['titulo'] = 'Arquivo 2';
$u['descricao'] = 'Arquivo 3';

echo json_encode($u);

break;
default:
echo 'Erro ao consultar';

}

Desta forma, o alert me retorna a seguinte mensagem:
Erro: "200"
Mensagem: " SyntaxError: JSON.parse: unexpected character"

Se eu comentar o dataType: "json", o alerta me retorna o seguinte: undefined

E se eu altero o alert de "alert(carga.nome)" para "alert(carga)", ele me retorna o seguinte:
{"nome":"Arquivo 1","titulo":"Arquivo 2","descricao":"Arquivo 3"}

Também, como comentei no começo, caso eu utilize o $.parseJSON ou JSON.parse, não tem retorno nenhum, nem do error nem do success.

Alguém aí já se deparou com algo assim? 
Se alguém poder me ajudar ficaria muito agradecido!




Bruno Kuhlmann Cechet

unread,
Jan 6, 2014, 6:22:13 AM1/6/14
to jque...@googlegroups.com
Tenta alterar o header do seu controler para Content-type: application/json
Retorno de json sempre em utf-8, procure verificar isso tambem.

Abraços


--
--
Grupo de jQuery Brasil.
 
REGRAS: https://docs.google.com/document/d/1VfvTDmeHTSj-L5ouZJjQQ4OkjTCU1Hr2XtPYBNGVHH4/edit
 
USE O JSBIN.COM / JSFIDDLE.NET PARA CÓDIGOS.
 
Email: jque...@googlegroups.com
Biba: jquery-br+...@googlegroups.com
Site: http://groups.google.com/group/jquery-br?hl=pt-BR
 
---
Você está recebendo esta mensagem porque se inscreveu no grupo "jQuery (Brasil)" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para jquery-br+...@googlegroups.com.
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.

Wagner Silva

unread,
Jan 6, 2014, 7:04:29 AM1/6/14
to jque...@googlegroups.com
Obrigado Bruno, já havia feito isto, tanto no php quanto nos settings do AJAX...

Montei um projeto de teste e modifiquei o evento de .on() para .click() apenas e funciona normalmente, mas neste caso, o evento te, que ser .on() pois os elementos são gerados após o carregamento do DOM!

Não consegui evoluir e resolver isto ainda!

Bruno Kuhlmann Cechet

unread,
Jan 6, 2014, 7:12:50 AM1/6/14
to jque...@googlegroups.com
Estranho mudar o evento e funcionar.
Estou um pouco enferrujado, larguei essa vida de jquery, mas se me permite, tenta apenas por curiosidade adicionar um asyc: false na sua requisição para ver o que acontece.

Curiosidade: porque o return false na sua função? 

Wagner Silva

unread,
Jan 6, 2014, 3:01:25 PM1/6/14
to jque...@googlegroups.com
Com o async:false continuou na mesma...

Então, o return false é um técnica para o formulário não ficar enviando varias vezes conforme vc atualiza a página. Só pra isto mesmo!

Mateus Souza

unread,
Jan 7, 2014, 9:57:00 AM1/7/14
to jque...@googlegroups.com
Wagner,

Você pode estar com problema em 2 itens:

1 - Retorno JSON inválido: Neste caso o javascript não vai fazer milagres. Valide o JSON em uma dessas ferramentas que se acha no Google. Se estiver ok, pode ser o problema 2.
2 - jQuery bugado - Atualizar a versão da lib deve resolver.

Para garantir, sete o Header de retorno correto no PHP (http://stackoverflow.com/questions/4064444/returning-json-from-a-php-script) e no ajax defina o formato como JSON.  

Wagner Silva

unread,
Jan 7, 2014, 12:41:07 PM1/7/14
to jque...@googlegroups.com
Obrigado Mateus,

Mas o JSON é valido;
Testei nas versões do jQuery (1.9.1, 1.10.2 e 2.0.3) e baixei no mínimo 3x pra te certeza!
Também forcei, tanto o header quanto o ajax, a trabalharem com o formato json.

Nada disso surtiu efeito, ainda continuo recebendo a mensagem "SyntaxError: JSON.parse: unexpected character" quando seto a propriedade "dataType:'json'" no ajax!

Valeu

Douglas Bezerra Possas

unread,
Jan 7, 2014, 12:45:10 PM1/7/14
to jque...@googlegroups.com
No complete, por favor de um console.log(carga) e veja o que esta imprimindo no seu json... Estou achando que ele não está trazendo seu json corretamente.

Se não tiver problema, teria algum problema em usar $.post ao inves de $.ajax apenas para um teste?
Douglas Bezerra Possas
Programador PHP
Campo Grande  – MS – Brasil
Cel.: 67 9280 5866

GitHub
https://github.com/douglaspossas/

Douglas Bezerra Possas

unread,
Jan 7, 2014, 12:47:28 PM1/7/14
to jque...@googlegroups.com
Tenta trocar a seguinte linha:

data: 'acao=consulta&editid='+id,

Para

data: { 'acao':'consulta','editid':id},

E veja se funciona.

Wagner Silva

unread,
Jan 7, 2014, 12:55:08 PM1/7/14
to jque...@googlegroups.com
No console a resposta é uma string json e o erro:

readyState 4
responseText "{"nome":"videos\/1e9cd2028fbe6718de38cb5b73660cd4.avi","titulo":"Video 01","descricao":"Video 01 Descri"}"
status 200
statusText "OK"

o resto esta tudo como function()...

$.Post() não funcionou pq o elemento não exite só após uma carga dos elementos na lista "<ul><li>" saca?

Já tentei modificar o valor de data tbm, nada aconteceu, o error persiste!

Douglas Bezerra Possas

unread,
Jan 7, 2014, 12:56:55 PM1/7/14
to jque...@googlegroups.com
O seu problema esta em acentuações provavelmente. NO PHP, ao fazer:

$u['nome'] = 'Arquivo 1';

faça assim:

$u['nome'] = utf8_encode('Arquivo 1'); //faca isso para todos os campos que possa ter acentuação ou ç ou outros caracteres

Deve funcionar

Wagner Silva

unread,
Jan 7, 2014, 1:04:40 PM1/7/14
to jque...@googlegroups.com
Fiz da forma que falou, continua dando o mesmo erro.

Detalhe, já havia feito esta conversão antes!

O que ainda me intriga é que qdo se pega um valor que corresponde a um diretório "arquivos/filename.ext" esta sendo modificado a "/" por "\/"... mas sei que não influi, pois já alterei na base deixando apenas o nome simples e esse erro continua!

Wagner Silva

unread,
Jan 7, 2014, 1:06:05 PM1/7/14
to jque...@googlegroups.com
Já fiz outros testes em outros projetos simples para verificar isto, e nos caso que uso o .on() não rola e se coloco .click() funciona!

Joubert

unread,
Jan 7, 2014, 1:06:28 PM1/7/14
to jque...@googlegroups.com
Não li nenhum dos posts anteriores, mas por via das dúvidas, no backend defina o header com o content-type json
______________________________________________________
Joubert "RedRat"
/me at Linkedin and Github

Douglas Bezerra Possas

unread,
Jan 7, 2014, 1:26:27 PM1/7/14
to jque...@googlegroups.com
Wagner, qual o SO do servidor e versão?

Wagner Silva

unread,
Jan 7, 2014, 1:27:22 PM1/7/14
to jque...@googlegroups.com
Tudo local... W8


Você recebeu esta mensagem porque está inscrito em um tópico do grupo "jQuery (Brasil)" dos Grupos do Google.
Para cancelar a inscrição neste tópico, acesse https://groups.google.com/d/topic/jquery-br/k79cX_V-8go/unsubscribe.
Para cancelar a inscrição neste grupo e todos os seus tópicos, envie um e-mail para jquery-br+...@googlegroups.com.

Para obter mais opções, acesse https://groups.google.com/groups/opt_out.



--

Att,

Wagner Silva
+55 (11) 9 8160-3426

Tiago Celestino

unread,
Jan 7, 2014, 6:44:38 PM1/7/14
to jque...@googlegroups.com
Então, se eu entendi, no seu console está vindo isso:

readyState 4
responseText "{"nome":"videos\/1e9cd2028fbe6718de38cb5b73660cd4.avi","titulo":"Video 01","descricao":"Video 01 Descri"}"
status 200
statusText "OK"

??


Eduardo Kraus

unread,
Jan 7, 2014, 7:18:17 PM1/7/14
to jquery-br
Seu erro tem tudo para estar no PHP.

Altere ele para o seguinte. Em vermelho minhas alterações....
<?php
// Limpa o buffer de saída. Evita que caracteres do UTL8 sejam expelidos
ob_clean();

// Diz que o retorno será JSON.
// O JQuery não testa se a STRING é JSON. 
// Só é JSON se o cabeçalho disser que é JSON
header('Content-Type: application/json');

require_once("conexao.php");

switch($_POST['acao']){

    case 'consulta':
        //Consulta valida, que retorna uma string json
        $editid = $_POST['editid'];
        $qr = "SELECT * FROM mod6_uploads WHERE id = '$editid'";
        $ex = mysql_query($qr);
        $st = mysql_fetch_array($ex);
        
        //Retorno array em formato string json para teste...
        $u['nome'] = 'Arquivo 1';
        $u['titulo'] = 'Arquivo 2';
        $u['descricao'] = 'Arquivo 3';

        echo json_encode($u);

    break;
    default:
        // String retornando aonde é JSON?
        // Aqui também tem que retornar JSON
        echo '{"status":"erro", "mensagem":"Erro ao Consultar"};
        // Não se esqueça de fazer um IF no jQuery
}

Um abraço para você Obama



Em 5 de janeiro de 2014 12:11, Wagner Silva <wagn...@gmail.com> escreveu:

Wagner Silva

unread,
Jan 7, 2014, 8:38:49 PM1/7/14
to jque...@googlegroups.com
Isso Tiago...

Eduardo, já havia tentado, mas por esse switch ter outras ações, não posso colocar esse header(), contudo, vc me deu uma idéia para testar, montar outro php só para este caso.

Já aviso o que consegui!



Você recebeu esta mensagem porque está inscrito em um tópico do grupo "jQuery (Brasil)" dos Grupos do Google.
Para cancelar a inscrição neste tópico, acesse https://groups.google.com/d/topic/jquery-br/k79cX_V-8go/unsubscribe.
Para cancelar a inscrição neste grupo e todos os seus tópicos, envie um e-mail para jquery-br+...@googlegroups.com.

Para obter mais opções, acesse https://groups.google.com/groups/opt_out.

Wagner Silva

unread,
Jan 7, 2014, 8:54:08 PM1/7/14
to jque...@googlegroups.com
Pronto, teste feito... quem salvou a pátria foi o ob_clean();

Não se fez necessário o uso do header();

Queria agradecer a todos que vc pela ajuda!

Álvaro Marcelo Kaim

unread,
Oct 15, 2014, 6:16:20 PM10/15/14
to jque...@googlegroups.com, wagn...@gmail.com
Amigo posta o código seu ai fazendo um favor pois estou com o mesmo problema. dá este erro 200 e se mudo a propriedade de dataType: 'json', para dataType: 'html', não retorna erro mas não consigo acessar as variaveis json.
Obrigado pela atenção e sei que já faz tempo.

Wagner Silva

unread,
Nov 5, 2014, 7:22:04 AM11/5/14
to jque...@googlegroups.com, wagn...@gmail.com
Ola Álvaro, desculpe-me, só via seu pedido agora, caso eu ainda possa te ajudar, me chama no skype ht.wagner.jose... abçs
Reply all
Reply to author
Forward
0 new messages