是否有任何可能的方法从PHP web应用程序中获取JSON

是否有任何可能的方法从PHP web应用程序中获取JSON,php,ios,json,Php,Ios,Json,我正在构建一个可以查询数据库的IOS应用程序。我总是把结果弄得乱七八糟,在应用程序的一些功能中,比如评论,我把它们弄得井井有条是至关重要的。很明显JSON正在返回dict,但我需要对结果进行排序。以下是服务器端代码: function sendResponse($status = 200, $body = '', $content_type = 'text/html') { $status_header = 'HTTP/1.1 ' . $status . ' ' . getStatusCod

我正在构建一个可以查询数据库的IOS应用程序。我总是把结果弄得乱七八糟,在应用程序的一些功能中,比如评论,我把它们弄得井井有条是至关重要的。很明显JSON正在返回dict,但我需要对结果进行排序。以下是服务器端代码:

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));
[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];
}
我有可以解析它的IOS代码,但与我需要它的方式不符。所以我必须在服务器端做些事情

更新,以下是客户端代码:

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));
[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];
}
这里是打印输出,请记住注释字段中的“Test”字符串是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来处理它,看看是否可以以某种方式解析它。

值得注意的是 -您正在请求从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正确返回JSON,然后查看它是如何返回到应用程序的——确保所有数据都存在,以及是否存在导致顺序扭曲的模式

编辑:我注意到你说它返回了一系列字典。我的错。 我确实发现了。

值得注意的是 -您正在请求从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正确返回JSON,然后查看它是如何返回到应用程序的——确保所有数据都存在,以及是否存在导致顺序扭曲的模式

编辑:我注意到你说它返回了一系列字典。我的错。
我确实找到了。

在您的MySql查询中,您是在
post\u date
上排序的,但在将其添加到结果数组时,请参考
postedDate
。两者都存在吗


如果
post_-date
实际上不存在,那么您的数据库查询没有按照您的预期进行排序…

在MySql查询中,您是在
post_-date
上进行排序的,但是在将其添加到结果数组时,请参考
postedDate
。两者都存在吗


如果
post\u date
事实上不存在,那么您的数据库查询没有按预期排序…

需要一点客户端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 all:

USERCOMMENT Test 6
USERCOMMENT Test 5
USERCOMMENT Test 4
USERCOMMENT Test 3
USERCOMMENT Test 2
USERCOMMENT Test 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 all:

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

结果的实际json编码版本是什么样子的?如果按照您期望的顺序,您可能需要在消费应用程序中对json解析进行额外的控制。我不是php高手,但json显然应该返回一个数组,而不是一个字典$结果是一个数组。您需要吗?您的iOS应用程序无法无序使用数据有什么特殊原因吗?这似乎是一个潜在的脆弱点,让应用程序暴露在外…@sarnold,这是一张照片上的评论。这是我唯一需要从db那里得到的东西之一。应用程序的其余部分,去它的,它可以以它想要的任何顺序出现。结果的实际json编码版本是什么样子的?如果按照您期望的顺序,您可能需要在消费应用程序中对json解析进行额外的控制。我不是php高手,但json显然应该返回一个数组,而不是一个字典$结果是一个数组。您需要吗?您的iOS应用程序无法无序使用数据有什么特殊原因吗?这似乎是一个潜在的脆弱点,让应用程序暴露在外…@sarnold,这是一张照片上的评论。这是我唯一需要从db那里得到的东西之一。应用程序的其余部分,去它的,它可以按照它想要的任何顺序来。你能在IOS中从一个字典键订购一些东西吗?这些结果是从wh收集的