Поэтому я просмотрел бесконечное количество подобных проблем, но никто из них не ответил на то, что я искал, и ответил на это в полной мере, поэтому, надеюсь, вы все можете мне помочь.
Мне нужно передать массив foodID от iOS к файлу PHP, используя POST, или в любом случае это будет хорошо работать. Я знаю об 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, поэтому мне все равно хотелось бы найти другое решение. По крайней мере, теперь я знаю, что остальная часть моего кода работала так, как ожидалось.
У вас, похоже, есть основное непонимание того, как заполняется переменная $_POST
. Указание типа документа как JSON и выброс строки JSON в качестве тела сообщения не будет автоматически заполнять этот массив. Тело должно быть в определенном формате. Обычно это означает URL-кодированные пары, например a=1&b=2&c=2&d=%2fg+y
и т. Д. Это несколько ограничивает данные, которые вы можете отправить. В частности, произвольный объект JSON невозможен в этом смысле, если вы хотите, чтобы он автоматически отображался в переменной $ _POST. Есть несколько вариантов отсюда:
Вариант один: вместо использования $_POST
используйте тело сообщения напрямую. Используйте fopen("php://input")
и проанализируйте его с помощью парсера PHP JSON:
$input = file_get_contents("php://input"); $obj = json_decode($input,true); $restIDs = $obj['restIDs'];
Если вы пошли по этому маршруту, вам не нужно создавать объект с полем с именем restIDs
. Вместо этого вы можете просто сериализовать массив и использовать $obj
как $restIDs
Второй вариант, если ваши объекты в 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']
как и следовало ожидать.
Вы ошиблись в массиве. Сначала вы поместили его в строку JSON, а затем вы не поместили строку JSON в переменные post, а как тело сообщения HTML. Если вы собираетесь использовать JSON для передачи данных на PHP через сообщение POST, вам необходимо установить его как переменную 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); ?>