首页 文章

ORDER_BY日期限制1 [重复]

提问于
浏览
-2

这个问题在这里已有答案:

我有一个名为notify的表(寻找者,捐赠者,日期)列

类型(日期时间)的日期列,它存储以下格式YYYY-MM-DD HH:MM:SS

我正在尝试从通知表中选择最新日期的1条记录,然后将日期与当前日期进行比较,并计算两个日期之间的天数 .

<?php

session_start();
$email = $_GET['email'];
date_default_timezone_set('Asia/Riyadh');
$time = date("Y-m-d H:i:s");

$note = "SELECT * FROM notify WHERE seeker='".$_SESSION['email']."'AND donor='".$email."' ORDER_BY `date` DESC LIMIT 1";
$st = $conn->prepare($note);
$st->execute();

if($found = $st->fetch(PDO::FETCH_ASSOC)){
    $now = $time;
    $old_date = strtotime($found['date']);
    $dateif = $now - $old_date;

    if(floor($dateif/(60*60*24)) >= 7){
    echo "the difference between tow dates is 7 days or more";
    } else { echo "difference between tow dates is less than 7 days";}
}
?>

代码不起作用!
我的通知表中只有一条记录,其日期为2013-04-22 09:15:47

8 回答

  • 4

    首先,您应该使用这样的预准备语句:

    $note = "SELECT * 
        FROM notify 
        WHERE seeker=:seeker AND donor=:donor 
        ORDER BY `date` DESC
        LIMIT 1";
    
    $st = $conn->prepare($note);
    $st->execute(array(
        ':seeker' => $_SESSION['email'],
        ':donor' => $email,
    );
    

    如果没有占位符,你仍然可以使用SQL注入 .

    其次,您不能以这种方式将字符串与整数进行比较:

    $now = $time; // string
    $old_date = strtotime($found['date']); // integer
    $dateif = $now - $old_date; // dunno?
    

    你应该把苹果和苹果比较:

    $seven_days_ago = strtotime('-7 days');
    $old_date = strtotime($found['date']);
    
    if ($old_date > $seven_days_ago) {
        echo "difference between tow dates is less than 7 days";
    } else {
        echo "the difference between tow dates is 7 days or more";
    }
    
  • 0

    由于你的 date 列没有按顺序排序 . 此外,在 $_SESSION['email'] 不受保护的情况下,您将接触到SQL注入 .

    因此,正确的形式是使用预备语句,以及右列的顺序 . (假设PDO,你也可以使用mysqli):

    /** @var PDO $pdo - Assuming a PDO connection. */
    $query = "SELECT * FROM `user` WHERE `ID` = :email ORDER BY `time` DESC";
    $stmt = $pdo->prepare($query);
    $stmt->execute(array($_SESSION['email']));
    
    $result = $stmt->fetchAll(PDO::FETCH_ASSOC); //Get all results in an associated array form.
    
  • 0

    Jack的答案向您展示了如何正确使用预准备语句 . 以下是使用 DATEDIFF() 简化日期计算的代码 .

    $note = "SELECT *, DATEDIFF(NOW(), `date`) AS date_diff
             FROM notify 
             WHERE seeker=:seeker AND donor=:donor
             ORDER_BY `date` DESC
             LIMIT 1";
    
    $st = $conn->prepare($note);
    $st->execute(array(
        ':seeker' => $_SESSION['email'],
        ':donor' => $email,
    );
    
    $row = $st->fetch(PDO::FETCH_ASSOC);
    // do something with $row
    
  • 1

    如果你正在将任何变量附加到字符串然后你需要使用点和oder将它们连接起来将在where条件之后和$ _SESSION里面你错过了引号

    $query = "SELECT * FROM user WHERE ID='".$_SESSION['email']."' ORDER_BY date, time";
    
  • 0

    要从数据库中检索最新日期,请尝试执行以下sql查询

    $query="SELECT * FROM user WHERE ID='".mysql_real_escape_string($_SESSION[email])."' ORDER_BY date,time desc limit 1";
    
  • 1

    要检索最新日期,您需要按降序对日期字段进行排序

    $note = "SELECT * FROM notify WHERE seeker=' ".$_SESSION['email']. " ' AND donor=' ".$email." ' ORDER_BY date DESC LIMIT 1";
    
  • 0

    你试着通过desc订购吗?如下图所示:

    $note = "SELECT * FROM notify 
               WHERE
               seeker=' ".$_SESSION['email']. " ' 
               AND
               donor=' ".$email." ' ORDER_BY date DESC LIMIT 1";
    
  • 0

    你忘了这里约会 . date是mysql中的保留字,

    如果你想把它作为列名称放在它周围 .

    编辑

    你也有额外的空间删除它

    $note = "SELECT * FROM notify WHERE seeker='".$_SESSION['email']. "' 
    AND donor='".$email."' ORDER_BY `date` LIMIT 1";
    

相关问题