【问题标题】:PHP time interval of at least ten daysPHP时间间隔至少十天
【发布时间】:2016-04-06 00:41:42
【问题描述】:

这个想法是查询用户最新个人资料更改的最新时间戳。如果他们尝试更新的时间少于十天,他们将被拒绝。无论我似乎做什么,我都无法正确获得 10 天差异逻辑。 $stamp 是数据库中的 Y-m-d 日期格式。

    <?php
ini_set('display_errors',1);
$json=$_POST['user'];
$json=str_replace('\\','',$json);
$user=json_decode($json);
$pdo=new PDO('mysql://hostname=localhost;dbname=database', 'user', 'password');
$update = $pdo->prepare("update  `accounts` set  stamp=CURDATE(),`title`='{$user->title}' ,`radio_hanlde`='{$user->radio_handle}' , `carrier`='{$user->carrier}' ,`hometown`='{$user->hometown}'  WHERE user_id='{$user->user_id}' AND DATE_DIFF(CURRDATE(),stamp) > 10");
$update->execute();
if ($update->rowCount() != 0 ){
     echo json_encode(array('success'=>'1','message'=>'Your profile has been updated successfully!'));} 
     else {echo json_encode(array('success'=>'0','message'=>'It has been less than ten days since your latest profile change. You will have to wait!'));}
?>

【问题讨论】:

  • 这应该是个问题。打印出两个日期以查看值是否正确..date_create($stamp[1]);特别是这个值
  • $stamp[0] 返回 "Array" , $stamp[1] 返回 " "。我不明白。当我查看 sql 工作台时,它包含“2016-23-01”并且字段是非空日期。
  • 我在这里可能做错了什么?
  • 这是我的查询 $query=$pdo->query("Select stamp FROM channel1_db.accounts where user_id='{$user->user_id}'"); $stam=$query->fetchAll(PDO::FETCH_ASSOC);
  • 你做错了@Robert ...遍历戳记并取一个变量..在foreach循环中分配值..并使用该变量进行比较

标签: php mysql json pdo


【解决方案1】:
 $today=date_create(date('Y-m-d'));
 $date2=date_create("2013-12-12");
 $diff=date_diff($today,$date2);

if($diff<10){
  echo "Your alert";
}

【讨论】:

  • 我正在尝试这个 date_diff(date1, date2) 调用,但我似乎对日期对象有一些问题。这几天我一直在绞尽脑汁,似乎看不到错误。
  • Danyal 您能否查看我编辑的代码帖子,看看您认为 $wait 返回 10 时可能会发生什么。
【解决方案2】:

函数 strtotime 以秒为单位返回时间戳,因此您可以像这样非常简单地以秒为单位获得差异

$secs = strtotime('now') - strtotime($stamp);
$days = $secs / 60 / 60 / 24;
if($days <= 10) {
    ..your code...
}

【讨论】:

  • 通过审核,感谢您对 SO 的回答,为了改进您的回答,不仅要考虑提供代码,还要提供一些关于代码的原因和作用的描述。例如strtotime函数ecc是什么。
