有没有可能按顺序从 PHP Web 应用程序获取 JSON 的方法

Posted

技术标签:

【中文标题】有没有可能按顺序从 PHP Web 应用程序获取 JSON 的方法【英文标题】:Is there any possible way to get JSON from a PHP web app in order 【发布时间】:2012-07-06 01:59:07 【问题描述】:

我正在构建一个查询数据库的 ios 应用程序。我总是把结果弄得乱七八糟,在应用程序的某些功能中,比如 cmets,让它们按顺序排列是至关重要的。很明显 JSON 正在返回一个字典,但我需要排序的结果。这是服务器端代码:

function sendResponse($status = 200, $body = '', $content_type = 'text/html') 
  $status_header = 'HTTP/1.1 ' . $status . ' ' . getStatusCodeMessage($status);
  header($status_header);
  header('Content-type: ' . $content_type);
  echo $body;


$result = array();
$i = 0;
$sqlGetComments = mysqli_query($link, "SELECT * FROM photo_comments WHERE photo_id='$photoID' ORDER BY post_date DESC");
while ($row = mysqli_fetch_array($sqlGetComments)) 
  $result[$i] = array(
      'photoID' => $row['photo_id'],
      'userID' => $row['userID'],
      'username' => $row['username'],
      'comment' => $row['comment'],
      'postedDate' => $row['post_date'],
    );
    $i++;
 // end while

sendResponse(200, json_encode($result));

我有解析它的 IOS 代码,但与我的需要不符。所以必须有一些我可以在服务器端做的事情。

更新,这里是客户端代码:

[request setCompletionBlock:^
    NSString *responseString = [request responseString];
   [self updateComments:responseString];
];


- (void)updateComments:(NSString *)update 
     NSDictionary *root = [update JSONValue];
     NSEnumerator *enumerator = [root keyEnumerator];
     id key;
     while (key = [enumerator nextObject]) 
        NSDictionary *value = [root objectForKey:key];
       _photoID = [value objectForKey:@"photoID"];
       NSString *photoID = [value objectForKey:@"photoID"];
       NSString *userID = [value objectForKey:@"userID"];
       NSString *username = [value objectForKey:@"username"];
       NSString *comment = [value objectForKey:@"comment"];
       NSString *postedDate = [value objectForKey:@"postedDate"];

       NSString *cellString = [NSString stringWithFormat:@"%@ \n %@ \n %@", username, comment, postedDate];

       [_queryResultsMessage addObject:cellString];
     
     [_tableView reloadData];

这是打印输出,请记住注释字段中的“测试”字符串是 JSON 字符串应该如何打印出来:

"1":"photoID":"1","userID":"17","username":"kismet","comment":"Test 6","postedDate":"7 hrs ago","2":"photoID":"1","userID":"17","username":"kismet","comment":"Test 5","postedDate":"8 hrs ago","3":"photoID":"1","userID":"17","username":"kismet","comment":"Test 4","postedDate":"8 hrs ago","4":"photoID":"1","userID":"17","username":"kismet","comment":"Test 3","postedDate":"8 hrs ago","5":"photoID":"1","userID":"17","username":"kismet","comment":"Test 2","postedDate":"8 hrs ago","6":"photoID":"1","userID":"17","username":"kismet","comment":"Test 1","postedDate":"8 hrs ago"

打印出来没问题,但我猜它在分配给 NSDictionary 时会变得混乱。如果没有人有任何答案,我会尝试通过将它分配给一个 NSArray 来摆弄它,看看我是否能以某种方式解析它。

【问题讨论】:

结果的实际 json 编码版本是什么样的?如果它是您期望的顺序,您可能需要在消费应用程序中额外控制您的 json 解析。 我不是 php 人,但很明显 json 应该返回一个 array,而不是字典。 $result 是一个数组。 你需要ksort your array first吗? 您的 iOS 应用程序无法无序使用数据是否有任何特殊原因?这似乎是应用程序暴露的潜在脆弱点...... @sarnold,这是为照片上的 cmets 准备的。这是我需要从数据库中按顺序完成的唯一事情之一。应用程序的其余部分,搞砸了,它可以按照它想要的任何顺序出现。 【参考方案1】:

需要一点客户端 IOS 黑客技术

对于那些仍然对解决方案感兴趣的人:

