2010-03-30 12 views
16

Je suis assez nouveau à l'objectif-c, et je cherche à passer un certain nombre de paires clé-valeur à un script PHP en utilisant POST. J'utilise le code suivant, mais les données ne semblent tout simplement pas être publiées. J'ai essayé d'envoyer des trucs en utilisant NSData, mais aucun ne semble fonctionner.Utilisation de NSURLRequest pour passer des paires clé-valeur au script PHP avec POST

NSDictionary* data = [NSDictionary dictionaryWithObjectsAndKeys: 
    @"bob", @"sender", 
    @"aaron", @"rcpt", 
    @"hi there", @"message", 
    nil]; 

NSURL *url = [NSURL URLWithString:@"http://myserver.com/script.php"]; 
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 

[request setHTTPMethod:@"POST"]; 
[request setHTTPBody:[NSData dataWithBytes:data length:[data count]]]; 

    NSURLResponse *response; 
    NSError *err; 
    NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&err]; 
    NSLog(@"responseData: %@", content); 

Cela devient envoyé à ce script simple à réaliser un insert db:

<?php $sender = $_POST['sender']; 
     $rcpt = $_POST['rcpt']; 
     $message = $_POST['message']; 

     //script variables 
     include ("vars.php"); 

     $con = mysql_connect($host, $user, $pass); 
     if (!$con) 
     { 
     die('Could not connect: ' . mysql_error()); 
     } 

     mysql_select_db("mydb", $con); 

     mysql_query("INSERT INTO php_test (SENDER, RCPT, MESSAGE) 
     VALUES ($sender, $rcpt, $message)"); 

     echo "complete" 
?> 

Toutes les idées?

+1

Merci à pinkgothic, je suis maintenant citation enserrant ma déclaration d'insertion, mais il ne fait qu'ajouter des valeurs vides à la DB . Je suppose que cela signifie que les valeurs ne sont toujours pas affichées correctement? –

Répondre

36

Merci pour les suggestions tout le monde. En fin de compte, j'ai réussi à résoudre le problème en utilisant des trucs donnés here.

code:

NSString *myRequestString = @"sender=my%20sender&rcpt=my%20rcpt&message=hello"; 
NSData *myRequestData = [ NSData dataWithBytes: [ myRequestString UTF8String ] length: [ myRequestString length ] ]; 
NSMutableURLRequest *request = [ [ NSMutableURLRequest alloc ] initWithURL: [ NSURL URLWithString: @"http://people.bath.ac.uk/trs22/insert.php" ] ]; 
[ request setHTTPMethod: @"POST" ]; 
[ request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"content-type"]; 
[ request setHTTPBody: myRequestData ]; 
NSURLResponse *response; 
NSError *err; 
NSData *returnData = [ NSURLConnection sendSynchronousRequest: request returningResponse:&response error:&err]; 
NSString *content = [NSString stringWithUTF8String:[returnData bytes]]; 
NSLog(@"responseData: %@", content); 
0

Modifier: A été corrigé dans OP.


Cela peut ne pas être votre seul problème (je ne sais pas mon chemin c-objectif), mais va ici:

mysql_query("INSERT INTO php_test (SENDER, RCPT, MESSAGE) 
VALUES ($sender, $rcpt, $message)"); 

Vous n'êtes pas citer enserrant vos cordes - MySQL est lié à avoir un ajustement hissy sur cela.

mysql_query("INSERT INTO php_test (SENDER, RCPT, MESSAGE) 
VALUES ('$sender', '$rcpt', '$message')"); 

Au-delà, en général, même si votre script n'est pas accessible depuis l'extérieur, vous ne devriez pas faire confiance entrée d'utilisateur et soit utiliser mysql_real_escape_string() pour échapper à vos valeurs avant de les insérer dans l'instruction SQL pour empêcher l'injection SQL ou utilisez prepared statements (de préférence) - sinon, des guillemets simples dans vos données légitimes briseront la syntaxe de l'instruction SQL.

exemple entièrement disgracieuse pour référence:

mysql_query("INSERT INTO php_test (SENDER, RCPT, MESSAGE) 
VALUES ('" . mysql_real_escape_string($sender) ."'," 
." '" . mysql_real_escape_string($rcpt) ."'," 
." '" . mysql_real_escape_string($message) ."')"); 
2

Cette ligne [request setHTTPBody:[NSData dataWithBytes:data length:[data count]]]; a l'air bien mal pour moi.

Je pense que vous voulez: [request setAllHTTPHeaderFields:data];

En second lieu, vous trouverez le cadre de cacao capitalise la première lettre de vos noms de champs avant de les envoyer (fâcheusement). Vous devrez peut-être faire quelques changements pour y faire face.

+0

Je crains que non - maintenant je reçois: 400 Bad Request

400 Bad Request

Votre client a émis une demande malformé ou illégale. retour de sendSynchronousRequest: méthode. Y a-t-il d'autres champs d'en-tête que je dois envoyer pour me conformer à HTTP? –

2

Si vous prévoyez de publier beaucoup de formulaires, je vous recommande d'ignorer NSURLRequest et d'utiliser ASIHTTPRequest à la place. À mon humble avis, il est bien documenté et offre un moyen simple d'interagir avec les services Web.

+0

merci, mais ne cherche pas à l'utiliser plus que cela une fois dans l'ensemble du projet vraiment. Bien que j'apprécie le fait qu'il soit facile de poster des choses. –

4

Ceci est faux:

[NSData dataWithBytes:[post UTF8String] length:[post length]] 

La longueur doit être exprimé en octets pas le nombre de caractères UTF8. Au lieu de cette ligne, vous devez utiliser:

NSData *data = [post dataUsingEncoding: NSUTF8StringEncoding]; 
+0

Essayé presque tout, le tout était dans cette chaîne. Merci! – blackhawk4152

1

Cela fonctionne sur iOS 5.o pour l'affichage de forme et d'obtenir les données:

self.requestFor = serviceNameT; 

responseData = [[NSMutableData data] retain]; 

SharedResponsedObject* sharedResponsedObject = [SharedResponsedObject returnSharedInstance]; 
LoginInfo* loginInfo = (LoginInfo*)sharedResponsedObject.loginInfo; 

NSLog(@"DEVICE_TOKEN: %@, loginInfo.sessionId: %@, itemIdT: %@", DEVICE_TOKEN, loginInfo.sessionId, itemIdT); 

NSString* requestStr = [NSString stringWithFormat:@"Token=%@&SessionId=%@&ItemId=%@", DEVICE_TOKEN, loginInfo.sessionId, itemIdT]; 


NSData *myRequestData = [ NSData dataWithBytes: [ requestStr UTF8String ] length: [ requestStr length ] ]; 

NSMutableURLRequest *request = [[ NSMutableURLRequest alloc ] initWithURL: [ NSURL URLWithString:@"http://menca.com:1500/DownloadContent.aspx"]]; 

[request setHTTPMethod: @"POST" ]; 
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"content-type"]; 
[ request setHTTPBody: myRequestData ]; 


NSURLResponse *response; 
NSError *err; 
NSData *returnData = [ NSURLConnection sendSynchronousRequest: request returningResponse:&response error:&err]; 
NSString *content = [NSString stringWithUTF8String:[returnData bytes]]; 
NSLog(@"ServerRequestResponse::responseData: %@", content); 

Merci & Cordialement, Arun Dhwaj