【问题标题】:Building a query with options使用选项构建查询
【发布时间】:2012-11-09 19:21:28
【问题描述】:

我需要在 MySQL 中进行查询。 但是查询需要使用用户选择的选项进行动态查询。

选项有 DayMonthYearSellerID

用户将选择是否要按天、月和年查看卖家的销售历史记录。

但是,假设他想查看 2012 年 3 月的所有销售额。他会将 Day 留空,并收到从 3 月 1 日到 3 月 31 日的所有销售额...

也许他将选项Month留空,并设置Day=15Year=2012,他会得到销售历史从 2012 年全年开始,仅限每月 15 日。

我的程序需要构建一个查询,准确涵盖他想要查看的内容。

问题是:
我真的需要在我的代码中使用数千个 IF 吗?难道没有更好的方法吗?

if( ($day==0) && ($month==0) && ($year>0) ){

    $query.="`date`>='{$year}-01-01' AND `date`<='{$year}-12-31'";

}elseif( ($day==0) && ($month>0) && ($year>0) ){

    $query.="`date`>='{$year}-{$month}-01' AND `date`<='{$year}-{$month}-31'";

}elseif{

etc...

【问题讨论】:

  • 感谢您进行一些错误检查。不过,我建议您考虑SQL InjectionPrepared Statements
  • 所以您对每个参数都使用了下拉菜单?不是日历小部件?重新考虑一些 UI 可能也会使这更容易。合理的默认设置和良好的界面可能会满足您的需求,而无需在控制器上编写如此多的逻辑。
  • 感谢Jason指出SQL注入,我知道它的存在,但我的系统仅供授权人员使用,他们不会搞砸自己的数据库

标签: php mysql


【解决方案1】:

您可以在使用这些值之前对其进行预处理:

$year  = $year  > 0 ? (int) $year  : 2012;
$month = $month > 0 ? (int) $month : 1;
$day   = $day   > 0 ? (int) $day   : 1;

$query .= sprintf("`date` BETWEEN '%4d-%2d-%2d' AND '%4d-%2d-%2d'",
    $year, $month, $day,
    $year, $month, 31
);

【讨论】:

  • between 函数阻止它处理我的第二个示例,但它比 IF 好得多,我会使用它,谢谢
  • 如果他将Month 留为空白,并且只设置DayYear,他将获得全年的销售历史记录,机器人只是每个月的所需日期。 @rid
  • @BernaMariano,BETWEEN x AND y 类似于 ... &gt;= x AND ... &lt;= y&gt;= / &lt;= 版本应该也能正常工作。
  • 是的,我会使用你的答案,在这种情况下,我会使用IFprint 只在所需的一天...再次感谢
  • @BernaMariano,当然,如果您需要特殊情况,您可以更改此逻辑。主要思想是您可以更轻松地构建查询之前完成此操作。进入查询后,这些值已经正确填充,您可以继续填写它们。
【解决方案2】:

RESTRICT SORTING ON YEAR、MONTH、DATE 格式或 MONTH、Year Month 格式或 Year 格式,意味着在层次结构中分级排序,为此您需要在此处处理 3 种情况,这些情况仅适用于两个 WHERE 子句 DATE>=DYNAMIC_START_DATE AND DATE

  • 如果只给出年份,则应将开始日期设置为 1 月 1 日,结束日期设置为 12 月 31 日
  • 如果给出了月份和年份,那么您应该将开始日期设置为年份的第 1 个月,结束日期设置为 [2830/31] 月份年份
  • 如果只给出日期和月份和年份,那么您应该将开始日期设置为日期月份年份,并将结束日期设置为日期月份年份。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-11
    • 1970-01-01
    • 1970-01-01
    • 2011-12-18
    • 2022-08-14
    • 2021-06-05
    • 2022-06-28
    相关资源
    最近更新 更多