从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,现在我知道我的代码的其余部分按预期工作。
您似乎对如何填充$_POST
variables有个基本的误解。将文档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); ?>