2015-10-16 64 views
-1

我正在用php开发数据库搜索应用程序,并在一个页面上通过Jquery Ajax(JSON)根据某个参数在数据库中搜索寄存器,向服务器端脚本发出请求。搜索成功后,我回显一个关联数组,其中包含所有编码为JSON的条目。索引数组产生格式不正确的JSON

有了Chrome的元件检查器中,可以阅读响应,该响应是这样的:

[0: False 
1: "{"id":"5","nome":"Maria","sobrenome":"Joaquina","sexo":"F","rua":"","complemento":"","numero":"0","bairro":"Aeroporto\r\n","telefone":"","email":"","nacionalidade":"Peruano"}"] 

元素索引1似乎是良好形成JSON,但我不能从中读取,任何东西,例如数据[1] .nome返回undefined。

我想知道我的json发生了什么,我该如何解决这个问题,以便我可以通过它们的属性访问这些对象。以下是处理JSON的代码。

使用Javascript:

$(document).ready(function(){ 
$('#btnEnviarBairro').click(function(){ 
    var data = $("#bairros_juizdefora").val(); 
    $.ajax({ 
     type: "POST", 
     url: "processaBuscaId.php", 
     dataType: 'json', 
     data: {id : data, type: 1}, 
     success: function(response){ 
      var table = $('<table/>'); 
      for (var i = 1; i < response.length; i++){ 
       table.append("<tr><td>"+response[i].nome+"</tr></td>"); 
      } 
      $('#receptorBairro').append(table); 

     }, 
     error: function(xhr, status, error){ 
      console.log(xhr+" "+status+" "+error); 
     } 
    }).done(function(){ 

    }); 
});}); 

控制器文件的种类:

function buscaBairro($id, $connection) { 
    $dao = new estrangeiroDao ($connection); 
    return $dao->selectbyBairroId ($id); 
}; 
echo json_encode (buscaBairro($selectId, $connection)); 

DAO用于搜索:

function selectbyBairroId($id) { 
    $sql = 'select * from dados_estrangeiro, nacionalidade, bairros_juizdefora where bairroid = '.$id.' and idnac=idnacionalidade and idbairros_juizdefora = '.$id; 
    $arres = array(); 
    $result = $this->con->query ($sql); 
    while ($obj = $result->fetch_object()) { 
     $estrangeiro = $this->objectToEstrangeiro ($obj); 
     array_push ($arres, json_encode($estrangeiro->returnAsAssoc())); 
    } 
    return $arres; 

} 
} 

ObjectToEstrangeiro方法(上文所用):

function objectToEstrangeiro($obj) { 
    $est = new estrangeiros ($obj->idestrangeiro, $obj->pnome, $obj->snome, $obj->sexo, $obj->rua, $obj->complemento, $obj->numero, utf8_encode ($obj->nomebairros_juizdefora), $obj->telefone, $obj->email, utf8_encode ($obj->nomenacionalidade)); 
    return $est; 
} 

“豆”(我知道这是java的东西,但我learnd和tryed在PHP来实现)为Estrangeiro表:

class estrangeiros { 
[...] 
[... Attributes and Getters and Setters (I dont know if they are usfull in PHP...] 
[...] 
    public function returnAsAssoc(){ 
     $arres= array("id"=>$this->getId(), "nome" => $this->getNome(), "sobrenome"=>$this->getSobrenome(), "sexo"=>$this->getSexo(), 
       "rua"=>$this->getRua(), "complemento"=>$this->getComplemento(), "numero"=>$this->getNumero(), "bairro"=>$this->getBairro(), 
       "telefone" =>$this->getTelefone(), "email"=> $this->getEmail(), "nacionalidade"=>$this->getNacionalidade() 
     ); 

     return $arres; 
    } 
} 

编辑:

由于从评论,我可以看到响应格式不正确的JSON,但现在我试图找出原因。

这里有一些事情我发现:

我通过编码关联数组控制器,在那里它再次JSON编码和呼应JSON的阵列。 如果删除了任何json编码,我在Jquery中得不到回复。

此外,我不能编码的对象数组,右(至少不具有私有属性)?所以我必须将我要获取的对象转换为关联数组,然后将它们存储在另一个数组中,以便可以访问它们的值。

+0

使用'jsonlint.org'你的JSON看起来是'Badly Formed'但是如果你从前面删除'[0:False1:'''''从结尾它确实有效 – RiggsFolly

+0

任何提示为什么?它似乎在索引之后形成良好。如果格式错误,它是如何发送的? –

回答

0

经过一番捣鼓之后,我发现了这个错误。它在存储在数据库中的数据的utf-8版本中。修复后,不再有JSON错误。

一定记得在你的JSON上使用UTF-8!

0

这不是有效的JSON,必须是:

[0: "False", 1: "{"id":"5","nome":"Maria","sobrenome":"Joaquina","sexo":"F","rua":"","complemento":"","numero":"0","bairro":"Aeroporto\r\n","telefone":"","email":"","nacionalidade":"Peruano"}"] 
+0

你知道为什么这个“假”在那里发生吗?我不打算在那里添加它。 –

1

我想这可能是你的原因。

您正在将您的数据收集功能selectbyBairroId中的每个数据项转换为JSON,然后返回该数组并再次将其转换为JSON。

你应该只做一次,在一个完整的PHP数据结构中构建你的数据,然后,在将它发回给任何人之前,你将它全部转换为JSON。

function selectbyBairroId($id) { 
    $sql = 'select * from dados_estrangeiro, 
          nacionalidade, 
          bairros_juizdefora 
      where bairroid = '.$id.' 
       and idnac=idnacionalidade 
       and idbairros_juizdefora = '.$id; 

    $arres = array(); 

    $result = $this->con->query ($sql); 

    while ($obj = $result->fetch_object()) { 
     $estrangeiro = $this->objectToEstrangeiro ($obj); 

     //array_push ($arres, json_encode($estrangeiro->returnAsAssoc())); 

     $arres[] = $estrangeiro->returnAsAssoc(); 
    } 
    return $arres; 
} 


function buscaBairro($id, $connection) { 
    $dao = new estrangeiroDao ($connection); 
    return $dao->selectbyBairroId ($id); 
}; 

echo json_encode (buscaBairro($selectId, $connection)); 

在你的问题此评论之后:

另外,我不能编码对象的数组,右(至少与私有属性不)?所以我必须将我要获取的对象转换为关联数组,然后将它们存储在另一个数组中,以便可以访问它们的值。

是的,你可以编码一个对象数组。由->fetch_object()返回的对象位于由stdClass()定义的对象中,因此所有属性都是公共的。

因此,尝试这种简化selectbyBairroId功能

function selectbyBairroId($id) { 
    $sql = 'select * from dados_estrangeiro, 
          nacionalidade, 
          bairros_juizdefora 
      where bairroid = '.$id.' 
       and idnac=idnacionalidade 
       and idbairros_juizdefora = '.$id; 

    $arres = array(); 

    $result = $this->con->query ($sql); 

    while ($obj = $result->fetch_object()) { 
     $arres[] = $obj; 
    } 
    return $arres; 
} 

,你应该有对象的数组中的所有与您的查询中定义的结果集的属性。

+0

Nope = /它给我“[object Object] parsererror SyntaxError:意外的输入结束” –

+0

我不知道这行应该做什么'$ estrangeiro = $ this-> objectToEstrangeiro($ obj);' – RiggsFolly

+0

哦,对。我会添加到身体。但简单来说,它需要一个Mysqli获取对象并变成一个Estrangeiro对象。 –