2012-12-03 14 views
7

Quindi ho esaminato un numero infinito di problemi simili, ma nessuno di loro ha risposto a quello che stavo cercando o ha risposto in modo completo, quindi spero che tutti voi possiate aiutarmi.Passaggio di array a PHP utilizzando POST da iOS

Ho bisogno di passare un array di restaurantID da iOS a un file PHP usando il POST o comunque che funzionerebbe bene. So di ASIHTTPRequest ma sto cercando qualcosa di integrato ed è stato abbandonato dallo sviluppatore. E infine, non voglio passarli attraverso l'URL perché non so quante voci ci saranno.

Quindi ecco cosa ho ottenuto finora.

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

Quindi, da questo fine, ho controllato tutto e tutto sembra buono, ma a partire dalla fine di PHP non ha nemmeno prenderlo.

Ecco ciò che il mio file PHP assomiglia:

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

Così alla fine, quello che sto facendo di sbagliato? Perché non ricevo nulla sul mio terminale PHP. E soprattutto, qualcuno può spiegarmi come inviare gli array tramite un POST. Perché sento che questo è il mio vero problema qui, non lo capisco abbastanza per risolvere il problema me stesso. Non capisco come si possa inserire tutto dal lato iOS e riprenderlo dal lato PHP.

Spero che tutto ciò sia stato abbastanza chiaro, grazie in anticipo.

EDIT:
ho provato passando l'array come una stringa tramite l'URL poi esplodere è, per fortuna ha funzionato ... ma io sono appena sotto il limite di URL, così mi piace ancora di capire un'altra soluzione. Almeno, ora so che il resto del mio codice funzionava come previsto.

+1

stai usando un framework PHP? – ekims

+1

Il tuo codice contiene una [vulnerabilità di SQL injection] (http://en.wikipedia.org/wiki/SQL_injection). Stai usando mysqli, perché non stai usando istruzioni preparate? – Charles

+0

Ciao Charles, sì il mio codice contiene vulnerabilità di SQL injection, ma cosa intendi con istruzioni preparate? – WiseOlMan

risposta

8

Sembra che ci sia un malinteso di base su come è compilata la variabile $_POST. Specificare il tipo di documento come JSON e inserire la stringa JSON nel corpo del post non compilerà automaticamente questo array. Il corpo deve essere in un formato specifico. Di solito, questo significa coppie con codifica url, ad esempio a=1&b=2&c=2&d=%2fg+y ecc. Ciò limita in qualche modo il tipo di dati che è possibile inviare. In particolare, un oggetto JSON arbitrario non è possibile in questo senso, se si desidera che venga visualizzato automaticamente nella variabile $ _POST. Ci sono alcune opzioni da qui:

Opzione uno: Piuttosto che usare $_POST, utilizzare direttamente il corpo del post. Utilizzare fopen("php://input") e analizzare che l'utilizzo di un parser JSON PHP:

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

Se si è andato questo percorso non è necessario creare un oggetto con un campo denominato restIDs però. È possibile invece semplicemente serializzare la matrice e utilizzare $obj come $restIDs

Opzione due, assumendo gli oggetti in restIDs sono semplicemente stringhe, invece di passare i dati in un oggetto JSON, formattare il corpo come destinati ad essere utilizzati PHP:

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

Ora dovresti essere in grado di accedervi utilizzando $_POST['restIDs'] come ti aspetteresti.

+0

Ciao Ed, ho provato la seconda opzione, ma non ho capito completamente come implementarla dal momento che nulla è uscito dall'altra parte. Come sarà costruito bodyStr in una matrice all'interno di $ _POST? Inoltre, per la prima opzione, ho mantenuto tutto come era per la mia domanda, e ho aggiunto le tre righe al mio codice PHP, quindi echo'd $ obj ['restIDs'] e $ obj e non è uscito nulla. Cosa potrei fare di sbagliato? Il mio POST è impostato in modo errato sul lato iOS? – WiseOlMan

+0

Da quello che vedo, sembra tutto a posto. Oltre a avere un'eco nella parte superiore dello script php, che manterrà il tuo output quando proverai ad analizzarlo come JSON sul lato iOS. Suggerirei molte istruzioni 'NSLog' nel codice Objective-C e molte istruzioni' var_dump' sul lato php per rintracciare le cose. In particolare, prova 'var_dump (file_get_contents (" php: // input "));' –

+0

Ok, ti ​​rimanderò quando avrò rintracciato il colpevole, grazie! – WiseOlMan

1

Si sta passando l'array sbagliato. Per prima cosa lo hai inserito in una stringa JSON e quindi non hai messo la stringa JSON nelle variabili del post ma come corpo del messaggio HTML.Se si intende utilizzare JSON per trasferire dati in PHP tramite un messaggio POST, è necessario impostarlo come variabile post. Poi in PHP, leggi la variabile e decodifica il json per ottenere le tue variabili originali. Ecco un esempio di come l'ho fatto.

Mi dispiace, ho inserito il codice Java qui. Questo potrebbe avere più senso.

-(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

Ciao Codeguy, il problema con questo approccio è che non so quante variabili avrò in anticipo, quindi le coppie nome/valore non faranno il trucco. C'è un modo per decodificare il JSON in un array che posso scorrere? Come potrei farlo? Inoltre, hai detto che sto trasmettendo i miei dati JSON errati. Come potrei passare come variabile post? E poi come lo prenderei sul lato PHP? Grazie. – WiseOlMan

+0

Abbiamo gestito questo utilizzando un array. La matrice può contenere un numero di righe pari al numero di variabili. A volte, gettiamo le variabili in una stringa csv e le passiamo anche nella stringa JSON. Né la matrice o la stringa csv hanno definito righe o colonne in modo che possano essere variabili. Potrebbe esserci un modo migliore, ma il passaggio della stringa csv è stato deciso molto prima di usare JSON. – Codeguy007

Problemi correlati