从iOS使用POST将数组传递给PHP

所以我已经浏览了无数个类似的问题,但是没有一个能够回答我所寻找的问题,或者是以完整的方式回答问题,所以希望你们能够帮助我。

我需要通过使用POST将一系列的restaurantID从iOS传递到PHP文件,否则这将很好地工作。 我知道ASIHTTPRequest,但是我正在寻找内置的东西,而且已经被开发者放弃了。 最后,我不想通过URL传递他们,因为我不知道会有多less条目。

所以这是我到目前为止。

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]; 

所以,从这个angular度来看,我已经检查了一切,看起来都不错,但是从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传递数组作为string,然后爆炸,幸运的是它的工作…但我只是在URL限制,所以我仍然想找出另一种解决scheme。 至less,现在我知道我的代码的其余部分按预期工作。

您似乎对如何填充$_POSTvariables有个基本的误解。将文档types指定为JSON并将JSONstring作为后置主体将不会自动填充此数组。 身体必须以特定的格式。 通常情况下,这意味着URL编码对,例如a=1&b=2&c=2&d=%2fg+y等。这有点限制了您可以发送的数据types。 特别是,从这个意义上说,任何JSON对象都是不可能的,如果你想让它自动显示在$ _POSTvariables中。 这里有几个选项:

选项一:而不是使用$_POST ,直接使用邮政正文。 使用fopen("php://input")并使用PHP JSONparsing器parsing:

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

如果你走这条路线,你不需要创build一个名为restIDs的字段。 你可以简单地序列化数组,并使用$obj作为$restIDs

选项二,假设您在restIDs中的对象只是string,而不是将数据作为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']那样访问它了。

你传错了数组。 首先你把它放在一个JSONstring中,然后你没有把JSONstring放在postvariables中,而是作为HTML邮件的主体。 如果您打算使用JSON通过POST消息将数据传输到PHP,则需要将其设置为postvariables。 然后在PHP中,读取variables并解码json以获取原始variables。 这是我如何做的一个例子。

对不起,我最初在这里粘贴了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); ?>