POST ile PHP script anahtar-değer çiftleri geçmek NSURLRequest kullanma

6 Cevap php

Ben objektif-c için oldukça yeni ve POST kullanarak bir PHP komut dosyası için anahtar-değer çiftleri bir dizi geçmek için arıyorum. Ben aşağıdaki kodu kullanıyorum ama veri sadece aracılığıyla yayınlanmıştır almak gibi görünmüyor. Ben de NSData kullanılarak malzeme gönderme çalıştı, ama çalışıyor gibi görünüyor ne.

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

Bu bir db ekleme gerçekleştirmek için bu basit komut gönderilir oluyor:

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

Herhangi bir fikir?

6 Cevap

Önerileri için herkese teşekkürler. Sonunda i here Verilen malzeme kullanarak sorunu çözmek için başardı.

Kod:

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

Eğer form gönderme bir sürü yapmak için gidiyoruz, ben NSURLRequest atlama ve yerine ASIHTTPRequest kullanmanızı tavsiye ediyorum. IMHO, iyi belgelenmiş ve webservices ile etkileşim için bir basit bir yol sunar oluyor.

Bu yanlıştır:

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

The length should be expressed in bytes not in count of UTF8 characters. Instead of this line you should use:

NSData *data = [post dataUsingEncoding: NSUTF8StringEncoding]; 

Bu hat [request setHTTPBody:[NSData dataWithBytes:data length:[data count]]]; Bana yanlış yolu görünüyor.

Ben seni istiyorum: [request setAllHTTPHeaderFields:data];

İkincisi, Kakao framework (rahatsız edici) onları göndermeden önce alan adlarının ilk harfini bulacaksınız. Bununla başa çıkmak için bazı değişiklikler yapmak zorunda kalabilirsiniz.

Bu Form Verilerini Gönderme ve almak için IOS 5.o üzerinde çalışıyor:

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

Thanks & Regards, Arun Dhwaj

Edit: OP sabit edildi.


Bu (nesnel-c etrafında yolumu bilmiyorum) sizin tek sorun, ama buraya değil:

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

Sen alıntı-kuşatan değil dizeleri - MySQL baştan sona celallenme olması kaçınılmazdır.

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

Bunun ötesinde, genel olarak, komut dosyası dışarıdan ulaşılabilir olmasa bile, kullanıcı girişi güven olmamalı ve SQL enjeksiyonu önlemek için SQL deyimi içine eklemeden önce değerlerini kaçmak için mysql_real_escape_string() kullanmak ya veya kullanım prepared statements (tercih) - meşru veri aksi tek tırnak SQL ifadesinin sözdizimi kıracak.

Referans için tamamen inceliksiz örnek:

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) ."')");