3

これは私の最初の質問です:)

いくつかのサーバーと PHP に関するサポートが本当に必要です。質問は次のとおりです。

次のようなphpファイルとやり取りするNSMutableURLRequestがあります。

    NSInteger userID = 4;

    NSString * logInString = [NSString stringWithFormat:@"id=%i&mode=HARD", userID];
    NSData * logInData = [logInString dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];

    NSString *postLength = [NSString stringWithFormat:@"%d", [logInData length]];

    NSMutableURLRequest * logInRequest = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://myurl.lol/login.php"]];
    [logInRequest setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
    [logInRequest setValue:postLength forHTTPHeaderField:@"Content-Length"];
    [logInRequest setHTTPMethod:@"POST"];
    [logInRequest setHTTPBody:logInData];

    [NSURLConnection sendAsynchronousRequest:logInRequest queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
        if ([data length] >0 && error == nil) {
            NSString * responseString = [NSString stringWithUTF8String:data.bytes];
            NSLog(@"%@", responseString);
            [self performSelectorOnMainThread:@selector(responseWasReceived:) withObject:responseString waitUntilDone:YES];
        }
        else if ([data length] == 0 && error == nil) {
            [self performSelectorOnMainThread:@selector(didNotReceivedResponse) withObject:nil waitUntilDone:YES];
        }
        else if (error != nil) {
            [self performSelectorOnMainThread:@selector(errorDidOccurred) withObject:nil waitUntilDone:YES];

            NSLog(@"Error = %@", error);
        }
    }];

そして私のPHPは次のよ​​うなものです:

include("database.php");

if ($_REQUEST['mode'] == 'HARD') {
    $query = mysql_query('SELECT COUNT(*) as total FROM users WHERE id = "' . $_REQUEST['id'] . '"');

    $fetch_username = mysql_fetch_object($query);
    $usernames_coincidences = $fetch_username -> total;

    if ($usernames_coincidences == 1) {
        exit("ACCESS GRANTED");
    } else {
        exit("USER DOES NOT EXIST");
    }
}

「ACCESS GRANTED」という文字列を受信するはずで、それが起こることもありますが、「ACCESS GRANTED¿」や「ACCESS GRANTEDOL」などの悪い応答を受け取ることもあります。

どうしたの?メソッド内で同期リクエストを使用し、それを performSelector:inBackground: で実行する必要があると思いますか?

4

1 に答える 1

2

responseString必ずしも NULL で終わるとは限らない生データを使用して構築しようとしています。

これの代わりに:

[NSString stringWithUTF8String:data.bytes];

代わりにこれを使用してください:

[[NSString alloc] initWithBytes:data.bytes length:data.length encoding:NSUTF8StringEncoding];

ARC を使用しているかどうかは考慮していないことに注意してください。元の呼び出しで自動解放された値が生成されました。私はしません。漏れないようにしてください。

于 2012-12-21T21:41:02.650 に答える