2012-12-03 14 views
7

Przeglądnąłem nieskończoną liczbę podobnych problemów, ale żaden z nich nie odpowiedział na to, czego szukałem, ani nie odpowiedział na nie w sposób kompletny, więc mam nadzieję, że wszyscy mi pomogą.Przekazywanie tablicy do PHP za pomocą testu POST z iOS

Muszę przekazać tablicę identyfikatorów restauracji z iOS do pliku PHP przy użyciu testu POST lub w każdym razie, który działałby dobrze. Wiem o ASIHTTPRequest, ale szukam czegoś wbudowanego i został opuszczony przez programistę. I na koniec, nie chcę przekazywać ich przez adres URL, ponieważ nie wiem, ile zgłoszeń będzie.

Oto, co otrzymałem do tej pory.

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

Tak, z tym, Sprawdziłem wszystko i to wszystko wygląda dobrze, ale od końca PHP nie nawet go podnieść.

Oto co mój plik PHP wygląda następująco:

$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); 

więc w końcu, co robię źle? Dlaczego nie otrzymuję niczego na moim końcu PHP. A przede wszystkim, czy ktoś może mi wyjaśnić, jak wysłać tablicę przez POST. Ponieważ czuję, że to mój prawdziwy problem, nie rozumiem tego wystarczająco, aby samemu rozwiązać problem. Nie rozumiem, jak możesz umieścić wszystko ze strony iOS i odebrać go po stronie PHP.

Mam nadzieję, że wszystko to było wystarczająco jasne, z góry dzięki.

EDIT:
Próbowałem minięciu tablicy jako ciąg poprzez URL następnie wybucha to, na szczęście to działało ... ale jestem tylko w ramach limitu URL, tak bym jeszcze chciał dowiedzieć się, inne rozwiązanie. Przynajmniej teraz wiem, że reszta mojego kodu działała zgodnie z oczekiwaniami.

+1

używasz ramy php? – ekims

+1

Twój kod zawiera [podatność na atak SQL injection] (http://en.wikipedia.org/wiki/SQL_injection). Używasz mysqli, dlaczego nie używasz przygotowanych instrukcji? – Charles

+0

Cześć Charles, tak, mój kod zawiera luki w zabezpieczeniach SQL injection, ale co masz na myśli przez przygotowane instrukcje? – WiseOlMan

Odpowiedz

8

Wygląda na to, że masz podstawowe nieporozumienie dotyczące wypełniania zmiennej $_POST. Określenie typu dokumentu jako JSON i wyrzucenie łańcucha JSON jako treści posta nie spowoduje automatycznego wypełnienia tej tablicy. Ciało musi być w określonym formacie. Zwykle oznacza to pary zakodowane w adresach URL, np. a=1&b=2&c=2&d=%2fg+y itd. W pewnym stopniu ogranicza to rodzaj danych, które można wysłać. W szczególności, dowolny obiekt JSON nie jest możliwy w tym sensie, jeśli chcesz, aby był automatycznie wyświetlany w zmiennej $ _POST. Dostępnych jest kilka opcji:

Opcja pierwsza: Zamiast używać $_POST, należy bezpośrednio użyć korpusu słupka. Użyj fopen("php://input") i analizowania, że ​​za pomocą parsera PHP JSON:

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

Jeśli poszedł tą drogą nie musisz utworzyć obiekt z polem o nazwie restIDs chociaż. Można zamiast tego po prostu serializacji tablicy i używać $obj jako $restIDs

Opcja druga, zakładając swoje obiekty w restIDs są po prostu ciągi, zamiast przekazywać dane w postaci obiektu JSON sformatować ciało jako przeznaczone do użytku PHP:

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

Teraz powinieneś być w stanie uzyskać do niego dostęp za pomocą $_POST['restIDs'], jak można się spodziewać.

+0

Cześć Ed, próbowałem drugiej opcji, ale nie do końca rozumiałem, jak ją wdrożyć, ponieważ nic nie wychodzi z drugiej strony. W jaki sposób bodyStr będzie zbudowany w tablicy wewnątrz $ _POST? W pierwszej opcji zachowałem wszystko tak, jak było w przypadku mojego pytania, i dodałem trzy linie do mojego kodu PHP, a następnie echo "$ obj [" restIDs "] i $ obj i nic nie wyszło. Co mogłem robić źle? Czy mój POST źle działa po stronie iOS? – WiseOlMan

+0

Z tego, co widzę, wszystko wygląda dobrze. Oprócz instrukcji echa na górze skryptu php, który zmieni twój wynik, gdy spróbujesz przeanalizować go jako JSON po stronie iOS. Proponuję wiele instrukcji 'NSLog' w kodzie Objective-C i wiele instrukcji' var_dump' po stronie php, aby śledzić rzeczy. W szczególności spróbuj 'var_dump (file_get_contents (" php: // input "));' –

+0

Dobra, opublikuję, gdy wyśledzę sprawcę, dzięki! – WiseOlMan

1

Mijacie tablicę źle. Najpierw umieściłeś go w łańcuchu JSON, a następnie nie wstawiłeś łańcucha JSON w zmiennych post, ale jako treść wiadomości HTML.Jeśli zamierzasz używać JSON do przesyłania danych do PHP za pomocą komunikatu POST, musisz ustawić go jako zmienną post. Następnie w PHP czytasz zmienną i dekoduje json, aby uzyskać oryginalne zmienne. Oto przykład tego, jak to zrobiłem.

Przepraszam Pierwotnie wkleiłem kod Java tutaj. To może mieć więcej sensu.

-(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); 
?> 
+0

Hi Codeguy, problem z tym podejściem polega na tym, że nie wiem, ile zmiennych będę mieć przed czasem, więc pary nazwa/wartość nie dadzą rady. Czy istnieje sposób, w jaki mogę odszyfrować jsona w tablicy, którą mogę przetworzyć? Jak to zrobić? Wspomniałeś również, że przekazuję błędne dane JSON. Jak mogę przekazać go jako zmienną post? A potem, w jaki sposób mogę go pobrać po stronie PHP? Dzięki. – WiseOlMan

+0

Zrobiliśmy to za pomocą tablicy. Tablica może zawierać tyle wierszy co liczba zmiennych. Czasem po prostu wrzucamy zmienne do łańcucha csv i przekazujemy je również w ciągu JSON. Ani ciąg tablica lub csv nie zdefiniowano wierszy lub kolumn, aby mogły być zmienne. Może istnieć lepszy sposób, ale przejście łańcucha csv zostało ustalone na długo przed użyciem JSON. – Codeguy007

Powiązane problemy