【问题标题】:Need help with a MySQL/PHP query involving date ranges在涉及日期范围的 MySQL/PHP 查询方面需要帮助
【发布时间】:2009-10-02 14:34:19
【问题描述】:

基本上我需要从 dbase 表中检索一些帐户信息,其中他们有一个已通过 GET 传递的客户端的客户端,并且帐户放置日期(dateplaced)再次介于从日历字段传递的开始日期和结束日期之间通过 GET。

下面的查询不返回任何行。我已经验证查询的 SELECT 和 FROM 部分按预期工作,并且客户端从 GET 中选择工作正常,因此留下了日期问题。 “dateplaced”作为“dd/mm/yyyy”格式的varchar存储在数据库中。经过研究,我发现 mysql 需要“yyyy-mm-dd”格式的日期。我已经将 GET 数据的比较的两部分拼凑在一起,并且相当确定它们的格式正确。我只是简单地尝试使用“dateplaced”而不是 str_to_date(),但它不起作用,所以我尝试了 str_to_date(),如下所示,但它仍然不起作用。

谁能在这里发现我的问题?这让我发疯了。

$query = mysql_query("SELECT accountnumber, firstname, middlename, lastname, currentbalance FROM dbase WHERE clientname = '" . $_GET['client'] . "' AND str_to_date(dateplaced, '%Y-%m-%d') BETWEEN '" . $_GET['calendar_start_year'] . "-" . $_GET['calendar_start_month'] . "-" . $_GET['calendar_start_day'] . "' AND '" . $_GET['calendar_end_year'] . "-" . $_GET['calendar_end_month'] . "-" . $_GET['calendar_end_day'] . "' ORDER BY lastname") or die(mysql_error());

【问题讨论】:

    标签: php mysql datetime date-range date-comparison


    【解决方案1】:

    str_to_date() 采用现有字符串的格式,而不是所需字符串的格式。所以你需要 str_to_date(dateplaced, '%d/%m/%Y') 获取 Y-m-d。

    在查询之外创建日期。更容易调试。

    $clean_name=mysqli_real_escape_string($_GET['client']);
    $start_date=date_create("{$_GET['calendar_start_year']}-{$_GET['calendar_start_month']}-{$_GET['calendar_start_day']}")->format('Y-m-d');
    $end_date=date_create("{$_GET['calendar_end_year']}-{$_GET['calendar_end_month']}-{$_GET['calendar_end_day']}")->format('Y-m-d');
    
    $q="SELECT accountnumber, firstname, middlename, lastname, currentbalance 
    FROM dbase 
    WHERE clientname = '{$clean_name}' 
      AND str_to_date(dateplaced, '%d/%m/%Y') BETWEEN '$start_date' AND '$end_date' 
    ORDER BY lastname;
    

    PS,清理所有变量。可能有引号或其他字符需要转义(或恶意黑客尝试)。 mysqli_real_escape_string() 是你应该使用的。

    【讨论】:

    • 谢谢!这个问题的两个答案都解决了我的问题!我无法将两者都标记为已接受,所以我从第一个开始就打这个。
    【解决方案2】:

    首先,通过在将用户变量插入查询之前不对其进行转义,您对 SQL 注入持开放态度(请参阅mysql_real_escape_string)。

    您的查询不起作用的原因是因为STR_TO_DATE 的第二个参数需要您的源字符串的格式,而不是您尝试转换的格式。

    // extract variables
    $client = $_GET['client'];
    
    $startYear = $_GET['calendar_start_year'];
    $startMonth = $_GET['calendar_start_month'];
    $startDay = $_GET['calendar_start_day'];
    
    $endYear = $_GET['calendar_end_year'];
    $endMonth = $_GET['calendar_end_month'];
    $endDay = $_GET['calendar_end_day'] ;
    
    // parse variables
    $startDate = mktime(0, 0, 0, $startMonth, $startDay, $startYear);
    $endDate = mktime(0, 0, 0, $endMonth, $endDay, $endYear);
    
    // query database
    $sql = sprintf(
       "SELECT accountnumber,
               firstname,
               middlename,
               lastname,
               currentbalance
        FROM dbase
        WHERE clientname = '%s'
        AND STR_TO_DATE(dateplaced, '%d/%m/%Y') BETWEEN '%s' AND '%s'
        ORDER BY lastname",
        mysql_real_escape_string($client),
        date('Y-m-d', $startDate),
        date('Y-m-d', $endDate));
    
    $result = mysql_query($sql) or die(mysql_error());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多