【问题标题】:how to get events from data base depending on month selected如何根据所选月份从数据库中获取事件
【发布时间】:2016-06-10 18:25:04
【问题描述】:

我的数据库中存储的事件格式为 2016-12-05,即 2016 年 12 月 5 日。

我正在使用 HTML 5 月份选择器,因此用户可以查看特定月份的所有事件。

我的问题是如何编辑 sql 以便它能够识别如果他们选择了 2016 年 12 月,则应该选择上述日期。

HTLM 代码:

    <form method="post" name="Month" id="Month">
    <input type="month" name="month" id="month"/>
    <input type="submit" value="Select"/>

PHP 代码:

    $month = $_POST['month'];
    if (isset($_POST['month'])){
        $sql = "SELECT * FROM training WHERE groupName='$group' && sessDate='$month' ORDER BY sessdate ASC";
    $training_query = mysqli_query($db_conx, $sql);
    }

如果我去掉月份选择器的东西,一切正常,$group 会在页面上方建立。 sessDate 在数据库中存储为date。

如果我将其全部删除,它会显示曾经创建的每个事件。

我想我可能需要使用 ajax 或其他东西,因为当我点击选择页面时,显然会刷新并且月份选择器再次为空。我对 ajax 和 java 脚本的了解很差,所以任何帮助都将不胜感激。

【问题讨论】:

  • 你能写出数据库模式吗? sessDate 是什么类型?
  • 对不起@devlincarnate 我不确定我是否理解您链接中的答案。是否意味着它将在页面刷新时存储/绑定月份/参数?
  • @dyer926 - 您应该使用准备好的语句和参数绑定。其他任何东西都容易受到 SQL 注入的攻击。

标签: javascript php jquery ajax mysqli


【解决方案1】:

尝试使用prepared statements 而不是将变量传递给查询。如果 $month 是数字(例如 11)或月份名称(11 月),则需要在查询中使用 MONTH() 或 MONTHNAME()。例如SELECT * FROM training WHERE...MONTHNAME(sessDate)=...。

【讨论】:

    【解决方案2】:

    这个脚本已经有了更好的日子。这里有几件事: 在您的 html 代码中,您共享元素的 ID 和名称。不好。 在验证它是否已设置之前,您正在分配 $month。 您说您的日期存储为“Y-m-d”,但在您的查询中,您似乎只是在搜索一个月

    假设 $sessDate 应格式化为 Y-m-d 以匹配您在数据库中的内容

          <?php
             $date = new DateTime()//get current Date
             $bottomDate = $date->format('Y').$sessDate.'01 00:00:00'; //Set to absolute beginning of month 
             $topDate = $date->format('Y').$sessDate.'31 23:59:59'; //Set to absolute end of month, with no month having more than 31 days
             $sql = "SELECT * FROM training WHERE groupName='$group' && sessdate >= '$bottomDate' AND sessdate <= '$topDate' ORDER BY sessdate ASC";
    
    
           ?>
    

    【讨论】:

      【解决方案3】:

      如果您在浏览器控制台上检查月份元素;

      document.getElementById("month").value
      

      它应该给你类似'2016-06'的东西。所以你让你过滤记录

      "SELECT * FROM training WHERE groupName='$group' && sessDate='".substr($month,0,7) ."' ORDER BY sessdate ASC
      

      【讨论】:

      • 这是完全不安全的,永远不应该这样做。
      • 确实如此。但是 OP 要求的不是如何保护应用程序,而是启用它。甚至问题中的代码也同样不安全。
      • 您可以提供一个带有准备好的语句和参数绑定的解决方案。你没有。相反,您建议使用一种最不安全的方法向数据库查询添加参数。
      • 不,除了他要求的,我没有提供任何东西,他的代码已经有一个连接查询,我还提供了一个连接查询的解决方案。这个问题与此无关!解决方案是否应该比他们要求的更多地帮助 OP?我可以理解可以做到这一点,但是所有答案都有这个义务吗?
      • 是的。所有答案都有义务不盲目地延续核扩散。
      猜你喜欢
      • 1970-01-01
      • 2014-05-22
      • 2017-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-11
      相关资源
      最近更新 更多