大數(shù)據(jù)報(bào)表查詢(xún)條件的使用方式有哪些,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。
創(chuàng)新互聯(lián)是一家專(zhuān)注于成都網(wǎng)站制作、做網(wǎng)站、外貿(mào)營(yíng)銷(xiāo)網(wǎng)站建設(shè)與策劃設(shè)計(jì),田陽(yáng)網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)做網(wǎng)站,專(zhuān)注于網(wǎng)站建設(shè)十載,網(wǎng)設(shè)計(jì)領(lǐng)域的專(zhuān)業(yè)建站公司;建站業(yè)務(wù)涵蓋:田陽(yáng)等地區(qū)。田陽(yáng)做網(wǎng)站價(jià)格咨詢(xún):18982081108
眾所周知,大拿們?cè)谠O(shè)計(jì)報(bào)表的時(shí)候,需要展現(xiàn)的數(shù)據(jù)很少是固定不變地,經(jīng)常需要使用查詢(xún)條件過(guò)濾出我們想要的數(shù)據(jù)。簡(jiǎn)而言之就是,同一張報(bào)表可以在不同的參數(shù)控制下呈現(xiàn)出不同的數(shù)據(jù)。
那么問(wèn)題來(lái)了,報(bào)表工具一般都用哪些方法來(lái)實(shí)現(xiàn)這一需求呢?
首先當(dāng)然必須是說(shuō) SQL, 正常情況下不同的過(guò)濾條件會(huì)對(duì)應(yīng)著取數(shù) SQL 中不同的 WHERE 條件,而報(bào)表工具能將報(bào)表參數(shù)對(duì)應(yīng)成 SQL 的參數(shù),這樣一來(lái),輸入不同報(bào)表參數(shù)時(shí)就會(huì)產(chǎn)生不同的 SQL。
假如我們要做一個(gè)有查詢(xún)條件的報(bào)表,拿訂購(gòu)日期作為檢索條件,查詢(xún)不同日期區(qū)間下訂單信息表中的數(shù)據(jù)。其中的數(shù)據(jù)列包括:訂單 ID, 客戶(hù) ID, 訂購(gòu)日期, 發(fā)貨日期, 運(yùn)貨商, 貨主名稱(chēng), 貨主地區(qū), 訂單金額。
Follow me,我們拿潤(rùn)乾報(bào)表來(lái)做個(gè)例子,首先設(shè)置兩個(gè)參數(shù),取名為 startdate 與 enddate:
然后這個(gè)報(bào)表的取數(shù) SQL 要寫(xiě)成含有參數(shù)的形式,SQL 語(yǔ)句中使用“?”(英文問(wèn)號(hào))表示參數(shù):
select 訂單 ID, 客戶(hù) ID, 訂購(gòu)日期, 發(fā)貨日期, 運(yùn)貨商, 貨主名稱(chēng), 貨主地區(qū), 訂單金額 from 訂單信息表 where 訂購(gòu)日期 >? and 訂購(gòu)日期 <?
然后要配置 SQL 參數(shù)與報(bào)表參數(shù)的對(duì)應(yīng),即將 SQL 語(yǔ)句中每個(gè)“?”翻譯成對(duì)應(yīng)的報(bào)表參數(shù)。
配置完成后用戶(hù)只需要通過(guò)設(shè)置不同的報(bào)表參數(shù),就可以獲取不同的數(shù)據(jù)了。例如查詢(xún) 2014 年 1 月 1 號(hào)到 2014 年 1 月 8 號(hào)之間的訂單信息,那么設(shè)置參數(shù) startdate 值為 2014-01-01,參數(shù) enddate 值為 2014-01-08,查詢(xún)結(jié)果如下:
有時(shí)候我們希望某個(gè)參數(shù)不輸入時(shí)報(bào)表可以聰明地理解為忽略該參數(shù),比如上例中沒(méi)有輸入 enddate 時(shí)報(bào)表可以默默地查出從某個(gè)起始日期之后的所有訂單。那需要怎么做呢?
這種情況下可以把沒(méi)有輸入的參數(shù)認(rèn)為是取值為空的參數(shù),我們只需要修改一下上面的 SQL 語(yǔ)句,增加對(duì)空值的判斷即可:
select 訂單 ID, 客戶(hù) ID, 訂購(gòu)日期, 發(fā)貨日期, 運(yùn)貨商, 貨主名稱(chēng), 貨主地區(qū), 訂單金額 from 訂單信息表 where (? is null or 訂購(gòu)日期 >?) and (? is null or 訂購(gòu)日期 <?)
這樣,當(dāng)參數(shù)值為空時(shí)就相當(dāng)于被忽略了。
相應(yīng)地,SQL 參數(shù)與報(bào)表參數(shù)的對(duì)應(yīng)也要修改,這兩個(gè)參數(shù)在 SQL 中分別使用了兩次,各自對(duì)應(yīng)了兩個(gè)問(wèn)號(hào):
這時(shí)候要查詢(xún) 2015 年 1 月 1 號(hào)之后、結(jié)束日期不限制的數(shù)據(jù),將參數(shù) startdate 設(shè)置為 2015-01-01,參數(shù) enddate 為 null 就可以了,
查詢(xún)結(jié)果如下:
從上例可以看到,使用參數(shù)時(shí)要事先知道取數(shù) SQL 中哪些字段可作為查詢(xún)條件。但有時(shí)候可用于做查詢(xún)條件的字段非常多,比如針對(duì)一個(gè)訂貨信息表來(lái)說(shuō),還可能按客戶(hù) ID、按地區(qū)、按運(yùn)貨商等各種條件查詢(xún)。如果使用上述參數(shù)的方式,就需要設(shè)置很多的參數(shù),取數(shù) SQL 語(yǔ)句也很長(zhǎng),使用和維護(hù)都比較麻煩。如果實(shí)現(xiàn)按任意字段查詢(xún)的話,無(wú)疑會(huì)方便許多。
有些報(bào)表工具提供了宏表達(dá)式,可以更靈活地解決這個(gè)問(wèn)題。仍然以潤(rùn)乾報(bào)表為例說(shuō)明:
首先在報(bào)表中定義一個(gè)字符串參數(shù),比如名稱(chēng)為 search。然后在取數(shù) SQL 中使用宏表達(dá)式引用這個(gè)參數(shù):
select 訂單 ID, 客戶(hù) ID, 訂購(gòu)日期, 發(fā)貨日期, 運(yùn)貨商, 貨主名稱(chēng), 貨主地區(qū), 訂單金額 from 訂單信息表 where ${search}
其中 ${search} 的意思就是會(huì)將 search 的內(nèi)容拼接到 SQL 的相應(yīng)位置得到一句可執(zhí)行的 SQL 語(yǔ)句。這種寫(xiě)法即稱(chēng)為宏表達(dá)式(下面討論時(shí)就簡(jiǎn)稱(chēng)宏)。
現(xiàn)在給報(bào)表傳遞不同的參數(shù)值就可以得到不同的數(shù)據(jù)了。例如要查詢(xún)訂單日期為 2014 年 1 月 1 號(hào)到 2014 年 1 月 8 號(hào)且貨主地區(qū)為華北的訂單信息,那么設(shè)置 search 的值為:
訂購(gòu)日期 >’2014-01-01′ and 訂購(gòu)日期 <‘2014-01-08′ and 貨主地區(qū) =’華北’
查詢(xún)結(jié)果如下:
從上可以看出利用宏可以在報(bào)表中輕易替換 SQL 語(yǔ)句的部分甚至全部,不同參數(shù)值,在報(bào)表中可以計(jì)算出不同的表達(dá)式結(jié)果,從而得到不同的報(bào)表信息,這樣面對(duì)大量不同類(lèi)型的報(bào)表,用戶(hù)再也不用每次都做單獨(dú)的設(shè)計(jì)和維護(hù)了,大大減輕了工作量,釋放了勞動(dòng)力。
既然利用宏可以在報(bào)表中動(dòng)態(tài)替換 SQL 語(yǔ)句的部分甚至全部,而且顯然使用宏比 SQL 參數(shù)更靈活,另外參數(shù)能做到的事情用宏都能做到,那么報(bào)表工具還有必要提供 SQL 參數(shù)機(jī)制嗎?是不是只要有宏就夠了?
事實(shí)上并沒(méi)有這么簡(jiǎn)單。宏只是簡(jiǎn)單地替換 SQL 語(yǔ)句的部分,要保證最后的語(yǔ)句合法,有時(shí)在生成參數(shù)字符串會(huì)有麻煩。數(shù)值等簡(jiǎn)單數(shù)據(jù)類(lèi)型可以直接拼進(jìn) SQL,而字符串常數(shù)就需要加上引號(hào)才可以,萬(wàn)一這個(gè)常數(shù)中本身已經(jīng)有引號(hào),則還需要先進(jìn)行轉(zhuǎn)義動(dòng)作,而不同數(shù)據(jù)庫(kù)的規(guī)則又并不完全一樣,這就會(huì)影響報(bào)表的兼容性。
日期類(lèi)型參數(shù)是最常出現(xiàn)這種麻煩的情況,例如查詢(xún)訂購(gòu)日期為 2014-12-01 號(hào)的訂單信息,如果使用 Oracle 數(shù)據(jù)庫(kù),那么宏值寫(xiě)法是:
訂購(gòu)日期 =TO_DATE(‘2014-12-01′,’yyyy-mm-dd’)
如果使用 MySQL 數(shù)據(jù)庫(kù),那么宏值寫(xiě)法為:
訂購(gòu)日期 = DATE_FORMAT(‘2014-12-01′,’yyyy-mm-dd’)
使用 SQL 參數(shù)就沒(méi)有這個(gè)問(wèn)題,數(shù)據(jù)庫(kù)接口能直接識(shí)別各種數(shù)據(jù)類(lèi)型的參數(shù), 直接傳入?yún)?shù)值即可,沒(méi)必要再做這種拼串動(dòng)作,也就不存在兼容性的問(wèn)題了。
使用宏還存在安全風(fēng)險(xiǎn),WEB 中使用報(bào)表時(shí),參數(shù)可能是網(wǎng)頁(yè)生成并傳到后臺(tái)的,而網(wǎng)頁(yè)有可能是被黑客攻擊改寫(xiě)的,那么就有可能將惡意的參數(shù)值傳到后臺(tái)拼入 SQL 語(yǔ)句,欺騙服務(wù)器執(zhí)行惡意 SQL 命令。這就是我們常說(shuō)的 SQL 植入風(fēng)險(xiǎn)。
比如,在前面的宏表達(dá)式示例中,如果有人將 search 值改寫(xiě)成:
1=1 UNION SELECT userid,password,null,… FROM user
那么就可能造成關(guān)鍵信息泄露。解決這個(gè)問(wèn)題并不很簡(jiǎn)單,把原始 SQL 改寫(xiě)成這樣
select … where (${search})
看起來(lái)是可以擋住上面那種攻擊了,但仍然可以設(shè)計(jì)出新的植入串攻擊(讀者有興趣可以作為一個(gè)練習(xí)題來(lái)試試),要改成為這種很麻煩的樣子才行:
select…from…where(${search}) and ${search}
顯然,這種語(yǔ)句需要有強(qiáng)烈安全意識(shí)的老司機(jī)才能做到,而一般報(bào)表開(kāi)發(fā)人員這方面相對(duì)會(huì)弱一些。所以宏不能亂用,能不用則不用。而使用 SQL 參數(shù)就沒(méi)有這個(gè)風(fēng)險(xiǎn),雖然參數(shù)沒(méi)有宏靈活,但顯然安全性對(duì)報(bào)表工具是必不可少的。個(gè)別報(bào)表工具為了省事只提供宏實(shí)現(xiàn)查詢(xún)條件,看起來(lái)是靈活了,但其實(shí)是相當(dāng)不負(fù)責(zé)任的做法,在選擇報(bào)表工具時(shí)一定要注意。
以上面的業(yè)務(wù)場(chǎng)景為例,實(shí)現(xiàn)步驟如下:
在報(bào)表中定義一個(gè)宏命名為:search,數(shù)據(jù)集 SQL 為:
select 訂單 ID, 客戶(hù) ID, 訂購(gòu)日期, 發(fā)貨日期, 運(yùn)貨商, 貨主名稱(chēng), 貨主地區(qū), 訂單金額 from 訂單信息表 where ${search}
在【安裝目錄】\esProc\config\raqsoftConfig.xml 文件中的 disallowedParamWordList 屬性里配置禁用字符串,配置多個(gè)字符串時(shí)使用逗號(hào)分隔,例如
<property name=”disallowedParamWordList” value=”union, user”/>
將會(huì)在參數(shù)中禁用“union”與“user”,即含有這些串的參數(shù)將被拒絕。
用 tag 標(biāo)簽 paramCheck 來(lái)控制報(bào)表是否要做此校驗(yàn),paramCheck=”yes”表示接受校驗(yàn),paramCheck=”no”表示不作校驗(yàn),不配置該標(biāo)簽時(shí)默認(rèn)為接受校驗(yàn)。這樣,不是所有報(bào)表都一定會(huì)被檢查,有些可以確認(rèn)安全的報(bào)表就不必再檢查以獲得靈活性。
這些都完成后,在 web 端瀏覽報(bào)表時(shí),用戶(hù)輸入的檢索條件會(huì)在報(bào)表參數(shù)校驗(yàn)通過(guò)后才傳遞給報(bào)表,最終拼接到數(shù)據(jù)集 SQL 中,不合法的參數(shù)值將被拒絕,從而避免了上例中 SQL 植入的風(fēng)險(xiǎn)。
看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對(duì)創(chuàng)新互聯(lián)的支持。
網(wǎng)站名稱(chēng):大數(shù)據(jù)報(bào)表查詢(xún)條件的使用方式有哪些
分享網(wǎng)址:http://m.newbst.com/article26/pepdjg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)、建站公司、手機(jī)網(wǎng)站建設(shè)、定制開(kāi)發(fā)、網(wǎng)站維護(hù)、ChatGPT
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)