2010-03-30 167 views
16

我對objective-c相當陌生,並且希望使用POST將一些鍵值對傳遞給PHP腳本。我使用下面的代碼,但數據似乎並沒有通過發佈。我也嘗試通過使用NSData發送內容,但都沒有工作。使用NSURLRequest通過POST將鍵值對傳遞給PHP腳本

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

這是越來越發送到這個簡單的腳本來執行數據庫插入:

<?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" 
?> 

任何想法?

+1

感謝pinkgothic,我現在報價收納我的INSERT語句,但它是隻增加空值到數據庫。我想這意味着價值觀仍然沒有通過正確的方式發佈? – 2010-03-30 11:29:46

回答

36

感謝大家的建議。最後,我設法通過使用給定的東西來解決問題here

代碼:

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

編輯:已在OP中修復。


這可能不是你唯一的問題(我不知道我周圍的Objective-C方式),但這裏有雲:

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

你沒有引號包圍你的字符串 - 的MySQL肯定會有一個適合於這個的人。

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

除此之外,通常,即使你的腳本是從外面無法訪問,你不應該信任用戶的輸入,要麼使用mysql_real_escape_string()逃脫你的價值觀,將其插入到SQL語句以防止SQL注入,或者使用prepared statements(首選) - 否則合法數據中的單引號將破壞SQL語句的語法。

參考完全不適度例如:

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

此行[request setHTTPBody:[NSData dataWithBytes:data length:[data count]]];看起來方式我錯了。

我想你想:[request setAllHTTPHeaderFields:data];

其次,你會發現Cocoa框架大寫的字段名的第一個字母把他們(煩人)前。您可能需要進行一些更改才能解決這個問題。

+0

恐怕沒有 - 現在我越來越: 400錯誤的請求

400錯誤的請求

您的客戶端發出格式錯誤或非法的請求。 從sendSynchronousRequest:方法返回。有沒有其他的頭字段需要發送以符合HTTP? – 2010-03-30 19:47:57

2

如果你打算做很多表單發佈,我建議跳過NSURLRequest並使用ASIHTTPRequest來代替。恕我直言,這是有據可查的,並提供了一個直接的方式與網絡服務交互。

+0

謝謝,但並沒有想在整個項目中使用它超過一次。雖然我喜歡看它發佈內容的容易程度。 – 2010-03-31 10:25:51

4

這是錯誤的:

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

長度應以字節爲單位未在UTF8字符數來表示。 而不是你應該使用這條線:

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

嘗試幾乎所有東西,整個事情都在這個字符串中。謝謝! – blackhawk4152 2013-02-02 06:31:18

1

這是IOS 5的工作。o對於表單提交和獲得數據:

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

感謝&問候, 阿倫Dhwaj