私はobjective-cにかなり慣れていないので、POSTを使用していくつかのキーと値のペアをPHPスクリプトに渡すことを検討しています。次のコードを使用していますが、データは投稿されていないようです。NSDataを使用して送信しようとしましたが、どちらも機能していないようです。
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);
これは、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"
?>
何か案は?
皆さんの提案に感謝します。結局、私は与えられたものを使って問題を解決することができました ここ 。
コード:
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);
これは間違っています:
[NSData dataWithBytes:[post UTF8String] length:[post length]]
長さは、UTF8文字の数ではなくバイトで表す必要があります。この行の代わりに、次のものを使用する必要があります。
NSData *data = [post dataUsingEncoding: NSUTF8StringEncoding];
多くのフォーム投稿を行う場合は、NSURLRequestをスキップし、代わりに ASIHTTPRequest を使用することをお勧めします。 IMHO、それは十分に文書化されており、Webサービスと対話するための簡単な方法を提供します。
この行[request setHTTPBody:[NSData dataWithBytes:data length:[data count]]];
私にはかなり間違っているように見えます。
私はあなたが欲しいと思います:[request setAllHTTPHeaderFields:data];
次に、Cocoaフレームワークは、フィールド名を送信する前に、フィールド名の最初の文字を大文字にします(迷惑です)。これに対処するには、いくつかの変更を加える必要があるかもしれません。
これは、フォームの投稿とデータの取得のために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);
よろしくお願いいたします。ArunDhwaj
編集: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')");
_
それを超えて、一般に、スクリプトが外部から到達できない場合でも、ユーザー入力を信頼してはならず、SQLインジェクションを防ぐために、SQLステートメントに値を挿入する前にmysql_real_escape_string()
を使用して値をエスケープする必要があります。または、 プリペアドステートメント (推奨)-を使用します。そうしないと、正当なデータの単一引用符が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) ."')");
_