2008-12-01 24 views
32

Tworzę NSURLRequest, aby opublikować moje dane w aplikacji iPhone na serwerze, aby kontynuować skrypt PHP. Mój skrypt PHP wygląda tak.Problem przy użyciu NSURLRequest do danych POST na serwerze

<?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'; 
?> 

i mój NSURLRequst jest tworzony jak poniżej.

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

Jednakże, ta strona nie jest w stanie uzyskać dane z tej aplikacji i zapisać go do bazy danych, ale wiem, że to było związane succussfully ponieważ moja aplikacja jest w stanie uzyskać dane odpowiedzi z serwera. Nie wiem, czy moja nazwa zmiennej jest zadeklarowana w niewłaściwy sposób, czy w innych kwestiach. Jak mogę to naprawić?

+1

Ponadto, nie są uwalniając swoją pamięć ... i brakuje niektórych „;” postacie. * PROSZĘ * zawsze podawaj rzeczywisty kod wycięty/wklejony. – Patricia

+3

wycinanie/wklejanie rzeczywistego kodu sprawia, że ​​wstrzykiwanie SQL jest bardziej prawdopodobne;) – chunkyguy

+0

użyj innej biblioteki/kolekcji do obsługi żądań internetowych przez łatwiejszy czas! http://allseeing-i.com/ – binnyb

Odpowiedz

53

Powinieneś usunąć wiodącą & w myRequestString, a problem prawdopodobnie nie jest wysyłany prawidłowego nagłówka content-type. Spróbuj dodać wywołanie

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

Nie należy również przekazać nil błędu, dzięki czemu można zobaczyć, co klient myśli się dzieje.

Niepowiązane, ale twój kod PHP jest otwarty na SQL injection attacks.

+0

to działa, dzięki za rozwiązanie! – Dzamir

+0

@ superfell - tylko po to, żeby upewnić się, że nie jestem kompletnym głupkiem, czy to dlatego, że używa niesanitarnych danych wejściowych do imienia i nazwiska, czy też jest coś, czego mi brakuje? – mmr

+0

Tak, wymaga losowego wprowadzenia i umieszczenia go w łańcuchu sql, aby wykonać operację bez żadnego sprawdzania ucieczki lub innego. – superfell

0

spróbować

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

tylko nie zapomnij wydaniu struny

ustawione nagłówki w skrypcie PHP

+3

To jest GET. Pytanie związane z żądaniem POST. –

+0

Przepraszam, moje zamieszanie – Spire

7

Należy zauważyć, że ...

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

... jest bardzo zła i może powodować niejasny błąd s. Z UTF8 jest zero gwarancji, że liczba bajtów w zakodowanym ciągu jest taka sama, jak liczba znaków w łańcuchu.

Zamiast więc należy po prostu użyć:

NSData *data = [myRequestString dataUsingEncoding: NSUTF8StringEncoding]; 
Powiązane problemy