PHP動(dòng)態(tài)網(wǎng)站開發(fā)項(xiàng)目教程課件 任務(wù)10 在線投票系統(tǒng)投票限制_第1頁
PHP動(dòng)態(tài)網(wǎng)站開發(fā)項(xiàng)目教程課件 任務(wù)10 在線投票系統(tǒng)投票限制_第2頁
PHP動(dòng)態(tài)網(wǎng)站開發(fā)項(xiàng)目教程課件 任務(wù)10 在線投票系統(tǒng)投票限制_第3頁
PHP動(dòng)態(tài)網(wǎng)站開發(fā)項(xiàng)目教程課件 任務(wù)10 在線投票系統(tǒng)投票限制_第4頁
PHP動(dòng)態(tài)網(wǎng)站開發(fā)項(xiàng)目教程課件 任務(wù)10 在線投票系統(tǒng)投票限制_第5頁
已閱讀5頁,還剩36頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

PHP動(dòng)態(tài)網(wǎng)站開發(fā)項(xiàng)目教程任務(wù)10在線投票系統(tǒng)投票限制子任務(wù)10.1一人一天只能給一輛車投5票10.1.1了解投票限制的常見手段

(1)IP地址限制。這是網(wǎng)上投票最常見的防刷票手段,可限制每個(gè)IP地址在一定時(shí)間內(nèi)只能投票一次。因?yàn)镮P地址很難偽造,因此可靠性較高,建議開啟。需要注意的是,如果在同一個(gè)局域網(wǎng)下(如用同一個(gè)路由器的WiFi),則可能存在不同終端IP地址相同的情況。如果使用的是手機(jī)運(yùn)營商網(wǎng)絡(luò),則一般不會(huì)有此情況。(2)設(shè)備限制。投票平臺(tái)使用Cookie等技術(shù)標(biāo)記已投過票的設(shè)備(計(jì)算機(jī)、手機(jī)等),但從技術(shù)上來說,Cookie很容易丟失和被刪除(如清空瀏覽器緩存、清空微信緩存、重啟微信等),因此該方法并不可靠,但仍建議開啟,作為額外的一道屏障。(3)圖形驗(yàn)證碼。驗(yàn)證碼要求投票者輸入或回答一些機(jī)器較難識別的圖形或問題,可有效防止作弊者利用計(jì)算機(jī)程序模擬自動(dòng)投票。(4)投票時(shí)間限制。比如,同一個(gè)用戶,限制在多少時(shí)間內(nèi),只能投一票。(5)投票對象限制。比如,同一個(gè)用戶,只能給指定個(gè)數(shù)的投票對象投票。(6)其他限制。比如限制地理位置、要求用戶使用短信驗(yàn)證碼等。10.1.2設(shè)置一人一天只能給一輛車投5票

小王同學(xué)在設(shè)計(jì)數(shù)據(jù)庫時(shí),專門設(shè)計(jì)了一張表,用于記錄投票詳情。現(xiàn)在要實(shí)現(xiàn)投票限制,就需要查詢這張數(shù)據(jù)表,了解過往的投票情況,從而判斷當(dāng)前這次投票是否滿足可投票條件。具體查詢的是投票時(shí)間為當(dāng)天,且用戶ID(userID)等于當(dāng)前登錄者的ID,車輛ID(carID)等于當(dāng)前被投票車輛ID的所有記錄。如果此記錄數(shù)小于5,則可以投票,否則不能投票。

程序思路理清楚了,完成代碼就簡單了,小王同學(xué)迅速完成了投票限制的代碼?!局R儲(chǔ)備】1.PHP中的日期函數(shù)

PHP中的date()函數(shù)可把時(shí)間戳格式化為可讀性更好的日期或時(shí)間。其語法規(guī)則及參數(shù)如下所示。stringdate(string$format[,int$timestamp])2.使用聚合函數(shù)count()實(shí)現(xiàn)投票判斷參數(shù)描述format必需。規(guī)定時(shí)間戳的格式timestamp可選。規(guī)定時(shí)間戳。默認(rèn)是當(dāng)前的日期或時(shí)間表10.1.1

date()函數(shù)的參數(shù)詳情

常用的MySQL聚合函數(shù)有以下幾個(gè)。(1)AVG()。(2)SUM()。(3)MAX()。(4)MIN()。(5)COUNT()。

其中AVG()和SUM()函數(shù)可以用于數(shù)值型字段,用于計(jì)算一組數(shù)據(jù)的“平均值”和“和”。

