2012-11-09 70 views
1

我需要在MySQL中進行查詢。 但是,查詢需要用用戶選擇的選項進行dinamically。使用選項構建查詢

選項爲日, & SellerID

用戶將選擇是否要查看賣家的銷售歷史,天,月和年。

但是,讓我們假設他想看到所有的銷售2012年3月。他將離開日在空白並接受03月01日所有的銷售,直到3月31日......

,也許他離開選項空白,並設置天= 15年份= 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... 
+0

我很感激你有*一些*錯誤檢查。不過,我鼓勵你考慮[SQL注入](http://php.net/manual/en/security.database.sql-injection.php)和[Prepared Statements](http://php.net/manual/) EN/mysqli.quickstart.prepared-statements.php)。 –

+0

因此,您正在使用每個參數的下拉菜單?不是日曆小部件?反思用戶界面有些人可能會更容易。 Sane默認和一個好的界面可能允許你想要的,而不必在控制器上編寫這麼多的邏輯。 – ficuscr

+0

感謝您指出SQL注入賈森,我知道它的存在,但我的系統將只用於授權人員,他們不會搞砸自己的數據庫 – BernaMariano

回答

3

你可以預處理使用前值:

$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 
); 
+0

'between'函數阻止它處理我的第二個示例,但它是比'IF'更好,我會用它,謝謝 – BernaMariano

+0

如果他將'Month'留空,只設置'Day'和'Year',他會從整年的銷售記錄中獲得,而bot只是每月所需的一天。 @rid – BernaMariano

+0

@BernaMariano,'BETWEEN x AND y'類似於... ...> = x AND ... <= y'. The '> =/<='版本應該也一樣。 – rid

0

RESTRICT分揀有關年,月,日期格式或月,年月格式或年份格式,意味着層級的排序和對於您需要在這裏手柄3案件只會工作在兩個WHERE子句日期> = DYNAMIC_START_DATE和日期< = DYNAMIC_END_DATE(您也可以使用BETWEEN這裏)

  • 如果僅給出年份​​,那麼您應該將開始日期設置爲第1年1月和結束日期作爲第31年12月
  • 如果給出月和年,則應將開始日期設置爲第1個月年和結束日期爲[2830/31]個月年份
  • 如果僅給出日期和月份AND年,那麼您應該將開始日期設置爲日期月份年份和結束日期爲日期月份年份。