Используя NSURLRequest для передачи пар "ключ-значение" Сценарию PHP с POST

Я довольно плохо знаком с целью-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"
?>

Какие-либо идеи?

16
задан Ralf Mclaren 30 March 2010 в 11:55
поделиться

4 ответа

Всем спасибо за предложения. В конце концов, мне удалось решить проблему, используя данные здесь .

Код:

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);
36
ответ дан 30 November 2019 в 16:00
поделиться

Эта строка [request setHTTPBody: [NSData dataWithBytes: data length: [data count]]]; мне кажется неправильной.

Думаю, вы хотите: [request setAllHTTPHeaderFields: data];

Во-вторых, вы обнаружите, что структура Какао использует первую букву ваших имен полей с заглавной буквы перед их отправкой (досадно). Возможно, вам придется внести некоторые изменения, чтобы справиться с этим.

2
ответ дан 30 November 2019 в 16:00
поделиться

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) ."')");
0
ответ дан 30 November 2019 в 16:00
поделиться

Если вы собираетесь делать много публикаций форм, я бы порекомендовал пропустить NSURLRequest и вместо этого использовать ASIHTTPRequest. ИМХО, это хорошо документировано и предлагает простой способ взаимодействия с веб-сервисами.

2
ответ дан 30 November 2019 в 16:00
поделиться