MIN()和MAX()函數(shù)可以用于任意數(shù)據(jù)類型的數(shù)據(jù),作用是取其最小值和最大值。

COUNT()函數(shù)可以返回表中的記錄總數(shù),適用于任意數(shù)據(jù)類型的數(shù)據(jù)。在具體使用時(shí),可以有3種寫法,分別是COUNT(列)、COUNT(*)、COUNT(1)。這3種不同的寫法在不同的數(shù)據(jù)庫存儲(chǔ)引擎下,效率會(huì)不一樣。如果使用的是MyISAM存儲(chǔ)引擎,則三者的效率相同,都是O

(1)。如果使用的是InnoDB存儲(chǔ)引擎,則三者的效率:COUNT(*)=COUNT(1)(只能說約等于)>COUNT(字段)(如果字段都非空,那么幾乎和前兩者沒有什么區(qū)別)。

GROUPBY根據(jù)BY指定的列對數(shù)據(jù)進(jìn)行分組,所謂分組,就是將一個(gè)“數(shù)據(jù)集”劃分成若干“小區(qū)域”,然后針對若干“小區(qū)域”進(jìn)行數(shù)據(jù)處理。需要強(qiáng)調(diào)的是,應(yīng)該在對行進(jìn)行分組之前應(yīng)用WHERE子句,而在對行進(jìn)行分組之后應(yīng)用HAVING子句。換句話說,WHERE子句應(yīng)用于行,HAVING子句應(yīng)用于分組。

要對組進(jìn)行排序,請?jiān)贕ROUPBY子句后添加ORDERBY子句。

GROUPBY子句中出現(xiàn)的列稱為分組列。如果分組列包含NULL值,則所有NULL值都會(huì)被匯總到一個(gè)分組中,因?yàn)镚ROUPBY子句認(rèn)為NULL值相等。子任務(wù)10.2一人一天只能給3輛車投票10.2.1分析一人一天只能給3輛車投票的邏輯

一人一天只能給3輛車投票的查詢邏輯為:在查詢時(shí),首先排除當(dāng)前車輛,然后查詢是否還給其他車輛投過票;如果查出的結(jié)果是還為其他3輛車投過票,加上當(dāng)前車輛,就有4輛車了,超過了限制的數(shù)量3;如果不排除當(dāng)前投票車輛,就會(huì)有bug;如果當(dāng)前車輛在已投過票的車輛以外,就不能再投票了;如果當(dāng)前車輛在已投過票的車輛中,就還可以繼續(xù)投票(當(dāng)然,還要看其他條件是否滿足)。10.2.2理解GROUPBY語句

SQL語句中的GROUPBY相當(dāng)于Excel中的分類匯總。GROUPBY語句根據(jù)一列或多列對結(jié)果集進(jìn)行分組。在分組列上可以使用COUNT()、SUM()、AVG()等函數(shù)。最常見的例子是學(xué)生的成績表,里面有很多行記錄,列包括姓名、科目、分?jǐn)?shù)。如果要統(tǒng)計(jì)每個(gè)人各科的總分,就需要用到GROUPBY語句。只需要在GROUPBY后面跟上姓名這一列,即可按照姓名來進(jìn)行分組,然后使用()函數(shù)可求出每個(gè)人的總分。顯然,使用AVG()就可以求出每個(gè)人的平均分。

下面用一個(gè)示例來說明GROUPBY語句的使用方法。

數(shù)據(jù)表結(jié)構(gòu)及內(nèi)容如圖10.2.1所示。其中name表示姓名,date表示最后登錄的日期,signin表示登錄的次數(shù)。圖10.2.1

示例數(shù)據(jù)表結(jié)構(gòu)及內(nèi)容

接下來使用GROUPBY語句將數(shù)據(jù)表按姓名分組,并統(tǒng)計(jì)每個(gè)人有多少條記錄,結(jié)果如圖10.2.2所示。圖10.2.2

使用GROUPBY查詢每個(gè)人的記錄數(shù)

然后將以上數(shù)據(jù)表按姓名分組,再統(tǒng)計(jì)每個(gè)人登錄的次數(shù),結(jié)果如圖10.2.3所示。WITHROLLUP可以實(shí)現(xiàn)在分組統(tǒng)計(jì)數(shù)據(jù)基礎(chǔ)上再進(jìn)行相同的統(tǒng)計(jì)(SUM()、AVG()、COUNT()等)??梢钥吹?,除了正常地按姓名匯總得到相應(yīng)的結(jié)果,還多了一個(gè)NULL行,這一行的結(jié)果是得到了所有人的登錄次數(shù)??梢允褂胏oalesce()函數(shù)來設(shè)置一個(gè)可以取代NULL的名稱,如圖10.2.4所示。圖10.2.3