NSDictionary *userData = [update JSONValue];
NSArray *keys = [[userData allKeys] sortedArrayUsingSelector:@selector(compare:)];
NSMutableArray *array = [NSMutableArray arrayWithCapacity: [keys count]];

int i = 0;
for (NSString *key in keys) 
    [array addObject: [userData objectForKey: key]];
    i++;


for (NSDictionary *myDict in array) 
    NSString *comment = [myDict objectForKey:@"comment"];
    NSLog(@"USERCOMMENT %@", comment);

按顺序返回 JSON:

USERCOMMENT Test 6
USERCOMMENT Test 5
USERCOMMENT Test 4
USERCOMMENT Test 3
USERCOMMENT Test 2
USERCOMMENT Test 1

【讨论】:

【参考方案2】:

值得注意的是 - 您正在请求从 MySQL 订购的商品 - 因此,PHP 正在按顺序生成 JSON。

因此,我只是建议在 PHP 中编辑循环...

while ($row = mysqli_fetch_array($sqlGetComments)) 
  $result[$i] = array(
      'photoID' => $row['photo_id'],
      'userID' => $row['userID'],
      'username' => $row['username'],
      'comment' => $row['comment'],
      'postedDate' => $row['postedDate'],
      'orderBy' => $i
    );
    $i++;
 // end while

...并通过 Obj-C 中的“orderBy”来组织它们。

注意,我所做的只是向 JSON 项目添加一个额外的变量 - “orderBy”;由于 MySQL 结果将按正确的顺序排列,因此以正确的顺序解析,这个“orderBy”变量可以像一个键一样。

自从我使用 iOS SDK 以来已经有一段时间了 - 但我很确定它们将成为一种对 NSMutableArray 进行排序的方法;如果不是 - 一个简单的循环可以工作;使用 x 的键请求每个对象,而 x

我建议调查结果乱序背后的真正原因!这不应该发生!我没有在 iOS 中做过类似的事情,但我认为这不是请求 JSON 时的正确行为。

故障排除步骤可能是在浏览器中或在桌面环境中检查返回的 JSON,并确保 PHP 正确返回它,然后查看它是如何返回到应用程序的 - 确保所有数据都存在以及是否存在模式秩序混乱。

编辑:我注意到你说它正在返回一个字典数组。我的错。 我确实找到了another question that goes into sorting an array of dictionaries。

【讨论】:

你能从IOS的一个字典键中订购一些东西吗?这些结果从一个while循环收集到一个数组客户端。我不知道如何进入数组,选择一个键,然后根据 nsmutablearray 层次结构中的那个键移动字典的位置。 在我的脑海中,也许使用了某种形式的循环——但这并不理想。但是,如果没有解决此问题的方法,我会感到惊讶,因为这似乎是一项非常简单的任务。我会查看一些我已经准备好的 iOS SDK 桌面参考资料。 啊,这就是我们看到的问题所在。你的 json 数组不应该被解析成字典。 IOS 代码很可能是问题所在。 是的,我怀疑它是 iOS - 仅仅是因为 PHP 从 MySQL 以正确的顺序获取结果,并根据该代码判断 - i> 正确返回 JSON。验证它的一种简单方法是检查浏览器。只是出于兴趣,您是否有机会使用应用程序中的一些 Obj-C 来编辑问题? :) @TetsujinnoOni。那我应该怎么解析呢?有什么想法吗?【参考方案3】:

在您的 MySql 查询中,您正在对 post_date 进行排序,但在将其添加到结果数组时请参考 postedDate。两者都存在吗?

如果post_date 实际上不存在,那么您的数据库查询未按预期排序...

【讨论】:

您发布的 JSON 似乎已正确排序。所以我怀疑你可以在服务器端做更多的事情。大概你在iOS中解析它的方式有问题......但在那里无法帮助你:)

以上是关于有没有可能按顺序从 PHP Web 应用程序获取 JSON 的方法的主要内容,如果未能解决你的问题,请参考以下文章

按顺序打印网页

从 Postcode DB 获取 lat/lng 并在 PHP/MYSQL 中按最近的顺序排序

从列表中获取列的顺序/序列

如何在没有顺序重复的情况下获得 PHP 中的所有排列?

是否可以通过其位置从 HashMap 中获取元素?

如何在不增加的情况下按字母顺序获取下一个字母? (php)