使用NSData将日期从xCode传递到PHP

时间:2015-04-21 18:36:27

标签: php ios objective-c xcode

我正在尝试将日期从Xcode传递到PHP页面(将Date存储到mysql数据库)但是NSData似乎不喜欢Date的格式。

//Format date for mysql & PHP
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
NSString *strToday = [dateFormatter  stringFromDate:[NSDate date]];

NSString *strURL = [NSString stringWithFormat:@"http://www.TESTSERVER.com/Items.php?uID=123456789&item1=30&item2=5&startDate=%@&endDate=%@", strToday, strToday];

//strURL=[strURL stringByReplacingOccurrencesOfString:@" " withString:@"%20"];

NSLog(@"%@", strURL);

NSData *dataURL = [NSData dataWithContentsOfURL:[NSURL URLWithString:strURL]];

NSString *strResult = [[NSString alloc] initWithData:dataURL encoding:NSUTF8StringEncoding];
NSLog(@"%@", strResult);

我通过手动输入数据测试了PHP页面,它没有任何问题。但是,当我运行上面的代码时它不起作用,我已将问题隔离到日期,并且我认为NSData在我的日期格式中存在空间问题(在日期和时间之间)。 / p>

我尝试用%20填充空白(URL编码等)并且连接到db但是日期字段的格式不正确,所以它在mysql数据库中显示为null。

我宁愿不开始在我的PHP中解析字符串,有人知道如何解决这个问题吗?

以下是我的PHP代码: -

<?PHP

$hostname = "XXX";
$username = "XXX";
$password = "XXX";
$database = "XXX";

$db_handle = mysql_connect($hostname, $username, $password);
$db_found = mysql_select_db($database, $db_handle);


$uID = $_GET['uID'];
$item1 =$_GET['item1'];
$item2 =$_GET['item2'];
$startDate =$_GET['startDate'];
$endDate =$_GET['endDate'];

if ($db_found) {

    $sql = "INSERT INTO Items (uID, item1, item2, startDate, endDate) VALUES  ('$uID','$item1','$item2','$startDate','$endDate');";

    //$cleanSQL = str_replace("%20"," ",$sql);
    $result = mysql_query($sql);

    mysql_close($db_handle);

    print "Records added to the database";

} else {

    print "Database NOT Found ";
    mysql_close($db_handle);
}

?>

1 个答案:

答案 0 :(得分:1)

此代码存在许多问题,但根据提供的有限信息,无法诊断导致您描述的问题的确切原因。一些观察结果:

  1. 您肯定需要百分比转义日期字符串。 URL中不允许使用该空格(也不是标准x-www-form-urlencoded请求的正文)。

  2. 如果您要插入数据,则应发出POST请求,而不是将此内容添加到网址,实际上会发出GET请求。

  3. 您不应该向dataWithContentsOfURL发出请求。这不仅是GET,而且是同步的,不报告错误。

  4. 如果您仍有问题,请使用Charles或类似工具观察此请求。观察您通过网络浏览器进行的相同请求并进行比较和对比。

  5. 就个人而言,当我遇到问题时,我会暂时更改我的PHP代码以返回传递给它的数据,因此我可以确保所有内容都已正确接收。这是一种简单但有效的方式来确认所有内容都已正确接收。

  6. 如果要将日期字符串传递给服务器,通常应使用GMT时区,以避免因服务器不知道用户设备所在的时区而产生的问题。同样,您应该使用en_US_POSIX区域设置,以避免非格里历日历出现问题。请参阅Apple Technical Q&A 1480

  7. 将所有这些结合起来,你最终会得到更像:

    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
    [dateFormatter setLocale:[NSLocale localeWithLocaleIdentifier:@"en_US_POSIX"]];
    [dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]]; // if you REALLY want to use local timezone, eliminate this line, but I'd really advise sticking with GMT when using formatters to create and parse date strings that you're sending to a remote server
    NSString *strToday = [dateFormatter  stringFromDate:[NSDate date]];
    
    NSURL *url = [NSURL URLWithString:@"http://www.TESTSERVER.com/Items.php"];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    [request setHTTPMethod:@"POST"];
    
    NSString *body = [[NSString stringWithFormat:@"uID=123456789&item1=30&item2=5&startDate=%@&endDate=%@", strToday, strToday] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    [request setHTTPBody:[body dataUsingEncoding:NSUTF8StringEncoding]];
    
    [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];  // not necessary, but good practice
    
    NSURLSessionTask *task = [[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
        // use the data/error/response objects here
    
        if (data) {
            NSString *responseString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
            NSLog(@"responseString = %@", responseString);
        } else {
            NSLog(@"error = %@", error);
            NSLog(@"response = %@", response);
        }
    }];
    [task resume];
    
    // don't try to use the string here, because the above happens asynchronously
    

    坦率地说,我不喜欢这种过于简单的设置body的机制(如果任何字段包含+&这样的特殊字符,则上述操作不起作用)。但是,如果参数正如您在问题中概述的那样,那么这种简单的解决方案应该可行。但是,如果您想要在这方面更加健壮,请参阅https://stackoverflow.com/a/22887238/1271826中显示的encodePostParameters方法。

    顺便说一句,我建议考虑使用AFNetworking,因为这会让你摆脱手动构建请求的杂草。

    但是,回到原来的问题,我们不能在没有看到服务器代码或你做更多调试的情况下进一步建议你(Charles,确认正确接收了值等)。