使用WITHROLLUP對分組的結(jié)果再進(jìn)行運(yùn)算圖10.2.4

使用coalesce()函數(shù)轉(zhuǎn)換NULL值子任務(wù)10.3投票時(shí)間間隔10.3.1修改數(shù)據(jù)表字段類型

小王同學(xué)分析了投票時(shí)間間隔的實(shí)現(xiàn)邏輯,但他分析數(shù)據(jù)表結(jié)構(gòu)時(shí)發(fā)現(xiàn),數(shù)據(jù)表voteDetail中,投票時(shí)間字段voteTime的類型是date,也就是“年月日”這種類型,并未保存精確到秒的具體投票時(shí)間。顯然,在這種情況下是沒有辦法實(shí)現(xiàn)這個(gè)需求的。因此,需要修改數(shù)據(jù)表,將投票時(shí)間字段類型轉(zhuǎn)換成datetime類型,或者int類型(也就是時(shí)間戳),以記錄投票的詳細(xì)時(shí)間,這樣才能判斷出兩次投票的時(shí)間間隔(以s為單位)。

比如,需求是間隔1min,因此,如果數(shù)據(jù)表中voteTime字段是int類型,則只需要把上一次的數(shù)據(jù)和time()得到的數(shù)據(jù)相減,差值大于60即可以再次投票。如果數(shù)據(jù)表中voteTime字段是datetime類型,就需要使用函數(shù)UNIX_TIMESTAMP()進(jìn)行格式轉(zhuǎn)換。顯然,對于日期時(shí)間類的數(shù)據(jù),使用int類型會(huì)更加便捷。

接下來,小王同學(xué)打開數(shù)據(jù)庫,將voteDetail數(shù)據(jù)表中的voteTime字段類型修改為int類型。

由于這一列原來是日期類型,如2022-05-25,現(xiàn)在修改為int類型后,系統(tǒng)會(huì)自動(dòng)把這一列的值修改為20220525,這個(gè)值對于int類型的時(shí)間戳而言,顯然不對。因此,為了保持?jǐn)?shù)據(jù)的完整性,可以把voteDetail數(shù)據(jù)表的內(nèi)容清空,對應(yīng)地需要把carInfo數(shù)據(jù)表中的carNum列全部修改成0,這樣所有數(shù)據(jù)表的數(shù)據(jù)就能對應(yīng)上了。10.3.2判斷投票時(shí)間間隔

修改數(shù)據(jù)表后,小王同學(xué)很快就完成了投票時(shí)間間隔的限制條件實(shí)現(xiàn)。10.3.3轉(zhuǎn)換MySQL中的時(shí)間日期格式

小王同學(xué)測試了投票時(shí)間間隔功能,這個(gè)功能已經(jīng)沒有問題了。但他同時(shí)發(fā)現(xiàn)一個(gè)問題,前面完成的投票限制條件1和投票限制條件2,以及最終的投票實(shí)現(xiàn),都出現(xiàn)了問題。經(jīng)過分析,問題的產(chǎn)生是因?yàn)閯偛判薷牧藬?shù)據(jù)表中voteTime列的類型,因此,這些功能都要同步修改。

因?yàn)樵跅l件1和條件2中,只需要判斷當(dāng)天的日期,也就是只判斷到年月日,不用判斷秒,因此,需要使用一個(gè)MySQL的函數(shù)FROM_

UNIXTIME()來進(jìn)行格式轉(zhuǎn)換(即將時(shí)間戳轉(zhuǎn)換成日期格式)。

其基本語法為:FROM_UNIXTIME(unix_timestamp,format)

其中第一個(gè)參數(shù)是用于格式轉(zhuǎn)換的時(shí)間戳,第二個(gè)參數(shù)是時(shí)間戳轉(zhuǎn)換成日期后的具體格式。

常用的日期格式有以下幾種。(1)%Y:年,數(shù)字,4位。(2)%m:月,數(shù)字(01~12)。(3)%d:日,數(shù)字(01~31)。(4)%H:小時(shí),數(shù)字(00~23)。(5)%i:分鐘,數(shù)字(00~59)。(6)%s:秒(00~59)。

