我正在尝试使用PHP和jQuery来创建动态搜索结果页面。
在PHP
方面,调用SELECT
语句,在其中检查是否已设置所有变量,添加我想要在客户端使用的HTML,然后将变量放在名为的数组中$result
。
在数据库调用的结果中,我还在他们自己的数组中添加longitude
和latitude
,名为$pins
。
然后我创建一个名为 $results
的多维数组,并将数组放在一起:
$result = array('listing'=>$listing);
$pins = array('lat'=>$lat1,'lng'=>$lon2);
$results = array('listing'=>$result,'pins'=>$pins);
echo json_encode($results);
现在,客户端我使用jquery。我面临的问题是,总共应该有2个结果。但是我看到相同的结果重复两次(我可以确认它们应该是唯一的)。这是我的jQuery:
$.ajax({
url: '/updatedsearch.php',
type: 'POST',
data: {
q: search,
lng: coordinates[0],
lat: coordinates[1],
},
dataType: "json",
success: function(data) {
if(data == "undefined" || data == null) {
console.log("There was no search results or something similar");
} else {
var pins = [data.pins.lat, data.pins.lng];
$.each(data, function(key, val) {
$('#listings').append(data.listing.listing);
console.log(pins);
console.log(data);
});
}
},
此处的所有内容都可以正常运行,除了$.each()
运行时,它似乎会将相同的数据附加两次。
我认为这是因为.append(data.listing.listing);
,如果我理解正确,我没有在这里循环数组,我实际上是在引用data.listing.listing[0]
- 我是否正确理解了这一点?
编辑:我现在遇到问题,我的结果出现了两次。应该只有两个结果,但总共有四个结果,似乎这些结果是重复的。
{"listing":["<div>This contains my HTML</div>"], "pins":"lat":"50.000000","lng":"-1.000000"}}
我已经运行了jsonlint
,但它似乎无效。使用PHP我创建了以下数据:
while($listrow = mysqli_fetch_assoc($list)) {
$listing[] = '<div>This contains my HTML</div>';
}
$pins = array("lat"=>$lat1, "lng"=>$lon2);
$results = array('listing'=>$listing, 'pins'=>$pins);
echo json_encode($results);
我是否误解了使用多维数组,导致错误?
答案 0 :(得分:1)
你没有循环遍历数组是对的。在追加时,您也没有引用单个数组项。
尝试:
$.each(data.listing.listing, function(i, item) {
$('#listings').append(item);
});
执行以下操作时:
$.each(data, function(key, val) {
您正在遍历data
对象的属性。它有两个属性:listings
和pins
,因此循环执行两次。
对于循环的每次迭代,您将附加相同的值(data.listing.listing
),我假设它是一个数组。
相反,我认为你想迭代数组,并在数组中附加每个项目。
编辑:您在问题顶部显示的PHP看起来像生成这样的JSON:{
"listing": { "listing": ["<div>This contains my HTML</div>"] },
"pins": { "lat":"50.000000","lng":"-1.000000" }
}
但是通过编辑,您可以显示如下所示的JSON:
{
"listing": ["<div>This contains my HTML</div>"],
"pins": { "lat":"50.000000","lng":"-1.000000" }
}
如果这是您的JSON的样子,您应该使用:
$.each(data.listing, function(i, item) {
答案 1 :(得分:1)
您似乎希望$.each
遍历PHP中$results['listing']
中的列表,但它实际上会遍历整个$results
。
为了更好地了解正在进行的操作,请为$.each
中的当前项使用其他名称。因为您使用的data
与用作success
回调参数的名称相同,所以您需要更难调试代码。如果您想循环浏览商家信息,请在success
回调中执行以下操作:
$.each(data.listing, function(i, result)){
$('#listings').append(result);
}
您发布的JSON:
{
"listing":["<div>This contains my HTML</div>"],
"pins": "lat":"50.000000","lng":"-1.000000"}
}
无效,因为您错过了"pins":
和"lat"
之间的左括号。它应该是
{
"listing":["<div>This contains my HTML</div>"],
"pins": {"lat":"50.000000","lng":"-1.000000"}
}