1

我有一个 iOS 应用程序,它使用这种方法从网络服务中获取用户的积分:

+(void)fetchPointsForUser:(NSString*)usuario WithCompletionHandler:(Handler2)handler{
    NSURL *url = [NSURL URLWithString:@"http://myserver.com/myapp/readpoints.php"];
    NSDictionary *postDict = [NSDictionary dictionaryWithObjectsAndKeys:usuario, @"userNa", nil];

    NSData *postData = [self encodeDictionary:postDict];

    // Create the request
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    [request setHTTPMethod:@"POST"];
    [request setValue:[NSString stringWithFormat:@"%d", postData.length] forHTTPHeaderField:@"Content-Length"];
    [request setValue:@"application/x-www-form-urlencoded charset=utf-8" forHTTPHeaderField:@"Content-Type"];
    [request setHTTPBody:postData];

    __block NSArray *pointsArray = [[NSArray alloc] init];

    dispatch_async(dispatch_get_main_queue(), ^{
        // Peform the request
        NSURLResponse *response;
        NSError *error = nil;
        NSData *receivedData = [NSURLConnection sendSynchronousRequest:request
                                                     returningResponse:&response
                                                                 error:&error];
        if (error) {
            if ([response isKindOfClass:[NSHTTPURLResponse class]]) {
                NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse*)response;
                NSLog(@"HTTP Error: %d %@", httpResponse.statusCode, error);
                return;
            }
            return;
        }

        NSString *responseString = [[NSString alloc] initWithData:receivedData encoding:NSUTF8StringEncoding];

        pointsArray = [NSJSONSerialization JSONObjectWithData:[responseString dataUsingEncoding:NSASCIIStringEncoding] options:0 error:nil];

        if (handler)
            handler(pointsArray);
    }); 

}

然而,这是非常昂贵的,因为我基本上是通过一个 usersArray 枚举并每次将单个用户发送到这个类方法。所以我想我应该修改我的网络服务来处理一个不同的请求,我将它发送到字典而不是单个用户。

我当前的 php 看起来像这样:

<?php

include_once("JSON.php");
$json = new Services_JSON();

$link = mysql_pconnect("localhost", "user", "pass") or die("Could not connect");
mysql_select_db("mydb") or die("Could not select database");

$username = $_POST["userNa"];
$result = mysql_query("SELECT username, SUM(points) AS PUNTOS FROM tags WHERE username='$username' GROUP BY username");


// Print out result
while($row = mysql_fetch_array($result)){
    echo $row['SUM(points)'];
}

// THIS RETURNS ARRAY NOT READ PROPERLY BY iOS JSON
$resultado = array();
while($obj = mysql_fetch_object($result)) {
    $resultado[] = $obj;
}
Echo $json->encode($resultado);

?>
4

1 回答 1

1

如果我错了,请纠正我。

您有一个 Web 服务 - 输入值为“用户名”,输出是针对该用户名的点。而且您有一个用户名列表,因此您必须一一调用此 Web 服务。

为什么不将您的网络服务更改为:输入值是“用户名列表”,输出是“点列表”呢?它会让你的应用程序只调用一次网络服务。但是您需要在 iOS 中更改您的 Web 服务调用功能。

在 Web 服务 (PHP) 中,mysql_query 基本上是一个字符串,您可以根据输入(用户名列表)以编程方式生成一个 mysql_query 字符串并返回您需要的数据。

我不是回答 php 脚本的合适人选,但我可以给出一些如何创建查询字符串的想法。以下代码只是想法。

//You have a list of Username - $array
//If array count is zero then just return
//If array has data then do the follow logic
//Generate your Query string programmatically
$query_string = "SELECT username, SUM(points) AS PUNTOS FROM tags WHERE username = ".$array[0] ;

for ($i = 1; $i < count($array); $i++){
    $query_string .= " OR username=".$array[$i];
}

$query_string .= " GROUP BY username";

//print your query string and try it from PHP Admin, If it runs OK then you create it successfully

$result = mysql_query($query_string);
//$result is here is nothing but a result table
//Then return it using json format

希望这可以帮助你。

于 2013-07-04T16:10:45.330 回答