Я довольно плохо знаком с целью-c и надеюсь передавать много пар "ключ-значение" Сценарию PHP с помощью POST. Я использую следующий код, но данные просто, кажется, не становятся отправленными через. Я пытался отправить материал посредством использования 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);
Это становится отправленным в этот простой сценарий для выполнения, дб вставьте:
<?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);
Эта строка [request setHTTPBody: [NSData dataWithBytes: data length: [data count]]];
мне кажется неправильной.
Думаю, вы хотите: [request setAllHTTPHeaderFields: data];
Во-вторых, вы обнаружите, что структура Какао использует первую букву ваших имен полей с заглавной буквы перед их отправкой (досадно). Возможно, вам придется внести некоторые изменения, чтобы справиться с этим.
Edit : Исправлено в OP.
Возможно, это не единственная ваша проблема (я не знаю, как обойти цель-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 или используйте подготовленные операторы (предпочтительно) - в противном случае одинарные кавычки в ваших законных данных нарушат синтаксис оператора 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) ."')");
Если вы собираетесь делать много публикаций форм, я бы порекомендовал пропустить NSURLRequest и вместо этого использовать ASIHTTPRequest. ИМХО, это хорошо документировано и предлагает простой способ взаимодействия с веб-сервисами.