Php 关于列顺序的表到JSON对象的FMDB结果。

Php 关于列顺序的表到JSON对象的FMDB结果。,php,ios,objective-c,json,fmdb,Php,Ios,Objective C,Json,Fmdb,编辑:底部有一个新问题,它得到了所有的行,我错了 我正在尝试获取SQL查询的结果,并将其放入json对象中,以发送到我的服务器,以便对数据进行更多的处理。现在我的代码只返回1行数据。有人能看到任何明显的错误吗? IOS端 - (void)sendLogin { NSError *jsonError; NSData *requestdata; //get login NSArray *docPaths = NSSearchPathForDirectoriesInDomains(NSDocument

编辑:底部有一个新问题,它得到了所有的行,我错了 我正在尝试获取SQL查询的结果,并将其放入json对象中,以发送到我的服务器,以便对数据进行更多的处理。现在我的代码只返回1行数据。有人能看到任何明显的错误吗? IOS端

- (void)sendLogin
{
NSError *jsonError;
NSData *requestdata;
//get login
NSArray *docPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDir = [docPaths objectAtIndex:0];
NSString *dbPath = [documentsDir   stringByAppendingPathComponent:@"tar.sqlite"];

FMDatabase *database = [FMDatabase databaseWithPath:dbPath];
[database open];
FMResultSet *Loginresults = [database executeQuery:@"SELECT * FROM surveys"];
NSMutableArray *results = [NSMutableArray array];
while ([Loginresults next]) {
    [results addObject:[Loginresults resultDictionary]];

    requestdata = [NSJSONSerialization dataWithJSONObject:results options:0 error:&jsonError];
}

[database close];




NSURL *url = [NSURL URLWithString:@"http://server/insert.php"];

NSMutableURLRequest *request;
request = [NSMutableURLRequest requestWithURL:url];
[request setHTTPMethod:@"POST"];
[request setValue:[NSString stringWithFormat:@"%d", [requestdata length]] forHTTPHeaderField:@"Content-Length"];
[request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
[request setHTTPBody:requestdata];

//this kicks off the request asynchronously
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
}
PHP端

<?php
$foo = file_get_contents("php://input");

var_dump(json_decode($foo, true));

?>

我还注意到我对该表的结果顺序不正确。这是否符合预期?有没有办法将其排序以便与列的顺序匹配?

我不熟悉FMDatabase。但我认为你的问题在于while的陈述:

FMResultSet *Loginresults = [database executeQuery:@"SELECT * FROM surveys"];
NSMutableArray *results = [NSMutableArray array];
while ([Loginresults next]) {
    [results addObject:[Loginresults resultDictionary]];

    requestdata = [NSJSONSerialization dataWithJSONObject:results options:0 error:&jsonError];
}
您正在用每个结果覆盖变量:requestdata

如果您必须为此更改代码,可能会:

FMResultSet *Loginresults = [database executeQuery:@"SELECT * FROM surveys"];
NSMutableArray *results = [NSMutableArray array];
while ([Loginresults next]) 
{
    [results addObject:[Loginresults resultDictionary]];
}
requestdata = [NSJSONSerialization dataWithJSONObject:results options:0 error:&jsonError];

嗯。让我解释一下解决办法。正如您在评论中所说,您在整个应用程序中都在使用库

所以,我认为解决你问题的最好办法就是创造一个。OrderedDictionary包含一个NSMutableDictionary和一个NSMutableArray,用于跟踪密钥的顺序

您可以创建FMResultSet的类别:

FMResultSet+OrderedDict.h

#import <Foundation/Foundation.h>
#import "FMResultSet.h"
#import "OrderedDictionary.h"
@interface FMResultSet(OrderedDict)
- (OrderedDictionary*)resultOrderDictionary;
@end
如果需要,我可以将我的项目测试上传到github


编辑:现在已上载。

您是否有FMResultSet的扩展名?我看到了,但没有看到方法resultDictionary。嘿,我遵循这个指南,也参考了这个问题。你能给我发一个示例项目吗?我测试了你的代码,创建了一个包含两行的表,php显示了这两行。你们有几排?可能是结果大小的问题。对不起,我编辑了我的问题。它显示了正确的行数,我正在与订单进行斗争。太好了!!谢谢我会尝试这个和其他解决方案,然后发回,让你知道我做了什么。不客气。如果您愿意,您可以更改问题的标题,以便具有相同问题的其他人可以找到答案。
#import <Foundation/Foundation.h>
#import "FMResultSet.h"
#import "OrderedDictionary.h"
@interface FMResultSet(OrderedDict)
- (OrderedDictionary*)resultOrderDictionary;
@end
#import "FMResultSet+OrderedDict.h"
#import "OrderedDictionary.h"
#import "FMDatabase.h"

@implementation FMResultSet(OrderedDict)

- (OrderedDictionary*)resultOrderDictionary {

    NSUInteger num_cols = (NSUInteger)sqlite3_data_count([_statement statement]);

    if (num_cols > 0) {
        OrderedDictionary *dict = [OrderedDictionary dictionaryWithCapacity:num_cols];

        int columnCount = sqlite3_column_count([_statement statement]);

        int columnIdx = 0;
        for (columnIdx = 0; columnIdx < columnCount; columnIdx++) {

            NSString *columnName = [NSString stringWithUTF8String:sqlite3_column_name([_statement statement], columnIdx)];
            id objectValue = [self objectForColumnIndex:columnIdx];
            [dict setObject:objectValue forKey:columnName];
        }

        return dict;
    }
    else {
        NSLog(@"Warning: There seem to be no columns in this set.");
    }

    return nil;
}

@end
NSMutableArray *results = [NSMutableArray array];
    while ([Loginresults next]) {
        [results addObject:[Loginresults resultOrderDictionary]];
    }
    requestdata = [NSJSONSerialization dataWithJSONObject:results options:0 error:&jsonError];