亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Perl > 正文

運行perl DBI

2024-07-21 02:13:11
字體:
來源:轉載
供稿:網友
  在這里,已經看到許多涉及dbi 程序設計的概念,所以讓我們繼續(xù)做一些樣例數據庫能處理事情。最初,第1章簡述了我們的目標。本章通過編寫dbi 腳本,我們將處理的那些問題在這里列出。
    對于學分保存方案,我們想能夠檢索任何給定的測驗或測試的分數。
    對于歷史聯盟,我們想做下面的事情:
    以不同格式產生成員目錄。我們想在年度宴會程序中,以可以用于生成顯示目錄的格式使用一個只有名稱的列表。
    尋找不久就要更新其成員資格的league 成員,然后發(fā)送電子郵件通知他們。
    編輯成員項目(畢竟,在更新成員資格時,我們將要更新他們的終止日期)。
    尋找分享共同興趣的成員。
    使這個目錄聯機。
    對于這樣一些任務,我們將編寫從命令行上運行的腳本。其他任務,我們將在7 . 4節(jié)“在web 應用程序中使用dbi”中創(chuàng)建腳本,可以與web 服務器配合使用。在本章的最后,我們將仍有許多有待完成的目標。將在第8章“php api”中,完成剩余的目標。

生成歷史同盟目錄

    我們的目標之一是能以不同格式產生歷史同盟目錄的信息。我們將生成的最簡單格式是一個年度宴會程序的成員名列表。那可能是一個簡單的無格式文本列表。它將成為創(chuàng)建這個程序的一部分較大文檔,所以,我們所需要的就是可以粘貼到文檔中的一些內容。
    對于可顯示的目錄,則需要一種比無格式文本更好的表示方法,原因是我們想把一些內容更精細地格式化。這里一個合理的選擇為rt f(豐富的文本格式rich text format),它是由microsoft 開發(fā)的一種格式,可以由許多字處理程序來識別。當然, word 就是這種程序之一,但是許多其他的軟件,如wordperfect 和a p p l e work 也是可以識別的。不同的字處理程序對rtf 的支持程度也有所不同,但是我們將使用由即使對最低級別rt f都確信的任何字處理程序所支持的全部rtf 規(guī)定的一個基本子集。
    生成宴會列表和rtf 目錄格式的過程本質上是一樣的:發(fā)布查詢來檢索這些項目,然后運行將每個項目提取和格式化的循環(huán)。給出了基本的相似之處湍芎芎玫乇苊獗嘈戳礁齜摯慕瘧盡k裕頤潛嘈匆桓齙ザ賴慕瘧緂 e n _ d i r,它可以以不同的格式從這個目錄生成輸出。我們可以這樣組織這個腳本:
    1) 在編寫出項目內容之前,完成這個輸出格式可能需要的任何初始化。宴會程序成員列表不需要任何特殊的初始化,但是我們需要為這個rtf 版本編寫一些初始的控制語言。
    2) 提取和顯示每個項目,將我們要輸出的類型適當地格式化。
    3) 處理完所有的項目之后,還要完成任何必需的清除和終止。除了這個rtf 版本需要的一些關閉控制語言以外,宴會列表不需要特殊的處理。
    將來,我們可能想使用這個腳本以其他格式編寫輸出,所以我們通過設置“轉換盒”——每個輸出格式都有一個元素的散列,使它成為可擴展的。每個元素都指定對給定格式生成適當輸出的函數:初始化函數、編寫項目函數和清除函數如下所示:

    由一個格式名(在這種情況下的“ b a n q ue t”和“r t f”)標識轉換盒的每個元素。我們將編寫這個腳本,以便在運行它時可以在命令行中指定想要的格式:
    % gen_dir banquet
    % gen_dir rtf
    通過以這種方式設置轉換盒,我們可以很容易地增加新格式的性能:
    1) 編寫三個格式化函數。
    2) 向轉換盒增加一個指向那些函數的新元素。
    3) 為了以新的格式產生輸出,調用g e n _ d i r,并在命令行中指定這個格式名。
    按照命令行中的第一個參數所選擇的適當轉換盒項目的代碼如下所示。它是由于輸出格式的名稱為%switchbox 散列中關鍵字。如果在轉換盒中不存在這樣的關鍵字,則這個格式是無效的。不需要這個代碼中的硬連線格式;如果向轉換盒增加新的格式,則自動地檢測它。如果在命令行中沒有指定格式名,或者指定了一個無效的名稱,則這個腳本產生錯誤消息,并顯示一列允許的名稱:

    如果在命令行指定了一個有效的格式名,則前述的代碼設置$ f un c _ h a s h r e f。它的值將是指向選擇了格式輸出的編寫函數的散列引用。然后我們可以運行這個選擇項目的查詢。之后,我們調用初始化函數、提取和顯示這些項目,并激活清除函數:

    因為某種原因,提取項目的循環(huán)使用了fetchrow_hashref( )。如果這個循環(huán)提取數組,則這個格式化函數必須知道列的次序。它可能通過訪問$sth->{name} 屬性(它含有返回次序的列名)來得到,但為什么煩擾呢?通過使用散列引用,格式化函數將只能命名那些想使用$entry_ref->{col_name} 的列值。那樣效率就非常低,但它容易做到,并可用于想生成的任何格式,因為我們知道我們需要的任何域都在散列中。
    剩余的工作就是為每種輸出格式編寫這些函數(也就是說,通過轉換盒項目為這些函數命名)。
    1. 生成宴會程序成員列表
    對于這種輸出格式,我們只想要成員的姓名。不需要初始化或清除調用。只需要一個項目格式化函數:


    format_banquet_entry( ) 的參數是行的列值的散列引用。這個函數將名和姓連在一起,加上可能出現的任何后綴。這里的竅門是如“ j r.”或“s r.”后綴的前面應該有一個逗號或空格,但是如“i i”或“i i i”后綴的前面只能為一個空格:

    因為字母‘i’、‘v’和‘x’覆蓋了所有生成的數字,從第1到第3 9,所以我們可以使用下面的測試來確定是否增加一個逗號:

    和名稱放在一起的format_banquet_entry( ) 的代碼也是這個目錄的rtf 版本將需要的一些內容。然而,并不是復制format_rtf_entry( ) 中的代碼,讓我們將它填入函數中:

    將確定名稱的字符串放在format_name( ) 函數中,將把format_banquet_entry( ) 函數減少到幾乎沒有:

    2. 生成顯示格式的目錄
    生成這個目錄的rtf 版本比生成宴會程序成員列表更要棘手一些。首先,我們需要從每個項目中顯示更多的信息。其次,我們需要用每個項目產生一些rtf 控制語言來完成我們想要的作用。rtf 文檔的最小框架是這樣的:


    這個文檔用花括號‘ {’和‘ }’作為開始和結束。rtf 關鍵字用反斜線符號開始,并且文檔的第一個關鍵字必須為/ r t f n,n為這個文檔對應的rtf 規(guī)定的版本號。如果按我們的目的,0就比較合適。
    在這個文檔的內部,我們指定字體表來說明這些項目所使用的字體。字體表信息列在組中,由含有前導的/fonttbl 關鍵字和一些字體信息的花括號組成。在框架中說明的這個字體表把字體號0 定義為ti m e s(我們只需要一個字體,但是如果想顯示得更好一些,可以使用多種字體)。
    下面的一些指示設置了缺省格式風格: /plain 選擇無格式的格式, /f0 選擇字體0(我們已經在字體表中定義為times ),/fs24 設置字體大小為12個點陣(/fs 后面的數量表示半個點陣的大?。TO置頁邊空白并不是必需的;大多數的字處理程序將提供合理的缺省值。
    要想得到一個非常簡單的方法,可以將每個項目顯示為一系列的行,每行上都有一個標號。如果對應于特定輸出行的信息缺失,則忽略這個行(例如,沒有電子郵件地址的成員沒有顯示“ e m a i l :”行)。一些行(如“ a d d r e s s :”行)由多個列(街道、城市、州、郵政編碼)中的信息構成,所以這個腳本必須能夠處理缺失值的各種組合。這里是我們將使用的輸出格式的樣例:

    對于顯示的格式化項目,rtf 的表示方法如下所示:

    要想使“name :”行為粗體,則在它的前面加/b (后面有個空格)來打開粗體,并用/ b 0來關閉粗體。每行在末端都有一個段標記符( / p a r)來告訴字處理程序移到下一行——沒有太復雜的事情。
    初始化函數產生前導rtf 控制語言(請注意,兩個反斜線符號獲得輸出中的一個反斜線符號):

    類似地,清除函數產生終止控制語言(并不太多?。?br>    sub rtf_cleanup
    {
          print '}/n";
    }
    真正的工作與格式化這個項目有關,即使這個任務相對簡單。主要復雜點是將地址字符串格式化,并確定應該顯示哪個輸出行:

    當然,不用限于這種特殊的格式化風格??梢愿娜绾物@示任何域的方法,所以通過簡單地更改format_rtf_entry( ),可以幾乎任意地更改顯示的目錄。用它原始格式的目錄(一個字處理文檔),是多么不容易做的事情!
    gen_dir 腳本現在完成了。通過運行以下這些命令,我們可以以任意一種輸出格式生成這個目錄:
    % gen_dir banquet > name.txt
    % gen_dir rtf > directory.rtf
    在windows 中,我可以運行g e n _ d i r,則這些文件準備從基于windows 字處理程序的內部使用。在unix 中,我可就以運行上面那些命令,然后將這些輸出文件以郵件形式發(fā)給自己作為附件,以便可以從我的macintosh 中獲取它們,并將它們加載到字處理程序中。我偶爾使用mutt 郵寄程序,它允許使用-a 選項從命令行指定附件。可以如下發(fā)送給自己一個具有這兩個附加文件的消息:
    % mutt -a name.txt -a directory.rtf paul0snake.net
    其他郵寄程序可能也允許創(chuàng)建附件?;蛘?,可以以其他意思傳輸這些文件,如f t p。無論如何,在這些文件被放到想放的地方之后,讀取這個名稱列表,并將它粘貼到年度程序文檔,或者在可識別rtf 的任何字處理程序中讀取rtf 文件,這都是較容易的。dbi 使我們從mysql中抽取想要的信息很容易, perl 的文本處理能力使我們將這些信息放在指定的格式中很容易。mysql不提供信息輸出的任何特殊方式,但沒有關系,因為將mysql的數據庫處理能力集成到如perl 的語言中并不費力,而這些語言具有極好的文本處理能力。

發(fā)送成員資格更新通知

    當作為字處理文檔維護歷史同盟目錄時,確定需要通知哪個成員其成員資格應該更新,這是件耗費時間并且容易出現錯誤的事情。既然我們在數據庫中有信息,那么讓我們看看如何自動地處理更新通知。我們想標識需要經過電子郵件更新的成員,這樣我們就不必通過電
話或郵件與他們聯系了。
    我們需要做的事情就是確定哪個成員在某些天以內快到更新的時間了。這個的查詢涉及一個相對簡單的日期計算:
    select ... from member
    where expiration < date_add (current_date,interval cutoff day)
    c ut o ff 表示我們同意的可允許誤差的天數。這個查詢選擇在幾天之內快到更新時間的成員項目。作為特殊情況,終止點值為0,尋找終止日期已過的成員(也就是說,實際上已經終止了的那些成員)。
    我們標識了限制通知的這些記錄之后,我們對它們應該怎么辦呢?一個選擇是直接從同樣的腳本中發(fā)送郵件,但是,首先審閱不發(fā)送任何消息的列表可能有用。由于這個原因,我們將使用一個兩階段的方法:
    階段1:運行腳本need_renewal 來標識需要更新的成員??蓹z查這個列表,或者可以使用它作為將更新通知發(fā)送到第2 階段的輸入。
    階段2:運行腳本r e n e w a l _ n o t i f y,它通過電子郵件向成員發(fā)送“請更新”的通知。這個腳本應該通知您不具有電子郵件地址的成員,以便可以用其他方式與他們聯系。
    在此任務的第一部分中, need_renewal 腳本必須標識哪個成員需要更新。它的操作如下所示:

    need_renewal 腳本的輸出如下所示(因為是針對當前日期確定的結果,而您讀這本書的時間和我書寫它的時間將是不同的,所以將獲得不同的輸出)

    可以觀察到,處于負數天數的那些成員資格需要更新。負數意味著我們已經過期了(當手工地維護記錄時,就可能發(fā)生這種情況;有些人從縫隙中滑掉了。既然我們在數據庫中有了這些信息,那么我們要尋找在前面丟失的幾個人)!
    更新通知任務的第二部分涉及了通過電子郵件發(fā)送通知的腳本r e n e w a l _ n o t i f y。要想使renewal_notify 更容易使用,則我們可以使它支持三類命令行參數:成員關系id 號碼,電子郵件地址和文件名。數值的參數表示成員資格id 值,帶有字符‘@’的參數表示電子郵件的地址。其他任何事情都解釋為應該讀取的文件名,以便找到他們的id 號碼或電子郵件地址,可以直接在命令行中這樣做,或者通過將它們在文件中列出來去做(特別是,可以使用need_renewal 的輸出作為renewal_notify 的輸入)。
    對于要發(fā)送通知的每個成員,此腳本查找相應的member 表項目,抽取電子郵件地址,并向那個地址發(fā)送一條消息。如果此項中沒有電子郵件地址,則renewal_notify 生成一條消息,通知您需要以一些其他方式與這些成員聯系。
    要想發(fā)送電子郵件, renewal_notify 打開與sendmail 程序的管道,并將這封郵件推入此管道中(在windows 下不能這樣操作,windows 中沒有s e n d m a i l??赡苄枰獙ふ野l(fā)送郵件的模塊來代替它使用)。在此腳本開頭附近,將到sendmail 的路徑名設置為參數??赡苄枰脑撀窂?,因為sendmail 的位置隨系統的變化而變化:
    # change path to match your system
    my ($sendmail)="/usr/lib/sendmail -t -oi";
   主要參數處理循環(huán)的操作如下所示。如果在命令行沒有指定參數,則我們讀取標準的輸出作為輸入。否則,我們通過將參數傳遞給i n ter p r e t _ a rgument( ),將它分類為id 號、電子郵件地址或者文件名來處理每個參數:

    函數read_file( ) 讀取了文件的內容(假設已經打開),并查看每行的第一個域(如果我們將need_renewal 的輸出作為renewal_notify 的輸入,則每行都有若干域,但是我們只想查看第一個域)。

    i n ter p r e t _ a rgument( ) 函數將每個參數分類,以便確定它是id 號碼、電子郵件地址還是文件名。對于id 號碼和電子郵件地址,它查找適當的成員項目,并將它傳遞給n o t i f y _ member ()。我們必須注意由電子郵件所指定的成員。兩個成員具有同樣的地址是可能的(例如,丈夫和妻子),并且我們不想將一條消息發(fā)送給不能用這條消息的人。為了避免這一點,我們查找了與電子郵件地址相對應的成員的id 號碼,來確保內容的正確。如果此地址和一個以上的id 號碼匹配,則它是不確定的,我們在顯示一條警告消息后忽略它。
    如果參數看起來不像id號碼或電子郵件地址,則將它作為文件名讀取為進一步的輸入。在這里,我們也必須小心——為了避免無窮循環(huán)的可能性,如果我們已經讀取一個文件,則我們不想再讀取文件:

    實際上,發(fā)送更新通知的notify_member( ) 函數的代碼如下所示。如果得出這個成員沒有電子郵件地址,則什么也不做,但是notify_member( ) 顯示一條警告消息,以便知道需要以其他某種方式與該成員聯系??梢哉{用具有這條消息中所顯示的這個成員資格id 號碼的s h o w _ member,來查看全部項目—例如,找出這個成員的電話號碼和通信地址。

    用它可能獲得更好的內容—例如,通過向member 表中增加一列來記錄最近更新的提示是何時發(fā)送出去的。這樣做將有助于避免過于頻繁地發(fā)送通知。實際上,我們只需假設不存在大約每月運行一次以上的程序。
    現在運行這兩個腳本,從而可以這樣使用它們:
    % need_renewal > junk
    % (看一看junk,檢查它是否合理)
    % renewal_notify junk
    要想通知單個的成員,可以通過id 號碼或電子郵件地址指定它們:
    % need_renewl 18 [email protected]

歷史同盟成員項目編輯

    我們開始發(fā)送更新通知之后,假設我們通知的一些人將更新他們的成員資格是個安全的措施。當這種情況發(fā)生時,我們將需要一種更新其所具有的新的終止日期項的方法。下一章中,我們將開發(fā)一種方法,在web 瀏覽器上編輯成員記錄,但是在這里,我們將建立一個命
令行腳本e d i t _ member,允許用提示項的各部分新值的方法來更新項目。其操作如下:
    如果在命令行上無參數調用,則edit_member 假設您想輸入一個新的號碼,提示放在成員項目中的初始信息,并創(chuàng)建新的項目。
    如果在命令行上調用時帶有成員id 號碼,則edit_member 查找這個項目的已有內容,然后提示更新每一列。如果輸入一列的值,則其替換當前的值。如果按enter 鍵,這列并不更改(如果不知道成員的id 號碼,可以運行show_member last_name 來查找其內容)。
    如果只想更新成員的終止日期,則允許編輯全部項目的這種方式可能是不必要的過度行動。另一方面,類似這樣的腳本也提供了一種簡單的通用目的方式,來更新一個項目的任何部分而不必了解sql 的任何知識(一種特殊的情況為edit_member 不允許更改member_id 域,因為當創(chuàng)建一個項目時,自動地分配這個域,并且在以后不能更改)。
    edit_member 需要了解的第一件事為member 表中這些列的名稱:

    然后我們可以輸入主體循環(huán):

    創(chuàng)建新成員項目的代碼如下所示。它請求每個member 表列,然后發(fā)布一條insert 語句以增加一條新記錄:


    new_member( )所用的提示例程如下所示:

    col_prompt( ) 帶有$show_current 參數的原因是,當這個腳本用于更新項目時,我們也對已有成員項目請求的列值使用這個函數。當創(chuàng)建新的項目時, $show_current 將為0,因為當前沒有值可以顯示。在編輯一個已有項目時,它將為非零。后一種情況中的提示將顯示當前的值,用戶可以簡單地通過按enter 鍵來接受。
    編輯已有成員的代碼類似于創(chuàng)建新成員的代碼。然而,我們有一個可操作的項目,所以提示例程顯示當前項目的值,并且edit_member( ) 函數發(fā)布一條update 語句,而不是insert語句:

    edit_member 的問題為它不進行任何輸入值校驗。對于member 表中的大多數域,都沒有什么校驗——它們只是字符串域。但是對于expiration 列,實際上應該檢查輸入值,以便確保它們看起來像日期。在一般目標的數據輸入應用程序中,可能想抽取有關表的信息,以便確定它的所有列的類型。然后,可能按照那些類型上的約束條件來校驗。那就比我在這里想探求的內容涉及得更多,所以我只在col_prompt( ) 函數中增加一個快速方法,以便如果列名為“e x p i r a t i o n”,則檢查輸入的格式。最低限度的日期值檢查可以這樣來做:


    這個模板測試了非數字字符分隔的三個序列的數字。這只是檢查的一部分,因為它沒有偵測如“ 1999 - 14 - 2 2”的值為無效。要想使腳本更好,則應該給它更嚴格的日期檢查以及其他檢查,如需要名和姓的域,就應該給非空值。
    一些其他的改進可能是,如果沒有更改列,則跳過這個更新,當用戶正在編輯它時,如果其他一些人已經更改了這條記錄,則通知這個用戶??梢酝ㄟ^保存成員項目列的原始數據來做到這一點,然后,編寫update語句來只更新那些已經更改的列。如果沒有,則甚至不需要發(fā)布這條語句。同樣,對于每個原始列值,可以編寫where 子句來包括a n d col_name = col_val。如果其他一些人已經更改了這條記錄,則這可能導致update失敗,此時它的反饋為,兩個人要同時更改這個項目。

尋找共同興趣的歷史同盟成員

    歷史同盟秘書的責任之一就是處理成員的請求,這些成員可能要求對美國歷史領域內特殊時期或特殊人物(如在大蕭條中或者亞伯拉罕·林肯的生命)感興趣的其他人清單。當在字處理程序文檔中維護這個目錄時,使用字處理程序的“ f i n d”功能,可以非常容易地找到這樣的成員。然而,產生一列只含有合格成員的項就要困難一些,因為它涉及大量的拷貝和粘貼。使用mysql,工作就變得容易得多,因為我們可以只運行如下這樣的查詢:
    select * from member where interests like "%lincoln%"
    order by last_name,first_name
    不幸的是,如果在mysql客戶機程序運行這個查詢,則結果看上去并不是非常好。讓我們把少量的dbi 腳本和生成較漂亮的輸出的interests 放在一起。首先,檢查一下腳本,確保在命令行至少有一個命名的參數,因為如果沒有一個命名的參數就沒有內容可以搜索。然后,對于每個參數,腳本在member 表的interests 列上運行一個查詢:

    為了搜索關鍵字字符串,我們在每一邊都放了通配符‘ %’,以便可以在interests 列的任何地方都可以找到這個字符串。然后,我們顯示相匹配的項:


    這里沒有出現format_entry( ) 函數。它與gen_dir 腳本的函數format_rtf_entry( ) 在本質上是相同的,但format_entry( ) 函數去掉了rtf 控制字。

聯機歷史同盟目錄

    在7 . 4節(jié)中,我們將開始編寫連接到mysql服務器并抽取信息的腳本,還要編寫以web頁面形式在客戶機的web 瀏覽器中出現的信息。那些腳本按照客戶機請求動態(tài)地生成了h t m l。在我們到達那一點之前,讓我們通過編寫生成能裝載到web 服務器文檔樹中的靜態(tài)
html 文檔的dbi 代碼,開始考慮有關的h t m l。以html 格式創(chuàng)建的歷史同盟目錄是最好的選擇,因為我們的目標之一就是無論如何要使目錄聯機。
    一般來說,html 文檔有點像下面這樣的結構:

    為了以這種格式生成目錄,編寫完整的腳本對于你來講并不必要?;叵胍幌?,當我們編寫gen_dir 腳本時,我們使用了可擴展的框架,因此,為了以其他格式產生目錄而插入了代碼。這意味著假如代碼生成了html 輸出,我們則需要編寫文檔初始化和清除的函數,和格式化單獨項一樣。然后我們需要創(chuàng)建轉換盒元素來指向這些函數。
    只顯示出的聯機文檔非常容易地分解為可以由初始化函數和清除函數處理的序言和收尾部分,以及由項目格式化函數生成的中間部分。html 初始化函數生成級別1標題的每一部分,而清除函數生成關閉</body> 和</html> 標記的部分:

    一般來說,真正的工作在于格式化項目。但即使這樣也不太困難。我們可以拷貝format_rtf_entry( ) 函數,確保項目中的任何特殊字符都被編碼,并且用html 標出的標志替換rtf 控制字:

    現在我們把另一個元素加到轉換盒中,指出編寫html 的函數,并且完成對g e n _ d i r的更正:

    為了產生html 格式的目錄,運行下面的命令并在web 服務器的文檔樹中安裝結果輸出文件:
    % gen_dir html > directory.html
    當更新目錄時,可以再次運行命令來更新聯機版本。另一個方案是建立周期性執(zhí)行的cron 作業(yè)。那就是說,聯機目錄將被自動地更新。例如,我可能使用類似于這個的crontab 項在每天早晨4點運行g e n _ d i r:
    04****/u/paul/samp_db/gen_dir>/usr/local/apache/htdocs/directory.html
    這個cron 作業(yè)所運行的用戶必須允許它們都執(zhí)行位于samp_db 目錄中的腳本,并將文件編寫到web服務器的文檔樹中。
  • 本文來源于網頁設計愛好者web開發(fā)社區(qū)http://www.html.org.cn收集整理,歡迎訪問。
  • 發(fā)表評論 共有條評論
    用戶名: 密碼:
    驗證碼: 匿名發(fā)表
    日韩欧美一级二级三级久久久| 91丨九色丨蝌蚪丨对白| 国产精品久久久久久久久粉嫩av| 亚洲国产成人久久综合| 免费在线观看黄色| 久久这里只有精品99| 国产资源在线看| 久久久噜噜噜久久| 久久99国产精品久久99果冻传媒| 无码人妻h动漫| 国产日韩精品一区二区| 欧美手机视频| 91tv官网精品成人亚洲| 亚洲色在线视频| 色猫猫成人app| 久久久久久亚洲精品不卡4k岛国| 91亚洲精选| 亚洲电影一级片| 亚洲天堂视频在线播放| 久久精品国产一区二区三区日韩| 欧美爱爱视频网站| 污视频在线观看免费网站| 久久色中文字幕| 欧美影院精品一区| 久久免费少妇高潮久久精品99| 国产脚交av在线一区二区| 亚洲欧美日韩一区二区| 亚洲精品影视在线| 日本高清视频网站www| 日本国产一区| 亚洲激情视频| 亚洲一二三四区不卡| 精品免费99久久| 国产成人亚洲综合a∨猫咪| 尤物视频免费观看| 欧美69精品久久久久久不卡| 成人午夜无人区一区二区| 国产精品一区二区免费视频| 欧美成人sm免费视频| www.久久| 99久久久无码国产精品性波多| 亚洲不卡免费视频| aaa国产精品视频| 国产熟女一区二区| 国产精品人人人人| 女厕嘘嘘一区二区在线播放| 国产精品毛片在线| 一区二区高清免费观看影视大全| 国产精品一区二区精品| 女人床在线观看| 美女扒开腿让男人桶爽久久软| 韩国成人动漫在线观看| zzijzzij亚洲日本成熟少妇| 中文字幕永久视频| 国产免费一区视频观看免费| 中文在线中文字幕| 色婷婷成人在线| 久草资源在线视频| 中文字幕人成高清视频| 久久久久久久美女| 国产免费一区二区三区在线观看| 日韩在线理论| 91精品视频在线播放| 亚洲精品视频在线播放| 久久久久亚洲蜜桃| 精品伦理精品一区| 午夜精品久久久久久久99老熟妇| 国产99在线|中文| 毛片av在线播放| 国产精品热久久久久夜色精品三区| 日韩xxxx视频| 欧美特级xxxxbbbb毛片| 亚洲wwwav| 热99精品只有里视频最新| 九色porny极品| 欧美午夜精品电影| 国产福利小视频在线| 精品国产999久久久免费| av色综合久久天堂av色综合在| 久久久久久国产视频| 丰满放荡岳乱妇91ww| 深爱激情久久| 在线观看视频在线观看| 国内外成人免费激情在线视频| 国产精品一二三区| 91在线视频网址| 777片理伦片在线观看| 亚洲欧美日韩中文字幕在线观看| 国产福利免费在线观看| 蜜桃av在线播放| 91精品天堂福利在线观看| 国产日韩av一区二区| 亚洲图区一区| 日韩欧美精品一区二区三区经典| 老司机激情视频| 色综合色综合久久综合频道88| 久久99精品国产自在现线小黄鸭| 欧美午夜aaaaaa免费视频| av不卡免费在线观看| 国产精品一区二区日韩| 国产专区精品| 久久影院资源网| 1769国产精品视频| 中文字幕在线观看视频网站| ...中文天堂在线一区| 国产精品999.| 日韩欧美视频在线免费观看| 精品美女一区二区三区| 一级黄色大片视频| 精品成人av| 91老司机精品视频| 97超碰资源站在线观看| 黑人巨大精品欧美一区| 免费久久一级欧美特大黄| 懂色av粉嫩av蜜乳av| 新婚的少妇hd中文字幕| 91福利小视频| 亚洲天堂手机版| 亚洲三级在线观看视频| 日韩视频在线一区二区| 日韩欧美一区三区| 色偷偷亚洲第一成人综合网址| 亚洲黄色性网站| 成人黄页网站视频| 韩日电影在线观看| 天天操夜夜爽| 91牛牛免费视频| 国产精品一区二区三区久久久| 精品国产99久久久久久宅男i| 欧美brazzers| 日韩中文字幕在线视频播放| 国产一区二区三区| 久久99久久久久久久噜噜| 亚洲美女偷拍久久| 鬼打鬼之黄金道士1992林正英| 日韩电影大片中文字幕| aaa一级黄色片| 97视频网站| 揉丰满老妇老女人的毛片| 丝袜 亚洲 另类 欧美 重口| 黄色片视频在线观看| 蜜臀av性久久久久蜜臀aⅴ四虎| 久久精品免视着国产成人| 天堂99x99es久久精品免费| 国产精品三区在线观看| 香蕉久久一区二区不卡无毒影院| 国产精品一区二区在线| 国产精品极品美女在线观看免费| 喜爱夜蒲2在线| 欧美aⅴ一区二区三区视频| 日韩av在线播放资源| 欧美激情成人在线视频| 午夜久久福利| 成人激情视频小说免费下载| 国产日韩网站| 91网站在线观看视频| 成人a免费视频| 97人人在线| 久久久久久日产精品| 国产麻豆91视频| 91成人免费在线观看| 中文字幕精品一区二区三区在线| 国产成+人+日韩+欧美+亚洲| 欧美激情亚洲视频| 欧美自拍偷拍午夜视频| 精品无吗乱吗av国产爱色| 亚洲精品在线一区二区| 精品久久久久久久一区二区蜜臀| 国产成人无码a区在线观看视频| 国产精品成人久久久久| 国产中文字幕在线看| 五月天六月丁香| 亚洲黄色免费网站| 色综合久久网女同蕾丝边| melody高清在线观看| 久久久天堂av| 国产最顶级的黄色片在线免费观看| 日韩欧美性视频| 999久久久国产999久久久| 免费日韩精品中文字幕视频在线| 超碰成人免费在线| 中文字幕一区二区在线播放| 欧美午夜影院一区| 男人影院在线观看| 欧美ab在线视频| 日本女优一区| xfplay每日更新av资源| 18欧美乱大交| 午夜视频国产| 制服丝袜中文字幕在线观看| 国产欧美视频在线观看| 国产精品久久久久久人| 久久露脸国语精品国产91| 最近中文字幕在线中文高清版| 亚洲国产毛片aaaaa无费看| 91av久久久| 大地资源第二页在线观看高清版| 夜夜嗨av一区二区三区四区| 欧美亚洲免费| 国产精品久久久久久亚洲色| 国产美女av| 在线视频一区二区| 99国产一区| 久久久人成影片免费观看| 美女黄a一级视频| 一区视频在线看| 91视频福利网| 99久久99久久久精品齐齐| 免费看成年视频网页| 欧美日韩精品一区二区天天拍小说| 97精品超碰一区二区三区| www.我爱av| 国产成人福利视频| 国产成人久久久精品一区| 男人天堂欧美日韩| 岛国av一区二区在线在线观看| 国产精品日韩成人| 国产va免费精品高清在线观看| 最新在线中文字幕| 国产精品久在线观看| 日韩午夜电影av| 欧美私人免费视频| 一区二区三区www污污污网站| 91丨九色丨黑人外教| 国产一二在线播放| 国产91在线高潮白浆在线观看| 国产精品免费视频一区| 国产一区二区电影在线观看| 精品精品国产高清一毛片一天堂| 欧美日韩精品二区| 秘密影院久久综合亚洲综合| 色综合久久久久| 欧美午夜视频在线观看| 久久久亚洲国产美女国产盗摄| 俄罗斯毛片基地| 四虎影视永久免费在线观看一区二区三区| 亚洲性无码av在线| 国产精品视频资源| 天天做天天爱综合| 黄色资源在线看| 91亚洲国产成人久久精品麻豆| 50一60岁老妇女毛片| 女人扒开双腿让男人捅| 高清美女视频一区| 人成免费电影一二三区在线观看| 天天操天天干天天玩| 久久久久五月天| 国产精品久久久久一区二区三区| 91国偷自产一区二区使用方法| 成人av先锋影音| 丝袜理论片在线观看| 日韩精品一区二区三区蜜臀| 日韩亚洲欧美在线观看| 亚洲国产91| 国产乱码精品一区二区三区日韩精品| 国产一线二线三线女| 欧美人体视频xxxxx| 日韩乱码人妻无码中文字幕久久| 18成年在线观看| 亚洲精品麻豆| 三日本三级少妇三级99| 国产成人在线观看| 国产极品视频在线观看| 在线观看中文字幕av| 91精品国产成人www| 欧美激情精品久久久久久免费印度| 亚欧黄色av| 国产精品影院在线| 久久亚洲综合网| 亚洲一区二区三区高清视频| 久草视频免费看| 欧洲国产精品| 国产一区二区三区四区hd| 欧美娇小性xxxx| 看欧美ab黄色大片视频免费| 欧洲色大大久久| 国产日韩欧美一区| 中文天堂最新版本在线观看| 欧美日韩一区二区三区在线| 欧美视频成人| 国产日韩欧美在线播放不卡| 亚洲啪啪av| 国产精品久久久久77777丨| 成人美女视频在线观看18| 伊人春色之综合网| 午夜精品久久久久久久久久蜜桃| 在线看av的网址| 人成在线免费视频| 天天综合成人网| 成人高清dvd| 石原莉奈在线亚洲三区| 精品视频一区二区不卡| 国产无遮挡又黄又爽免费网站| 精品国产乱码久久久久久久| 欧美一区二区三区成人久久片| 欧美色欧美亚洲另类二区| 蜜臀一区二区三区| 992tv成人国产福利在线| 一本大道熟女人妻中文字幕在线| 欧美深性狂猛ⅹxxx深喉| 国产成人黄色| 亚洲免费观看视频| 一个人看的视频www| 国产精品第一区| 成人观看免费视频| 在线观看亚洲黄色| 亚洲自拍偷拍一区二区| 亚洲精品国精品久久99热| 成人免费在线视频网址| 久久福利视频网| 最新黄色av网站| 欧美成人久久久| 国产av第一区| 日韩精品一区二区三区免费观看| 欧美区一区二| 一区二区高清| 欧美成人黄色网址| 十八禁一区二区三区| 欧美丝袜一区二区三区| 精品一区二区免费视频| 性日韩欧美在线视频| 欧美日韩精品免费观看视欧美高清免费大片| 91精品国产综合久久久久久久久| 国产精品嫩模av在线| 久久久久久久久国产| 成人美女黄网站| 激情小说网站亚洲综合网| 福利视频免费在线观看|