我应该如何修改我的php-webservice来处理一个调用而不是多个调用


How should I modify my php webservice to handle one call instead of many?

我有一个iOS应用程序,它使用以下方法从Web服务获取用户的积分:

+(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进行枚举,并每次将单个用户发送到这个类方法。所以我想我应该修改我的Web服务来处理不同的请求,我把字典而不是个人用户发送给它。

我当前的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);
?>

如果我错了,请纠正我。

您有一个web服务——输入值是"UserName",输出是针对该UserName的点。你有一个用户名列表,所以你必须一个接一个地调用这个web服务。

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

在web服务(PHP)中,mysql_query基本上是一个字符串,您可以根据输入(UserName列表)以编程方式生成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

希望这能对你有所帮助。