亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Mysql入門系列:運(yùn)行PHP

瀏覽:9日期:2024-07-07 14:13:58
;;;;在本章的剩余部分中,將解決我們?cè)诘?章中為自己定下的目標(biāo):對(duì)于學(xué)分保存方案,需要編寫一個(gè)允許我們輸入、編輯測(cè)試和測(cè)驗(yàn)分?jǐn)?shù)的腳本。對(duì)于歷史同盟,需要開(kāi)發(fā)一個(gè)有關(guān)美國(guó)總統(tǒng)的聯(lián)機(jī)測(cè)驗(yàn),使之成為交互式的,以便不做任何事情就可以為這個(gè)Web 站點(diǎn)的訪問(wèn)者產(chǎn)生試題。我們也想允許歷史同盟成員聯(lián)機(jī)編輯它們的目錄項(xiàng),使信息維持最新并減少我們自己編輯項(xiàng)的數(shù)量。每個(gè)腳本都產(chǎn)生多個(gè)Web 頁(yè)面,并依靠在創(chuàng)建頁(yè)面中嵌入的信息來(lái)在腳本的調(diào)用之間進(jìn)行通信。輸入學(xué)生分?jǐn)?shù)在本節(jié)中,我們將把注意力轉(zhuǎn)向?qū)W分保存方案。我們Web 站點(diǎn)上的這個(gè)區(qū)域的URL 是http://pit-viper.snake.net/gp/,應(yīng)該為它編寫一個(gè)簡(jiǎn)短的主頁(yè)i n d e x . p h p,下面的頁(yè)面就正在做這件事。它包括了與第7 章編寫的score_browser 腳本的連接,因?yàn)檫@個(gè)腳本適合于學(xué)分保存方案。Mysql入門系列:運(yùn)行PHP現(xiàn)在讓我們考慮如何設(shè)計(jì)和實(shí)現(xiàn)腳本score _ e n t r y. p h p,它將讓我們輸入一組新的測(cè)試或測(cè)驗(yàn)分?jǐn)?shù),或者修改一組已經(jīng)存在的分?jǐn)?shù)。后者的性能對(duì)于處理由于生病或者其他原因缺席(或者,放棄這個(gè)想法以免輸入分?jǐn)?shù)失敗)造成考試或測(cè)驗(yàn)比其他學(xué)生晚的學(xué)生的分?jǐn)?shù)是必要的。分?jǐn)?shù)項(xiàng)腳本的概要是這樣的:1) 最初的頁(yè)面代表一系列已知的登記事件,并允許選擇一個(gè)事件或者指定應(yīng)該創(chuàng)建的新事件。2) 如果選擇創(chuàng)建一個(gè)新事件,腳本就給出允許指定日期和事件類型的頁(yè)面。創(chuàng)建這個(gè)事件記錄之后,腳本重新顯示事件列表頁(yè)面來(lái)顯示這個(gè)新事件。3) 當(dāng)選擇了事件后,腳本給出在頂部(事件ID、日期、類型)顯示事件信息的分?jǐn)?shù)項(xiàng)頁(yè)面,后接每個(gè)學(xué)生一項(xiàng)的列表。對(duì)于新事件,項(xiàng)將是空白的。對(duì)于已存在的事件,項(xiàng)將顯示每個(gè)學(xué)生已存在的分?jǐn)?shù)。選擇提交按鈕時(shí),分?jǐn)?shù)輸入到score 表中。腳本需要執(zhí)行幾個(gè)不同的操作,這意味著我們需要從一個(gè)頁(yè)面到另一個(gè)頁(yè)面周而復(fù)始地傳遞狀態(tài)變量,以便腳本在每次調(diào)用時(shí)能夠知道假設(shè)要做什么。在PHP 中很容易做到這一點(diǎn),因?yàn)镻HP 處理作為URL 參數(shù)傳遞的變量,并把它們轉(zhuǎn)換為與參數(shù)具有相同名稱的變量。例如,可以在腳本URL 的末尾對(duì)參數(shù)action 進(jìn)行如下編碼:http://pit-viper.snake.net/gp/score_entry.php?action=value當(dāng)調(diào)用score _ e n t r y.php 時(shí),參數(shù)action 作為變量$action 來(lái)編碼,這樣就可以直接訪問(wèn)它了。這也適用于格式中的域。設(shè)想一個(gè)包括域name 和address 的表格,當(dāng)客戶機(jī)傳遞表格時(shí),Web 服務(wù)器就調(diào)用腳本訪問(wèn)表格的內(nèi)容。腳本能夠找出通過(guò)檢查變量$name 和$address 的值而輸入到表格中的值。對(duì)于包括許多域的表格,全部給出唯一的命名是有困難的。PHP 很容易地把數(shù)組在表格中傳入和傳出。如果使用了如x [ 0 ]、x[1] 等等的域名,則PHP 把它們作為$x 數(shù)組的元素進(jìn)行編碼。可以將這些元素作為$ x [ 0 ]、$x[1] 等等來(lái)訪問(wèn)。我們通過(guò)使用頁(yè)面中的action 參數(shù),可以將信息從score _ e n t r y.php 腳本的一個(gè)調(diào)用傳送到另一個(gè)調(diào)用,并在腳本中用變量$action 檢查它的值。腳本的框架是這樣的:Mysql入門系列:運(yùn)行PHPMysql入門系列:運(yùn)行PHP變量$action 可以取若干值,我們已在switch() 語(yǔ)句中測(cè)試過(guò)了(為避免在腳本中使用文字的數(shù)字,可以用PHP 的define() 構(gòu)造來(lái)定義常量)。PHP switch() 語(yǔ)句與它在C 中相應(yīng)的部分相類似。在score _ e n t r y.php 中,它用來(lái)確定采用什么操作,并且調(diào)用實(shí)現(xiàn)這個(gè)操作的函數(shù)。檢查一下每次處理一個(gè)操作的函數(shù)。第一個(gè)函數(shù)d i s p l a y _ e v e n t s ( ),檢索來(lái)自MySQL的event 表的行并加以顯示。表的每一行都列出了事件ID、日期和時(shí)間類型(測(cè)試或測(cè)驗(yàn)),還有編寫事件ID作為可以選擇用來(lái)修改事件分?jǐn)?shù)的連接:Mysql入門系列:運(yùn)行PHP表中的連接用$PHP_SELF 來(lái)構(gòu)造。這個(gè)變量包括了腳本自己的U R L,它為腳本再次調(diào)用自己提供了一個(gè)方便的方法。然而,請(qǐng)注意函數(shù)開(kāi)始處的global 行:global $PHP_SELF;在PHP 函數(shù)中,全局變量是不可訪問(wèn)的,除非顯式地聲明要使用它們。沒(méi)有g(shù)lobal 行,$PHP_SELF 將被看成局部變量(因?yàn)槲覀儧](méi)有將值賦給它,因此是空的)。在函數(shù)內(nèi)部,使用global 來(lái)訪問(wèn)依靠URL 參數(shù)或者作為表格域傳遞到腳本中的參數(shù)也是必需的。用來(lái)生成表的函數(shù)display_cell() 與第7 章編寫的同名DBI 函數(shù)相類似。PHP 版本如下:Mysql入門系列:運(yùn)行PHP如果在display_events() 給出的表中選擇了“ New Event ”連接,則腳本通過(guò)操作SOLICIT_ EVENT進(jìn)行再次調(diào)用。它引發(fā)了對(duì)solicit_event_info() 的調(diào)用,這個(gè)函數(shù)顯示了允許輸入新事件信息的表格:Mysql入門系列:運(yùn)行PHP由solocit_event_info() 生成的表格包括輸入數(shù)據(jù)的編輯域、指定新事件是測(cè)試還是測(cè)驗(yàn)的兩個(gè)單選按鈕、Submit 按鈕。當(dāng)遞交表格時(shí), ADD_EVENT 操作將調(diào)用score _ e n t r y. p h p。調(diào)用add_new_event() 函數(shù)在event 表中輸入一個(gè)新的行:Mysql入門系列:運(yùn)行PHP在add_new_event() 中,我們使用global 訪問(wèn)在新事件項(xiàng)表格中使用的域值( date 和type,用變量$date 和$type 訪問(wèn))。做出最低限度的安全檢查,確定數(shù)據(jù)為非空白之后,在event 表中輸入一個(gè)新記錄。輸入這個(gè)事件記錄之后,主程序?qū)⒃俅物@示事件列表,這樣就可以選擇新事件并開(kāi)始輸入分?jǐn)?shù)了。函數(shù)display_scores() 為給定的事件查找已存在的分?jǐn)?shù),并列出顯示他們的表格,包括學(xué)生姓名:Mysql入門系列:運(yùn)行PHPdisplay_scores() 用于檢索所選事件的分?jǐn)?shù)信息的查詢并不是表之間的簡(jiǎn)單連接,因?yàn)樗粫?huì)為事件中沒(méi)有分?jǐn)?shù)的學(xué)生選擇行。特別是,對(duì)于新的事件,連接會(huì)選擇無(wú)記錄,這就有了一個(gè)空項(xiàng)表格!我們使用LEFT JOIN 強(qiáng)迫為每個(gè)學(xué)生檢索行,無(wú)論學(xué)生是否在score表中已經(jīng)有了分?jǐn)?shù)。與display_scores() 用來(lái)檢索來(lái)自于MySQL的分?jǐn)?shù)記錄相類似的查詢背景,已在3 . 8 . 2節(jié)“檢查表中未給出的值”中給出了介紹。那里的查詢只選擇缺失分?jǐn)?shù),這里的查詢只選擇特殊事件的分?jǐn)?shù)。分?jǐn)?shù)在表格中使用了有名稱的域進(jìn)行編碼,如score [n],這里的n是student_id 的值。當(dāng)表格送回Web 服務(wù)器時(shí),PHP 將這些域轉(zhuǎn)換為$score 數(shù)組的元素,我們可以訪問(wèn)數(shù)組元素以恢復(fù)表格的內(nèi)容。當(dāng)完成輸入或者編輯分?jǐn)?shù),并提交給表格后,ENTER_SCORES 操作調(diào)用score _ e n t r y. p h p,并且調(diào)用函數(shù)enter_scores() 處理表格信息:Mysql入門系列:運(yùn)行PHP學(xué)生ID 的值和相關(guān)的分?jǐn)?shù)通過(guò)迭代PHP 的each 函數(shù)的$score 數(shù)組來(lái)獲得。每個(gè)分?jǐn)?shù)處理如下:如果分?jǐn)?shù)是空白的,則表明什么也沒(méi)有輸入,但是我們還要試圖刪除這個(gè)分?jǐn)?shù),以免它以前曾經(jīng)存在(也許以前我們?yōu)槿毕膶W(xué)生錯(cuò)誤地輸入了分?jǐn)?shù))如果分?jǐn)?shù)不是空白的,就對(duì)值進(jìn)行一些根本的確認(rèn)。用函數(shù)trim() 去掉前后的空格之后,如果剩余部分是空白或者整數(shù),就接受這個(gè)結(jié)果。然而,表格值通常作為字符串來(lái)編碼,因此不能用is_long() 或者is_int() 檢查值是否為整數(shù)。即使值只包括數(shù)字,這些函數(shù)也會(huì)返回FA L S E。既然這樣,最好用模型匹配操作。如果字符串從開(kāi)始到結(jié)束每個(gè)字符都是數(shù)字,則下面的測(cè)試為T R U E:ereg('^[0-9]+$',$str)如果分?jǐn)?shù)檢查完畢,我們就將它加到score 表中。查詢使用REPLACE 而不用INSERT,因?yàn)槲覀兛赡芴鎿Q了已存在的分?jǐn)?shù)而不是輸入一個(gè)新的分?jǐn)?shù)( REPLACE 在兩種情況下都適用)。注意score _ e n t r y.php 腳本。現(xiàn)在所有的分?jǐn)?shù)項(xiàng)和編輯項(xiàng)都能從Web 瀏覽器執(zhí)行。一個(gè)明顯的缺點(diǎn)是:腳本沒(méi)有提供安全措施,連接到Web 服務(wù)器的任何人都可以對(duì)分?jǐn)?shù)進(jìn)行編輯。以后,我們用編輯歷史同盟成員項(xiàng)編寫的腳本來(lái)說(shuō)明這個(gè)腳本所采取的簡(jiǎn)單確認(rèn)方案。也可以使用PHPLIB 程序包來(lái)提供更完善的確認(rèn)。美國(guó)總統(tǒng)測(cè)驗(yàn)歷史同盟Web 站點(diǎn)的目標(biāo)之一就是用它給出測(cè)驗(yàn)的在線版本,這類似于同盟在時(shí)事通信“美國(guó)編年史”的兒童部分發(fā)表的一些測(cè)驗(yàn)。實(shí)際上我們創(chuàng)建了president 表,因此對(duì)基于歷史的測(cè)驗(yàn)可以用它作為問(wèn)題的來(lái)源。為了給出這個(gè)測(cè)驗(yàn),我們將編寫稱為pres_quiz.php 的腳本。基本的想法是隨機(jī)挑選一個(gè)總統(tǒng),問(wèn)一個(gè)關(guān)于他的問(wèn)題,然后請(qǐng)求用戶回答并且察看答案是否正確。為了簡(jiǎn)單一點(diǎn),可以把主題限制為詢問(wèn)總統(tǒng)出生在哪里。另外一種簡(jiǎn)單的衡量就是以多個(gè)選擇的格式給出這個(gè)問(wèn)題。這對(duì)用戶來(lái)講很容易,他只需從一組選擇中挑選一個(gè),而不用將之鍵入等待回應(yīng)。這對(duì)我們來(lái)講也是容易的,因?yàn)槲覀儾恍枳鋈魏渭值钠ヅ渥址畞?lái)檢查用戶可能鍵入的內(nèi)容,而只需對(duì)用戶的選擇和我們尋找的值做一個(gè)簡(jiǎn)單的比較。顯示這個(gè)測(cè)驗(yàn)的腳本必須執(zhí)行兩個(gè)函數(shù)。第一個(gè),對(duì)于它最初的調(diào)用,將從p r e s i d e n t表中查閱信息來(lái)生成并顯示一個(gè)新的問(wèn)題。第二個(gè),如果腳本已經(jīng)被調(diào)用是因?yàn)橛脩粽峤灰粋€(gè)回答,那么就需要檢查這些答案并給出一些反饋信息來(lái)指出它是否正確。如果正確,腳本會(huì)生成并顯示一個(gè)新的問(wèn)題。如果回答不正確,將再次顯示同一問(wèn)題。為了生成這些問(wèn)題,我們將使用MySQL3.23 中出現(xiàn)的一個(gè)ORDER BY RAND()特性。使用這個(gè)函數(shù)就能從p r e s i d e n t表中隨機(jī)地進(jìn)行行選擇。例如,為了隨機(jī)地挑選總統(tǒng)的姓名和出生地,查詢將執(zhí)行這樣的操作:Mysql入門系列:運(yùn)行PHPname是選擇的總統(tǒng)的名字,出生地是問(wèn)題“總統(tǒng)出生在哪里?”的正確答案,我們還需要給出一些錯(cuò)誤的選擇,可用類似的查詢:Mysql入門系列:運(yùn)行PHP從這個(gè)查詢的結(jié)果中,我們選擇了與正確答案不同的最前面的四個(gè)值。發(fā)布這個(gè)查詢并檢索結(jié)果的函數(shù)如下:Mysql入門系列:運(yùn)行PHP為了給出測(cè)驗(yàn)問(wèn)題的信息,我們使用了顯示總統(tǒng)姓名、一組列出可能選擇的單選按鈕和一個(gè)S ub m i t按鈕的表格。這個(gè)表格需要做兩件事情:必須對(duì)客戶機(jī)給出測(cè)驗(yàn)信息;當(dāng)用戶提交回答時(shí)必須將信息傳送回Web 服務(wù)器,以便檢查回答是否正確。為了安排表格執(zhí)行這些操作,我們使用了隱藏域把測(cè)驗(yàn)信息包括在表格中。把域稱為name、place 和c h o i c e,它們代表總統(tǒng)的姓名、出生地和一組可能的選擇。使用implode() 連接值和特殊字符,這樣,這些選擇可以很容易地作為單個(gè)字符串來(lái)編碼(我們需要特殊字符,以便如果需要重新顯示問(wèn)題時(shí)可以用explode() 分離字符串)。顯示表格的函數(shù)如下:Mysql入門系列:運(yùn)行PHP函數(shù)hidden_field( )為表格中的隱藏域編寫了H T M T :Mysql入門系列:運(yùn)行PHP當(dāng)用戶做出選擇并提交表格時(shí),答案作為response 域值在發(fā)送回Web 服務(wù)器的表格內(nèi)容中編碼。我們可以通過(guò)檢查變量$ name、$place 和$choice 發(fā)現(xiàn)name、place 和choice 域的值。這也給了我們一個(gè)方法,指出是否是第一次調(diào)用腳本,或者用戶是否給以前顯示過(guò)的表格提交了回答,如果是第一次調(diào)用則不會(huì)設(shè)置那些變量。這樣,通過(guò)檢查其中一個(gè)變量,腳本的主體就決定了應(yīng)該做的事情:Mysql入門系列:運(yùn)行PHP我們?nèi)匀恍枰帉慶heck_response() 函數(shù)來(lái)將用戶的回答與正確答案做比較。我們將正確答案在表格的place 域進(jìn)行編碼,用戶的回答則在表格的response 域進(jìn)行編碼,因此我們所要做的就是比較$place 和$ r e s p o n s e。在比較結(jié)果的基礎(chǔ)上,我們提供了一些反饋信息,之后每次都生成顯示一個(gè)新的問(wèn)題,或者再次顯示相同的問(wèn)題:Mysql入門系列:運(yùn)行PHP這樣,我們就做完了。將pres_quiz.php 的鏈接加到歷史同盟主頁(yè)上,參觀者可以做一下這個(gè)測(cè)驗(yàn)來(lái)測(cè)試他們的知識(shí)。歷史同盟聯(lián)機(jī)成員項(xiàng)的編輯最終的腳本e d i t _ member.php 允許歷史同盟成員編輯他們自己的聯(lián)機(jī)項(xiàng)。無(wú)論何時(shí),成員都可以校正或者更新他們的成員信息,而不必向同盟部提交這些更改。這個(gè)性能使成員目錄總是保持最新的,而且減少了秘書的工作量。我們需要采取的一個(gè)防范措施就是:除了該項(xiàng)目的成員之外,防止任何其他人修改項(xiàng)目。這意味著我們需要一些安全性的表單。作為一個(gè)簡(jiǎn)單的身份確認(rèn)表單的示范,我們將使用MySQL存放每個(gè)成員的口令,并要求成員提供正確的口令以訪問(wèn)腳本給出的編輯表單。該腳本操作如下:當(dāng)初次調(diào)用時(shí),edit_script.php 給出包括成員ID 和口令域的表單。當(dāng)提交初始表單時(shí),腳本用成員ID 作為關(guān)鍵字尋找相關(guān)的口令來(lái)搜索口令表。如果口令相符,腳本將從member 表中查找成員項(xiàng),并顯示要編輯的內(nèi)容。當(dāng)提交編輯過(guò)的表單后,我們就用表單的內(nèi)容更新項(xiàng)。e d i t _ member.php 的框架如下所示:Mysql入門系列:運(yùn)行PHPMysql入門系列:運(yùn)行PHP當(dāng)然,我們還需要一些口令,一個(gè)簡(jiǎn)單的方法就是隨機(jī)地生成它們。下面的語(yǔ)句建立member _ pass表,然后,通過(guò)從隨機(jī)數(shù)中生成MD5 校驗(yàn)來(lái)為每個(gè)成員創(chuàng)建口令。您可以讓成員們來(lái)選擇他們自己的口令,也可以調(diào)用mysql并發(fā)布這些語(yǔ)句作為一種既快速又容易的方法:Mysql入門系列:運(yùn)行PHP我們將一個(gè)特殊項(xiàng)加到這個(gè)表中作為編號(hào)0,它有一個(gè)用于管理的(超級(jí)用戶)口令。可以使用這個(gè)口令訪問(wèn)所有想要訪問(wèn)的項(xiàng):INSERT INTO member_pass (member_id,password) VALUES (0,'secret');在創(chuàng)建口令表之后,您可以停止使用第7章中編寫的samp_browse 腳本,該腳本允許任何人在samp_db 數(shù)據(jù)庫(kù)中瀏覽任何表的內(nèi)容,其中包括member_pass 表。當(dāng)成員輸入ID 和口令并提交該表單時(shí), e d i t _ member.php 顯示該編輯的項(xiàng):Mysql入門系列:運(yùn)行PHP Mysql入門系列:運(yùn)行PHPdisplay_entry() 需要做的第一件事就是校驗(yàn)口令。對(duì)于給定的成員ID,如果表單中輸入的口令與member_pass 表中存放的口令相符,或者如果它與管理口令相符(即成員0 的口令),e d i t _ member.php 就顯示編輯的項(xiàng)。口令檢查函數(shù)check_pass() 將執(zhí)行一個(gè)簡(jiǎn)單的查詢從member_pass 表中移出一條記錄:Mysql入門系列:運(yùn)行PHP因?yàn)椴荒苄薷乃跃庉嫳韱巫鳛橹蛔x文本顯示成員ID 的值。對(duì)于正常的成員,截止日期也作為只讀文本顯示,因?yàn)椴荒茏尦蓡T改動(dòng)它。然而,如果給出管理口令,則截止日期就成為可編輯的,允許同盟秘書為成員更新日期來(lái)重新更新他們的會(huì)員資格。member 表項(xiàng)的列由display_column() 函數(shù)顯示。它按照第三個(gè)參數(shù)值把列作為可編輯的文本或作為只讀文本加到編輯表單中:Mysql入門系列:運(yùn)行PHPMysql入門系列:運(yùn)行PHPdisplay_entry() 函數(shù)在格式中作為隱藏字段嵌入了member_id 和pass w o r d,因此當(dāng)成員提交編輯的項(xiàng)時(shí)將繼續(xù)edit_script.php 的下一個(gè)調(diào)用。這允許自動(dòng)校驗(yàn)ID 的口令,而不用請(qǐng)求成員再次輸入(請(qǐng)注意,我們的簡(jiǎn)單的確認(rèn)身份的方法是以文本形式來(lái)回傳遞口令。通常這不是個(gè)好主意,但是歷史同盟不是對(duì)安全性要求很高的運(yùn)作機(jī)構(gòu),因此這種方法足夠滿足要求。如果在運(yùn)行金融業(yè)務(wù),可能需要更強(qiáng)的安全性操作)。更新項(xiàng)的函數(shù)如下:Mysql入門系列:運(yùn)行PHPMysql入門系列:運(yùn)行PHP首先,重新校驗(yàn)口令,確定沒(méi)人發(fā)送假表單來(lái)愚弄我們,然后更新項(xiàng)。更新時(shí)需要注意,因?yàn)槿绻韱沃械淖侄问强瞻椎模瑒t可能需要作為NULL 而不是作為空字符串輸入。expiration 列就是這樣的例子。NULL的成員截止日期具有特殊的含義,即“終生會(huì)員”。如果將一個(gè)空字符串插入到此列中,值轉(zhuǎn)換成“ 0 0 0 0 - 0 0 - 0 0”,則成員不再具有終生會(huì)員資格。為了處理這個(gè)問(wèn)題,我們查找該列的元數(shù)據(jù)并檢查它是作為NULL 還是作為NOT NULL進(jìn)行聲明的。該信息由函數(shù)mysql_fetch_field() 返回。不幸地是,此函數(shù)通過(guò)數(shù)值的索引查找列。在member 表中按名稱訪問(wèn)列會(huì)更方便,因此我們編寫一個(gè)小函n ul l a b l e ( ),它獲取一個(gè)列名并查找相應(yīng)的元數(shù)據(jù)對(duì)象:Mysql入門系列:運(yùn)行PHPmysql_fetch_field() 函數(shù)需要包含檢查列所在表的結(jié)果集標(biāo)識(shí)符。這可通過(guò)執(zhí)行簡(jiǎn)單的不返回行的SELECT 查詢來(lái)獲得。雖然該查詢返回一個(gè)空結(jié)果集,但是,對(duì)于檢索要評(píng)估m(xù)ember 表中列的空性能(n ul l a b i l i t y)的元數(shù)據(jù)來(lái)說(shuō),這種方法足夠了:SELECT * FROM member WHERE 1=0安裝腳本,讓成員們知道他們的口令,這樣他們就能更新自己的成員信息了。
標(biāo)簽: PHP
相關(guān)文章:
主站蜘蛛池模板: 在线观看视频黄 | 国产精品亚洲综合五月天 | 日本黄大片免播放视播放器 | 特黄特色的视频免费播放 | 国产网友自拍视频 | 日本免费在线一区 | 日本三级免费片 | 国产一国产a一级毛片 | 国产成人区 | 久青草免费视频手机在线观看 | 欧美黄色一级视频 | 国美女福利视频午夜精品 | 麻豆网站在线观看 | 日韩在线视频一区二区三区 | 精品一区二区三区在线观看l | 在线观看 国产 | 精品理论片一区二区三区 | 2021久久精品免费观看 | 在线免费国产 | 伊人久久久久久久久香港 | 国产原创一区二区 | 国产伦精一区二区三区 | 一本一本久久a久久精品综合麻豆 | 青青青视频精品中文字幕 | 亚洲午夜精品专区国产 | 高清毛片一区二区三区 | 亚洲一区无码中文字幕 | 91久久青青草原线免费 | 一级做a免费视频 | 欧美综合在线观看 | 国产福利在线 | 欧美日韩视频在线观看高清免费网站 | 日本黄色二级片 | 国产成人午夜福在线观看 | 黄色毛片在线观看 | 视频一区国产精品 | 日本无卡无吗在线 | 精品欧美一区二区三区 | 国产精品福利久久香蕉中文 | 东京一热本色道久久爱 | 毛片网在线 |