7

それで、私は無限の数の同様の問題を調べましたが、それらのどれも私が探していたものに答えたり、完全に答えたりしなかったので、皆さんが私を助けてくれることを願っています。

POSTを使用してiOSからPHPファイルにrestaurantIDの配列を渡すか、とにかくうまくいく必要があります。ASIHTTPRequestについては知っていますが、組み込みのものを探していて、開発者によって放棄されました。そして最後に、エントリがいくつあるかわからないので、URLを介してそれらを渡したくありません。

これが私がこれまでに得たものです。

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:theURL]];

[request setHTTPMethod:@"POST"];

NSMutableDictionary *jsonDict = [[NSMutableDictionary alloc] init];
[jsonDict setValue:restaurants forKey:@"restIDs"];
NSLog(@"JSON Dict: %@",jsonDict);//Checking my array here


NSData *jsonData = [NSJSONSerialization dataWithJSONObject:jsonDict options:kNilOptions error:nil];
NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
NSLog(@"JSON String: %@",jsonString); //Checking my jsonString here...

[request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];

[request setValue:@"json" forHTTPHeaderField:@"Data-Type"];
[request setValue:[NSString stringWithFormat:@"%d", [jsonData length]] forHTTPHeaderField:@"Content-Length"];
[request setHTTPBody: jsonData];
NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
NSLog(@"Return DATA contains: %@", [NSJSONSerialization JSONObjectWithData:returnData options:NSJSONReadingMutableContainers error:nil]);
NSArray *restMenuCount = [NSJSONSerialization JSONObjectWithData:returnData options:NSJSONReadingMutableContainers error:nil];

それで、この終わりから、私はすべてをチェックしました、そしてそれはすべて良さそうに見えます、しかしPHPの終わりからそれはそれを拾うことさえしません。

私のPHPファイルは次のようになります。

$restIDs = $_POST['restIDs'];
echo $restIDs; //Checking to see if it even has anything......but nothing there
for ($i = 0; $i < $restIDs.count; $i++) {
    $query = "SELECT * FROM `MenuItems` WHERE rest_id = '$restID'";
    $result = mysqli_query($connect, $query);
    $number = mysqli_num_rows($result);
    $menuNumber[$i] = $number;
}

echo json_encode($menuNumber);

最後に、私は何が間違っているのですか?PHP側で何も受信しないのはなぜですか。そして何よりも、POSTを介してアレイを送信する方法を誰かが私に説明できますか?それが私の本当の問題だと感じているので、自分で問題を解決するのに十分な理解がありません。iOS側からすべてを入れてPHP側で取得する方法がわかりません。

よろしくお願いします。

編集:
配列を文字列としてURLに渡してから展開してみましたが、幸いなことにうまくいきました...しかし、URLの制限をわずかに下回っているので、別の解決策を見つけたいと思います。少なくとも、コードの残りの部分が期待どおりに機能していることがわかりました。

4

2 に答える 2

8

変数がどのように入力されるかについて基本的な誤解があるようです$_POST。ドキュメントタイプをJSONとして指定し、投稿本文としてJSON文字列をスローしても、この配列は自動入力されません。本文は特定の形式である必要があります。通常、これはURLエンコードされたペアa=1&b=2&c=2&d=%2fg+yなどを意味します。これにより、送信できるデータの種類が多少制限されます。特に、$ _ POST変数に自動的に表示する場合は、この意味で任意のJSONオブジェクトを使用することはできません。ここからいくつかのオプションがあります:

オプション1:を$_POST使用するのではなく、ポスト本体を直接使用します。fopen("php://input")PHPJSONパーサーを使用してそれを使用および解析します。

$input = file_get_contents("php://input");
$obj = json_decode($input,true);
$restIDs = $obj['restIDs'];

このルートを使用した場合は、フィールドという名前のオブジェクトを作成する必要はありませんrestIDs。代わりに、アレイをシリアル化して、次のように使用できます$obj$restIDs

オプション2は、restID内のオブジェクトがJSONオブジェクトとしてデータを渡すのではなく、単なる文字列であると想定して、PHPで使用するために本文をフォーマットします。

NSMutableString *bodyStr = [NSMutableString string];
for (NSString *restID in restaurants) {
    [bodyStr appendFormat:@"restIDs[]=%@&",[restID stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
}
NSData *body = [bodyStr dataUsingEncoding:NSUTF8StringEncoding];
[request setHTTPBody: body];

$_POST['restIDs']これで、期待どおりに使用してアクセスできるようになります。

于 2012-12-03T04:21:16.650 に答える
1

配列を間違って渡しています。最初にそれをJSON文字列に配置し、次にJSON文字列をpost変数に配置せず、HTMLメッセージの本文として配置しました。JSONを使用してPOSTメッセージを介してデータをPHPに転送する場合は、それをpost変数として設定する必要があります。次に、PHPで変数を読み取り、jsonをデコードして、元の変数を取得します。これが私がそれをした方法の例です。

申し訳ありませんが、元々Javaコードをここに貼り付けました。これはもっと理にかなっているかもしれません。

-(void) setPath: (NSString *) input
{
    Path=input;
}

-(void) run
{
    NSDictionary* jsonDictionary=[NSDictionary dictionaryWithObject: data1 forKey:@"data"];
    NSString* jsonString = [jsonDictionary JSONRepresentation];
    AFHTTPClient *httpClient=[[AFHTTPClient alloc] initWithBaseURL:url];
    NSDictionary *params =[NSDictionary dictionaryWithObjectsAndKeys:
                           apps,@"app",
                           jsonString,@"smpdata",nil];
    NSMutableURLRequest *request = [httpClient requestWithMethod:@"POST" path:Path parameters:params];

    NSURLResponse *response = nil;
    NSError *error = nil;

    NSData *data=[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

    if (error) {
        NSLog(@"Error: %@",error);
    }
    else {
        id JSON = AFJSONDecode(data, &error);
        NSArray *dataarray=[JSON valueForKey:@"Data"];
        status= [NSString stringWithFormat:@"%@",[JSON valueForKeyPath:@"Status"]];
        NSLog(@"%@",status);
        returndata= dataarray;

    }
}

-(NSArray *) returndata {
    return returndata;
}

-(NSString *) status {
    return status;
}

@end

PHP

<?
$jsondata=$_POST['smpdata'];
$data = json_decode($jsondata);
?>
于 2012-12-03T04:26:15.843 に答える