1

一部のデータを PHP ファイルに投稿するメソッドがあります。

-(void)submitForm {
    NSLog(@"name=%@", formName.text); // returns correct value

    NSString *post = [NSString stringWithFormat:@"name=%@&", formName.text];
    NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
    NSString *postLength = [NSString stringWithFormat:@"%d", [postData length]];

    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
    [request setURL:[NSURL URLWithString:@"http://path/to/file"]];
    [request setHTTPMethod:@"POST"];
    [request setValue:postLength forHTTPHeaderField:@"Content-Length"];
    [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
    [request setHTTPBody:postData];

    NSURLResponse *response = NULL;
    NSError *requestError = NULL;
    NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&requestError];
    NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];

    NSLog(@"%@",responseString);
}

注:実際には使用していません@"http://path/to/file"。プライバシー保護のため、URLは省略しています。

期待どおりの応答を受け取っているので、PHP スクリプトに正しく接続していると思います。問題は、 をecho出力する$nameと、空の文字列が返されることです。スクリプトは次のとおりです。

<?php
include("config.php"); // Handles DB connection
$name = mysql_escape_string($_POST["name"]);
mysql_query("insert into objects(name) values('$name')") or die(mysql_error());
echo $name; // returns empty string

私が期待するのは、Obj-C コードのある種の構文/論理エラーですが、それを見つけることはできません。

4

2 に答える 2

2

あなたのリクエストには必須データ、境界、およびコンテンツ タイプが欠けているように感じます。これにより、POST リクエストが半分完了している可能性があります。

HTML ファイルを Web サーバーにアップロードするために私が行ったことを示し、その下で説明します。

Objective-C

NSString* str = formName.text;
NSData* theData = [str dataUsingEncoding:NSUTF8StringEncoding];
NSString *urlString = @"http://whereyouarepostingto.com";

NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease];  
[request setURL:[NSURL URLWithString:urlString]];  
[request setHTTPMethod:@"POST"];  

NSString *boundary = @"---------------------------14737809831466499882746641449";  
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary];  

[request addValue:contentType forHTTPHeaderField: @"Content-Type"];

NSMutableData *body = [NSMutableData data];  

[body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary]   dataUsingEncoding:NSUTF8StringEncoding]];  
[body appendData:[[NSString stringWithString:[NSString stringWithFormat: @"Content-Disposition: form-data; name=\"file\"; filename=\"%@.html\"\r\n", self.fileName]] dataUsingEncoding:NSUTF8StringEncoding]];  
[body appendData:[@"Content-Type: application/octet-stream\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[NSData dataWithData:theData]];
[body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];  
[request setHTTPBody:body];  

NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];  
NSString *returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding]; 

NSLog(@"%@", returnString);

PHP

   <?php

    echo "Connection made to server";

    move_uploaded_file($_FILES["file"][tmp_name], "uploads/" . $_FILES["file"]["name"]);  

    ?>

SQL の挿入に合わせていくつかの変更を加え、私のファイルを削除する必要がありますが、それが始まりです。

これは、私があなたに欠けていると思う部分です。

NSString *boundary = @"---------------------------14737809831466499882746641449";  
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary];

境界は一連の乱数にすることができますが、存在する必要があります。

また、リクエストの本文、特にスラッシュを作成するときは注意してください。" " を必ずエスケープしてください。

于 2012-09-14T09:50:49.833 に答える
1

すべての変数をエンコードしていません。変数を URL エンコードする必要があります。ここで見つけることができるエンコード関数のサンプル:

+(NSString *)urlEncode:(NSString *)unencodedString{
    return (NSString *)CFURLCreateStringByAddingPercentEscapes(NULL,
                                                            (CFStringRef)[NSHelper string:unencodedString],
                                                            NULL,
                                                            (CFStringRef)@"!*'();:@&=+$,/?%#[]",
                                                            kCFStringEncodingUTF8 );
}

ところで、POST 文字列の末尾にある「&」文字を削除します。

于 2012-09-14T08:54:34.463 に答える