和FROM_UNIXTIME()函數(shù)相對應(yīng)的,還有另外一個(gè)函數(shù)UNIX_

TIMESTAMP(),其作用是把日期格式轉(zhuǎn)換成時(shí)間戳。如果這個(gè)函數(shù)未提供參數(shù),則直接返回當(dāng)前的時(shí)間戳。子任務(wù)10.4IP地址限制10.4.1編寫IP地址限制代碼

10.4.2總結(jié)MySQL中的日期和時(shí)間函數(shù)

1.日期相關(guān)(1)CURDATE()、CURRENT_DATE()、CURRENT_DATE():這3個(gè)函數(shù)的作用相同,都是用于返回當(dāng)前日期,如2022-06-01。(2)DATE(date|datetime):提取date或datetime

的日期部分。(3)DATE_ADD(date,INTERVALexpunit)、DATE_SUB(date,

INTERVALexpunit):在日期中(也可以包含時(shí)間部分)加或減“時(shí)間”。(4)ADDDATE(date[,intervalexpunit)、SUBDATE(date[...]):有第二個(gè)參數(shù)時(shí),與對應(yīng)的DATE_ADD()、DATE_SUB()函數(shù)使用方法相同。(5)DATE_DIFF(date1,date2):兩個(gè)日期相減,date1與date2可以是單獨(dú)的日期或日期與時(shí)間,但只有日期部分參與運(yùn)算。(6)DATE_FORMAT(date,format):用format格式化date,format為格式化字符串,常用的格式化標(biāo)識符有以下6個(gè)。①%Y:年,4位。②%m:月,2位(01~12)。③%d:日,2位(01~31)。④%H:小時(shí),2位,(00~23)。⑤%i:分鐘,2位(00~59)。⑥%S或%s:秒,2位(00~59)。2.時(shí)間相關(guān)

CURTIME()、CURRENT_TIME()、CURRENT_TIME():這3個(gè)函數(shù)的作用相同,都用于返回當(dāng)前時(shí)間,如21:35:20。返回值以當(dāng)前時(shí)區(qū)表示。3.日期和時(shí)間(1)NOW()、CURRENT_TIMESTAMP()、CURRENT_TIMESTAMP(),LOCALTIME()、LOCALTIME()、LOCALTIMESTAMP()、LOCALTIMESTAMP():這些函數(shù)的作用相同,都用于返回當(dāng)前日期和時(shí)間。(2)SYSDATE():真正的系統(tǒng)時(shí)間,不受MySQL的SLEEP()等函數(shù)的影響。子任務(wù)10.5使用Layui顯示驗(yàn)證碼10.5.1使用layer.open()方法

在顯示登錄和注冊頁面時(shí),小王同學(xué)使用了layer的open()方法,在參數(shù)配置中,type(基本層類型)使用的是2。layer提供了5種層類型,可傳入的值有:0(信息框,默認(rèn))、1(頁面層)、2(iframe層)、3(加載層)、4(tips層)。若采用“

layer.open({type:1})”方式調(diào)用,則type為必填項(xiàng)(信息框除外)。

在前面的項(xiàng)目制作中,小王同學(xué)使用了iframe層,也就是在彈出的窗口中直接顯示一個(gè)完整的頁面內(nèi)容。在這里,需求變更為,單擊車輛進(jìn)行投票,然后顯示驗(yàn)證碼,再跳轉(zhuǎn)至vote.php頁面進(jìn)行投票。因此,在這里需要使用類型1,也就是頁面層。在頁面層中顯示一個(gè)表單,在該表單中顯示驗(yàn)證碼,輸入驗(yàn)證碼后,單擊“提交”按鈕,跳轉(zhuǎn)至vote.php頁面,完成投票,然后返回首頁并刷新頁面。10.5.2在彈窗中顯示驗(yàn)證碼

圖10.5.1所示為添加了彈窗顯示驗(yàn)證碼的效果。圖10.5.1

彈窗顯示驗(yàn)證碼

前端有了驗(yàn)證碼,在后端就要對驗(yàn)證碼進(jìn)行判斷,這一部分內(nèi)容和前面做過的判斷驗(yàn)證碼是否正確相似。

如果驗(yàn)證碼錯(cuò)誤,則直接彈窗提示錯(cuò)誤,并中止后面程序的執(zhí)行。如果驗(yàn)證碼正確,則繼續(xù)進(jìn)行投票條

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論