【解决方案3】:
 $querydata="SELECT CURDATE()";
                                 $result_data= mysqli_query($link, $querydata);
                                  $data=mysqli_fetch_array($result_data)[0];
                                $intervaloTempo = gmdate("d:H:i:s", time() + (10 * 24 * 60 * 60);

用它来查询

 "(().data=\"".$data."\" and ()>=\"".$intervaloTempo."\"" )"

                                    $query = sprintf("select stamp from accounts where user_id='{$user->user_id}, mysqli_real_escape_string($link, $_SESSION['cliente_id']));
                                    $result = mysqli_query($link, $query);
                                    if (!$result) {
                                        die("Query error: " . mysqli_error($link));
                                        //con_close();
                                    }

【讨论】:

    【解决方案4】:

    使用time() 函数获取以秒为单位的当前时间(Unix 时间戳),使用strtotime() 将任何日期格式转换为时间戳。这是您示例的重构代码:

    <?php
    
    ini_set('display_errors', 1);
    
    $messages = [
        'error_invalid_json' => 'Error. Invalid json',
        'error_account_not_found' => 'Error. Account is not found',
        'success' => 'Your profile has been updated successfully!',
        'wait_1_day' => 'It has been less than ten days since your latest profile change. You must wait until tomorrow!',
        'wait_n_days' => 'It has been less than ten days since your latest profile change. You have %s more to go!',
    ];
    
    function message($message, $success = true)
    {
        echo json_encode([
            'success' => ($success) ? 1 : 0,
            'message' => $message,
        ]);
    
        exit;
    }
    
    // get and validate incoming data
    $json = $_POST['user'];
    $json = str_replace('\\', '', $json);
    if (empty($json)) {
        message($messages['error_invalid_json'], false);
    }
    try {
        $user = json_decode($json);
    } catch (\Exception $e) {
        message($messages['error_invalid_json'], false);
    }
    if (empty($user->user_id)) {
        message($messages['error_invalid_json'], false);
    }
    
    // find last modified date
    $pdo = new PDO('mysql://mydb', 'a_user', 'password');
    $query = $pdo->query("Select stamp FROM accounts WHERE user_id='{$user->user_id}' LIMIT 1");
    $stamp = $query->fetchAll(PDO::FETCH_ASSOC);
    if (empty($stamp)) {
        message($messages['error_account_not_found']);
    }
    
    // calculcate when user is allowed to change profile
    $daysShouldPassBeforeEdit = 10;
    $allowEditAfter = ($stamp[1]) ? strtotime($stamp[1]) + $daysShouldPassBeforeEdit * 86400 : time(); // if empty `stamp` then user have not edited and allow to edit now
    
    if (time() < $allowEditAfter) {
        $daysLeftBeforeAllowEdit = ceil(($allowEditAfter - time()) / 86400);
    
        if ($daysLeftBeforeAllowEdit == 1) {
            message($messages['wait_1_day'], false);
        } else {
            message(sprintf($messages['wait_n_days'], $daysLeftBeforeAllowEdit), false);
        }
    }
    
    // save changes
    $stamp = date("Y-m-d");
    $sql = "update  `accounts` set  stamp='$stamp',`title`='{$user->title}' ,`radio_hanlde`='{$user->radio_handle}' , `carrier`='{$user->carrier}' ,`hometown`='{$user->hometown}'  where user_id='{$user->user_id}'";
    $pdo->exec($sql);
    message($messages['success']);
    

    【讨论】:

    • 好的。我知道愚蠢的问题,但请帮助我完成最后一笔交易。好的,限制 1 stamp[0] 最终将我在另一个数组中寻找的值返回为 {"stamp":"2016-01-29"}。如何简单地提取日期?这就是我现在所需要的。 $stamp[0]->stamp..?????????
    • $stamp[0]['stamp']
    【解决方案5】:

    PHP 的 mysqli 和 PDO API 具有检测 UPDATE 是否影响任何行的功能(分别为 mysqli_affected_rows() 和 PDOStatement::rowCount()),因此您几乎可以丢弃所有代码。

    您需要做的就是更新给定用户的所有符合条件的行,例如:

    UPDATE accounts
       SET stamp = '$stamp'
         , title = '{$user->title}' 
         , radio_hanlde [SIC] ='{$user->radio_handle}' 
         , carrier  = '{$user->carrier}' 
         , hometown = '{$user->hometown}'
     WHERE user_id  = '{$user->user_id}'
       AND DATEDIFF(CURDATE(),stamp) > 10;
    

    如果 PDOStatement::rowCount() 返回的值不是 0,则打印消息 1,否则打印消息 2。

    按照以下示例,由 OP 组装...

    $pdo->exec("
    UPDATE accounts 
       SET stamp = '$stamp'
         , title = '{$user->title}'
         , radio_hanlde ='{$user->radio_handle}'
         , carrier = '{$user->carrier}'
         , hometown = '{$user->hometown}' 
     WHERE user_id = '{$user->user_id}' 
       AND DATEDIFF(CURDATE(),stamp) > 10
     "); 
    
    if (PDOStatement::rowCount() < 1 ){
         echo json_encode(array('success'=>'0','message'=>'It has been less than ten days since your latest profile change. You will have to wait!'));
     } else {
         echo json_encode(array('success'=>'1','message'=>'Your profile has been updated successfully!'));
     }
    

    【讨论】:

    • @RobertGoodrick 这看起来是正确的,但请参阅准备好的陈述。
    • 好的草莓!我正是这个意思!非常感谢
    • 是的 if (PDOStatement::rowCount() > 0 ){ echo json_encode(array('success'=>'0','message'=>'已经小于自您最近一次更改个人资料后十天。您将不得不等待!')); }else{ echo json_encode(array('success'=>'1','message'=>'您的个人资料已成功更新!')); }
    • 不知道那些可能是什么 - 也不知道为什么“ 0" 不工作的情况下工作 - 但我不是 PHP 编码员
    • 我也不是。我有一个设置了我的应用程序的 php 端,然后他就消失了。但我在事后慢慢添加了一些功能和补充。是的 > 0 会更合适。问题是在这两种情况下我都没有收到 else 回声
    猜你喜欢
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 2016-06-03
    • 1970-01-01
    • 1970-01-01
    • 2020-10-07
    • 1970-01-01
    • 2019-03-23
    相关资源
    最近更新 更多