I'm fairly new to objective-c, and am looking to pass a number of key-value pairs to a PHP script using POST. I'm using the following code but the data just doesn't seem to be getting posted through. I tried sending stuff through using NSData as well, but neither seem to be working.
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);
This is getting sent to this simple script to perform a db insert:
<?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"
?>
Any ideas?
This is wrong:
The length should be expressed in bytes not in count of UTF8 characters. Instead of this line you should use:
If you are going to do a lot of form posting, I'd recommend skipping NSURLRequest and using ASIHTTPRequest instead. IMHO, it's well documented and offers an straightforward way to interact with webservices.
Edit: Has been fixed in OP.
This may not be your sole problem (I don't know my way around objective-c), but here goes:
You're not quote-enclosing your strings - MySQL is bound to have a hissy fit over that.
Beyond that, generally, even if your script is not reachable from the outside, you shouldn't trust user input and either use
mysql_real_escape_string()
to escape your values before you insert them into the SQL statement to prevent SQL injection, or use prepared statements (preferred) - otherwise single quotes in your legitimate data will break the SQL statement's syntax.Entirely ungraceful example for reference:
This line
[request setHTTPBody:[NSData dataWithBytes:data length:[data count]]];
looks way wrong to me.I think you want:
[request setAllHTTPHeaderFields:data];
Secondly, you will find the Cocoa framework capitalizes the first letter of your field names before sending them (annoyingly). You might have to make some changes to cope with that.
Thanks for the suggestions everyone. In the end i managed to solve the issue by using stuff given here.
Code:
This is working on IOS 5.o for Form Posting and getting the Data:
Thanks & Regards, Arun Dhwaj