我使用php开发数据库搜索应用程序,并在一个页面上通过Jquery Ajax(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,但我无法从中读取,例如data [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;
}
&#34;豆&#34; (我知道这是java的东西,但我学习并尝试在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 :(得分: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;
}
并且您应该拥有一个对象数组,其中包含查询定义的结果集的属性。
答案 1 :(得分: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"}"]
答案 2 :(得分:0)
经过一番摆弄,我发现了错误。它是在utf-8中包含存储在DB中的数据。修复之后,不再有JSON错误。
永远记得在你的JSON上使用UTF-8!