Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Objective-c-使用时间戳或实际日期从数据库调用最新数据_Php_Objective C - Fatal编程技术网

Php Objective-c-使用时间戳或实际日期从数据库调用最新数据

Php Objective-c-使用时间戳或实际日期从数据库调用最新数据,php,objective-c,Php,Objective C,我有一个允许用户重新加载最新消息的应用程序,所以我有一个PHP脚本,它可以获取最新数据,并选择最新日期之后或等于最新日期的所有新消息 我的问题是比较时间戳(可能是1402382737)还是比较实际日期。我现在进入代码: 以下是选择最新消息的SQL: $sql = "select m.*, u.*, at.*, UNIX_TIMESTAMP(M_Date) as M_Date2 from M_Messages m inner join AT_AddThread at on at.AT_ID = m

我有一个允许用户重新加载最新消息的应用程序,所以我有一个PHP脚本,它可以获取最新数据,并选择最新日期之后或等于最新日期的所有新消息

我的问题是比较时间戳(可能是1402382737)还是比较实际日期。我现在进入代码:

以下是选择最新消息的SQL:

$sql = "select m.*, u.*, at.*, UNIX_TIMESTAMP(M_Date) as M_Date2 from M_Messages m inner join AT_AddThread at on at.AT_ID = m.M_AT_ID inner join U_Users u on u.U_ID = m.M_U_ID where M_AT_ID = :idThread and m.M_Date >= :lastDate order by m.M_Date ASC";
以下是设置最新日期的Objective-C代码:

    if((NSNull *)[dict objectForKey:@"M_Date2"] != [NSNull null]){
        NSString *dateTS = [dict objectForKey:@"M_Date"];
        NSString *timestampString = [dict objectForKey:@"M_Date2"];
        double timestampDate = [timestampString doubleValue];
        NSDate *d = [NSDate dateWithTimeIntervalSince1970:timestampDate];
        NSDateFormatter *_formatter=[[NSDateFormatter alloc]init];
        [_formatter setDateFormat:@"dd.MM.yyyy HH:mm:ss"];
        m_Date = [_formatter stringFromDate:d];
        if (counter == 1) {
        lastDatePostActivity = dateTS;
        }
    }
我是否将时间戳发送回PHP脚本或实际日期,如果我发送回时间戳,我是否需要将select语句修改为:

$sql = "select m.*, u.*, at.*, UNIX_TIMESTAMP(M_Date) as M_Date2 from M_Messages m inner join AT_AddThread at on at.AT_ID = m.M_AT_ID inner join U_Users u on u.U_ID = m.M_U_ID where M_AT_ID = :idThread and UNIX_TIMESTAMP(m.M_Date) >= :timestamp order by m.M_Date ASC";

因为应用程序将有通用时间,所以如果来自另一个国家的其他用户发送消息,那么所有时区都应该与您所在的每个国家相匹配,这就是为什么我不确定是使用时间戳还是实际日期,您不能从客户端使用NSDate对象, 用户可能有不同的时区或不正确的时间

当您第一次从后端获取数据时,还必须提供当前服务器时间并将其保存,下次您要从后端获取数据时,将提供此(保存的)时间戳,后端将过滤消息

如果您不想保存此时间戳,您可以始终签入当前消息,消息的最大时间戳是多少(同样,这些时间戳应由服务器生成)并使用它

假设您有两个方法,一个从后端获取数据,另一个返回当前客户端设备上的上次更新日期

您可以直接使用时间戳,并通过php将时间戳转换为日期对象或字符串(与SQL数据库使用的格式相同)

比如说

$date = date('Y-m-d H:i:s',$timestamp);
步骤

  • 创建将返回客户端上的最后更新日期的函数
  • 使用该日期获取消息(如果这是用户第一次希望获取数据,则使用时间戳0)
  • 正确保存上次更新日期时间戳,不存储NSDate,如果用户更改日期而您使用不正确,则可能不正确
  • 这里有一个简单的例子

        // php example
        echo json_encode(Array( 'data' => $yourData, 'timestamp' => time() ));
    
        //objc example
        - (NSNumber *)lastTimestamp {
                NSNumber *timestamp = [[NSUserDefaults standardUserDefaults] objectForKey:@"timestamp"];
                if(!timestamp) timestamp = @(0);
                return timestamp;
        }
    
    
        NSDictionary *result = fetchDataFromBackendWithTimestamp([self lastTimestamp]);
        // Save messages
    
    
        NSNumber *timestamp = result[@"timestamp"];
        [[NSUserDefaults standardUserDefaults] setObject:timestamp forKey:@"timestamp"];
        [[NSUserDefaults standardUserDefaults] synchronize];
    
    
    // Php SQL Query will be somethng like this
    $sql = "SELECT * FROM YOUR_TABLE WHERE date_field > :date_field ";
    $statement = $mysql->prepare($sql);
    $date = date('Y-m-d H:i:s',$timestamp);
    $statement->bindParam(":date_field",$date);
    $statement->execute();
    
    while($row = $statement->fetch(PDO::FETCH_ASSOC)) {
        // do something with the row
    }    
    

    sql语句是什么?