【问题标题】:Select data within a date range using form使用表单选择日期范围内的数据
【发布时间】:2014-02-21 13:21:45
【问题描述】:

我想在 mysql 数据库中搜索在日期范围内插入的产品列表。 假设我有一个名为 product 的表,其中包含:id、name、brand 和 datecreated,我可以在 mysql 中执行此操作:

select id, name, brand, datecreated 
  from product 
 where datecreated between '2013-09-12' and '2013-10-10'
 order by datecreated desc;

这显然会在 Mysql 或 php 中返回所需的结果。

但是,我想在 select 语句中定义日期范围,并使用一个表单来询问用户的起止日期。也不确定方法是什么?

    <form action="?" method="">
        <div id="dates">
            <label for="searchdates">Enter your dates here:</label>
            <br>
            <label for="fromdate">From:<textarea id="fromdate" name="fromdate" rows="1" cols="5"></textarea></label>
            <lablel for="todate">To:<textarea id="todate" name="todate" rows="1" cols="5"></textarea></label>
        </div>
        <div><input type="submit" value="Search"/></div>
    </form>

所以我不确定如何将表单中用户定义的日期范围添加/插入到 select 语句中以返回定义的日期范围内的数据?

干杯 恶作剧

【问题讨论】:

    标签: php html mysql sql


    【解决方案1】:

    用户提交的值将以$_POST['fromdate']$_POST['todate']$_GET['fromdate']_$GET['todate'] 的形式出现,具体取决于您上面的表单方法是post 还是get(我通常建议post 以防使用 get 的特定原因,例如想要为页面添加书签)。

    因此,您处理此问题的代码可能如下所示(假设 $pdo 是您的数据库 PDO 对象):

    $fromdate = new DateTime( $_POST['fromdate'] );
    $todate   = new DateTime( $_POST['todate'] );
    
    $query = <<<SQL
      SELECT id, name, brand, datecreated
        FROM product
       WHERE datecreated BETWEEN :fromdate AND :todate
       ORDER BY datecreated desc
    SQL;
    
    $result = $pdo->prepare( $query );
    $result->execute( array(
        ":fromdate" => $fromdate->format( "Y-m-d" ),
        ":todate"   => $todate->format( "Y-m-d" );
    ));
    
    $rows = $result->fetchAll( PDO::FETCH_ASSOC ):
    

    $rows 现在包含一个数组,其中包含您的表中符合指定条件的所有行。

    【讨论】:

    • 尼克,感谢您的回复。我没有在这种特殊情况下使用 PDO,但是当我将来使用 PDO 时,您的示例将非常有用。
    • 在任何一种情况下,您都需要先正确格式化日期,然后再将其用于查询。 @danmullen 您已接受的答案仅在用户以“Y-m-d”格式提交日期时才有效,并且当他们以更常见的格式(例如“n/d/Y”)输入日期时会中断。
    【解决方案2】:

    确切的语法取决于您与数据库交互的方式(MySQLi、PDO 等)。您基本上需要获取 POSTed 表单值,进行一些简单的验证以确保用户没有输入任何危险内容,然后将值插入查询中:

    $from = mysqli_real_escape_string($_POST['fromdate']);
    $to = mysqli_real_escape_string($_POST['todate']);
    $sql = "select id, name, brand, datecreated from product where datecreated between '$from' and 
    '$to' order by datecreated desc";
    

    表单上的操作将是您放置上述代码的任何页面 - 它可能与表单相同的页面。在这种情况下,操作为&lt;?php echo basename($_SERVER['PHP_SELF']); ?&gt;,方法为POST

    【讨论】:

    • 感谢您对这个问题的回答 danmullen。现在已经解释过了,我可以看到需要什么,所以我会尝试一下。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多