2008-12-01 7 views
32

Je crée un NSURLRequest pour publier mes données dans l'application iPhone sur un serveur afin de poursuivre le script PHP. Mon script PHP ressemble à ceci.Problème lors de l'utilisation de NSURLRequest pour envoyer des données au serveur

<?php 
    $name = $_POST['name']; 
    $email = $_POST['email']; 

    $link = mysql_connect("localhost", "fffasfdas","Nfdsafafs") or die ("Unable to connect to database."); 
    mysql_select_db("muradsbi_mydatabase") or die ("Unable to select database."); 

    $sqlstatement= "INSERT INTO dbname (name,email) VALUES ('$name','$email')"; 
    $newquery = mysql_query($sqlstatement, $link); 
    echo 'thanks for your register'; 
?> 

et mon NSURLRequst est créé comme ci-dessous.

NSString *myRequestString = @"&name=Hello%20World&email=Ohai2u"; 
NSData *myRequestData = [NSData dataWithBytes: [myRequestString UTF8String] length: [myRequestString length]]; 
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL: [NSURL URLWithString: @"http://www.google.com/"]]; 
[request setHTTPMethod: @"POST"]; 
[request setHTTPBody: myRequestData]; 
NSData *returnData = [NSURLConnection sendSynchronousRequest: request returningResponse: nil error: nil]; 

Cependant, ce site ne peut pas obtenir les données de cette application et l'enregistrer dans la base de données, mais je sais qu'il a été connecté succussfully parce que ma demande est en mesure d'obtenir les données de réponse du serveur. Je ne sais pas si mon nom de variable est déclaré de la mauvaise façon ou d'autres problèmes. Comment puis-je le réparer?

+1

En outre, vous ne libère pas la mémoire ... et il vous manque un peu « ; » personnages. * S'IL VOUS PLAÎT * toujours poster votre code coupé/collé réel. – Patricia

+3

couper/coller code réel rend les injections SQL plus probable;) – chunkyguy

+0

utiliser une autre bibliothèque/collection pour gérer vos demandes web pour un temps plus facile! http://allseeing-i.com/ – binnyb

Répondre

53

Vous devez supprimer le premier & dans myRequestString et le problème est probable que l'en-tête content-type correct n'est pas envoyé. Essayez d'ajouter un appel à

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

Vous ne devriez pas passer nil d'erreur, de sorte que vous pouvez voir ce que le client pense qui se passe. Non lié, mais votre code PHP est ouvert SQL injection attacks.

+0

cela fonctionne, merci pour la solution! – Dzamir

+0

@ superfell-- juste pour m'assurer que je ne suis pas un crétin complet, est-ce parce qu'il utilise des entrées non-identifiées pour le nom et le courriel, ou y a-t-il autre chose qui me manque? – mmr

+0

Oui, il prend une entrée aléatoire et la place dans une chaîne sql pour s'exécuter sans aucun échappement ou autre vérification. – superfell

0

essayer cette

NSString *name = [[NSString alloc]initWith String: @"Hello World"];  
NSString *email = [[NSString alloc]initWith String: @"Ohai2u"];  
NSString *urlString = [NSString stringWithFormat:@"http://somedomain.com/sendMail.php?name=%@&email=%@", 
          [name stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding], 
          [email stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; 

    NSURL *url = [[NSURL alloc] initWithString:urlString]; 

    NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url]; 

    NSData *urlData; 
    NSURLResponse *response; 
    urlData = [NSURLConnection sendSynchronousRequest:urlRequest returningResponse:&response error:nil]; 
    [url release]; 

juste ne pas oublier de version les chaînes

définir les en-têtes dans le script PHP

+3

C'est GET. Question liée à la requête POST. –

+0

Désolé, ma confusion – Spire

7

Il convient de noter que ...

NSData *data = [NSData dataWithBytes: [myRequestString UTF8String] 
           length: [myRequestString length]]; 

... est très mauvais et peut causer une erreur vague s. Avec UTF8, il n'y a aucune garantie que le nombre d'octets dans votre chaîne encodée est le même que le nombre de caractères dans votre chaîne.

Ainsi, au lieu, vous devez utiliser simplement:

NSData *data = [myRequestString dataUsingEncoding: NSUTF8StringEncoding];