日本免费精品_最新日韩一区_亚洲视频一区在线_a在线视频观看_天天射夜夜骑_粉嫩av一区二区三区_欧美中日韩免费视频_综合图区欧美_国内精品美女在线观看_午夜精品久久久久久久男人的天堂

首頁(yè) > 編程 > PHP > 正文

Php高級(jí)知識(shí)2

2020-03-22 20:32:35
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
  • 8、PHP html' target='_blank'>Cookies

    cookie 常用于識(shí)別用戶。

    8.1 什么是 Cookie?

    cookie 常用于識(shí)別用戶。cookie 是服務(wù)器留在用戶計(jì)算機(jī)中的小文件。每當(dāng)相同的計(jì)算機(jī)通過(guò)瀏覽器請(qǐng)求頁(yè)面時(shí),它同時(shí)會(huì)發(fā)送 cookie。通過(guò) PHP,您能夠創(chuàng)建并取回 cookie 的值。

    8.2 如何創(chuàng)建 cookie?

    setcookie() 函數(shù)用于設(shè)置 cookie。

    注釋:setcookie() 函數(shù)必須位于 <html> 標(biāo)簽之前。

    語(yǔ)法
    setcookie(name, value, expire, path, domain);
    例子

    在下面的例子中,我們將創(chuàng)建名為 "user" 的 cookie,把為它賦值 "Alex Porter"。我們也規(guī)定了此 cookie 在一小時(shí)后過(guò)期:

    <?php setcookie("user", "Alex Porter", time()+3600);?><html><body></body></html>

    注釋:在發(fā)送 cookie 時(shí),cookie 的值會(huì)自動(dòng)進(jìn)行 URL 編碼,在取回時(shí)進(jìn)行自動(dòng)解碼(為防止 URL 編碼,請(qǐng)使用 setrawcookie() 取而代之)。

    8.3 如何取回 Cookie 的值?

    PHP 的 $_COOKIE 變量用于取回 cookie 的值。

    在下面的例子中,我們?nèi)』亓嗣麨?"user" 的 cookie 的值,并把它顯示在了頁(yè)面上:

    <?php// Print a cookieecho $_COOKIE["user"];// A way to view all cookiesprint_r($_COOKIE);?>

    在下面的例子中,我們使用 isset() 函數(shù)來(lái)確認(rèn)是否已設(shè)置了 cookie:

    <html><body><?phpif (isset($_COOKIE["user"]))  echo "Welcome " . $_COOKIE["user"] . "!<br />";else  echo "Welcome guest!<br />";?></body></html>
    8.4 如何刪除 cookie?

    當(dāng)刪除 cookie 時(shí),您應(yīng)當(dāng)使過(guò)期日期變更為過(guò)去的時(shí)間點(diǎn)。

    刪除的例子:

    <?php // set the expiration date to one hour agosetcookie("user", "", time()-3600);?>
    8.5 如果瀏覽器不支持 cookie 該怎么辦?

    如果應(yīng)用程序涉及不支持 cookie 的瀏覽器,應(yīng)采取其他方法在應(yīng)用程序中從一張頁(yè)面向另一張頁(yè)面?zhèn)鬟f信息。一種方式是從表單傳遞數(shù)據(jù)(有關(guān)表單和用戶輸入的內(nèi)容,在前面已介紹過(guò)了)。

    下面的表單在用戶單擊提交按鈕時(shí)向 "welcome.php" 提交了用戶輸入:

    <html><body><form action="welcome.php" method="post">Name: <input type="text" name="name" />Age: <input type="text" name="age" /><input type="submit" /></form></body></html>

    取回 "welcome.php" 中的值,就像這樣:

    <html><body>Welcome <?php echo $_POST["name"]; ?>.<br />You are <?php echo $_POST["age"]; ?> years old.</body></html>

    9、PHP Sessions

    PHP session 變量用于存儲(chǔ)有關(guān)用戶會(huì)話的信息,或更改用戶會(huì)話的設(shè)置。Session 變量保存的信息是單一用戶的,并且可供應(yīng)用程序中的所有頁(yè)面使用。

    9.1 PHP Session 變量

    當(dāng)運(yùn)行一個(gè)應(yīng)用程序時(shí),會(huì)打開(kāi)它,做些更改,然后關(guān)閉它。這很像一次會(huì)話。計(jì)算機(jī)清楚你是誰(shuí)。它知道你何時(shí)啟動(dòng)應(yīng)用程序,并在何時(shí)終止。但是在因特網(wǎng)上,存在一個(gè)問(wèn)題:服務(wù)器不知道你是誰(shuí)以及你做什么,這是由于 HTTP 地址不能維持狀態(tài)。

    通過(guò)在服務(wù)器上存儲(chǔ)用戶信息以便隨后使用,PHP session 解決了這個(gè)問(wèn)題(比如用戶名稱、購(gòu)買商品等)。不過(guò),會(huì)話信息是臨時(shí)的,在用戶離開(kāi)網(wǎng)站后將被刪除。如果需要永久儲(chǔ)存信息,可以把數(shù)據(jù)存儲(chǔ)在數(shù)據(jù)庫(kù)中。

    Session 的工作機(jī)制是:為每個(gè)訪問(wèn)者創(chuàng)建一個(gè)唯一的 id (UID),并基于這個(gè) UID 來(lái)存儲(chǔ)變量。UID 存儲(chǔ)在 cookie 中,亦或通過(guò) URL 進(jìn)行傳導(dǎo)。

    9.2 開(kāi)始 PHP Session

    在把用戶信息存儲(chǔ)到 PHP session 中之前,首先必須啟動(dòng)會(huì)話。

    注釋:session_start() 函數(shù)必須位于 <html> 標(biāo)簽之前:

    <?php session_start(); ?><html><body></body></html>

    上面的代碼會(huì)向服務(wù)器注冊(cè)用戶的會(huì)話,以便您可以開(kāi)始保存用戶信息,同時(shí)會(huì)為用戶會(huì)話分配一個(gè) UID。

    9.3 存儲(chǔ) Session 變量

    存儲(chǔ)和取回 session 變量的正確方法是使用 PHP $_SESSION 變量:

    <?phpsession_start();// store session data$_SESSION['views']=1;?><html><body><?php//retrieve session dataecho "Pageviews=". $_SESSION['views'];?></body></html>

    輸出:

    Pageviews=1

    在下面的例子中,我們創(chuàng)建了一個(gè)簡(jiǎn)單的 page-view 計(jì)數(shù)器。isset() 函數(shù)檢測(cè)是否已設(shè)置 "views" 變量。如果已設(shè)置 "views" 變量,我們累加計(jì)數(shù)器。如果 "views" 不存在,則我們創(chuàng)建 "views" 變量,并把它設(shè)置為 1:

    <?phpsession_start();if(isset($_SESSION['views']))  $_SESSION['views']=$_SESSION['views']+1;else  $_SESSION['views']=1;echo "Views=". $_SESSION['views'];?>
    9.4 終結(jié) Session

    如果希望刪除某些 session 數(shù)據(jù),可以使用 unset() 或 session_destroy() 函數(shù)。

    unset() 函數(shù)用于釋放指定的 session 變量:

    <?phpunset($_SESSION['views']);?>

    您也可以通過(guò) session_destroy() 函數(shù)徹底終結(jié) session:

    <?phpsession_destroy();?>

    注釋:session_destroy() 將重置 session,您將失去所有已存儲(chǔ)的 session 數(shù)據(jù)。

    10、PHP 發(fā)送電子郵件

    PHP 允許您從腳本直接發(fā)送電子郵件。

    10.1 PHP mail() 函數(shù)

    PHP mail() 函數(shù)用于從腳本中發(fā)送電子郵件。

    語(yǔ)法
    mail(to,subject,message,headers,parameters)

    參數(shù) 描述 to 必需。規(guī)定 email 接收者。 subject 必需。規(guī)定 email 的主題。注釋:該參數(shù)不能包含任何新行字符。 message 必需。定義要發(fā)送的消息。應(yīng)使用 LF ( ) 來(lái)分隔各行。 headers

    可選。規(guī)定附加的標(biāo)題,比如 From、Cc 以及 Bcc。

    應(yīng)當(dāng)使用 CRLF ( ) 分隔附加的標(biāo)題。

    parameters 可選。對(duì)郵件發(fā)送程序規(guī)定額外的參數(shù)

    注釋:PHP 需要一個(gè)已安裝且正在運(yùn)行的郵件系統(tǒng),以便使郵件函數(shù)可用。所用的程序通過(guò)在 php.ini 文件中的配置設(shè)置進(jìn)行定義。

    10.2 PHP 簡(jiǎn)易 E-Mail

    通過(guò) PHP 發(fā)送電子郵件的最簡(jiǎn)單的方式是發(fā)送一封文本 email。

    在下面的例子中,我們首先聲明變量($to, $subject, $message, $from, $headers),然后我們?cè)?mail() 函數(shù)中使用這些變量來(lái)發(fā)送了一封 e-mail:

    <?php$to = "someone@example.com";$subject = "Test mail";$message = "Hello! This is a simple email message.";$from = "someonelse@example.com";$headers = "From: $from";mail($to,$subject,$message,$headers);echo "Mail Sent.";?>
    10.3 PHP Mail Form

    通過(guò) PHP,能夠在自己的站點(diǎn)制作一個(gè)反饋表單。下面的例子向指定的 e-mail 地址發(fā)送了一條文本消息:

    <html><body><?phpif (isset($_REQUEST['email']))//if "email" is filled out, send email  {  //send email  $email = $_REQUEST['email'] ;   $subject = $_REQUEST['subject'] ;  $message = $_REQUEST['message'] ;  mail( "someone@example.com", "Subject: $subject",  $message, "From: $email" );  echo "Thank you for using our mail form";  }else//if "email" is not filled out, display the form  {  echo "<form method='post' action='mailform.php'>  Email: <input name='email' type='text' /><br />  Subject: <input name='subject' type='text' /><br />  Message:<br />  <textarea name='message' rows='15' cols='40'>  </textarea><br />  <input type='submit' />  </form>";  }?></body></html>
    例子解釋:首先,檢查是否填寫了郵件輸入框如果未填寫(比如在頁(yè)面被首次訪問(wèn)時(shí)),輸出 HTML 表單如果已填寫(在表單被填寫后),從表單發(fā)送郵件當(dāng)點(diǎn)擊提交按鈕后,重新載入頁(yè)面,顯示郵件發(fā)送成功的消息

    11、PHP 安全的電子郵件

    在前面的 PHP e-mail 腳本中,存在著一個(gè)漏洞。

    11.1 PHP E-mail 注入

    首先,請(qǐng)看前面的 PHP 代碼:

    <html><body><?phpif (isset($_REQUEST['email']))//if "email" is filled out, send email  {  //send email  $email = $_REQUEST['email'] ;   $subject = $_REQUEST['subject'] ;  $message = $_REQUEST['message'] ;  mail("someone@example.com", "Subject: $subject",  $message, "From: $email" );  echo "Thank you for using our mail form";  }else//if "email" is not filled out, display the form  {  echo "<form method='post' action='mailform.php'>  Email: <input name='email' type='text' /><br />  Subject: <input name='subject' type='text' /><br />  Message:<br />  <textarea name='message' rows='15' cols='40'>  </textarea><br />  <input type='submit' />  </form>";  }?></body></html>

    以上代碼存在的問(wèn)題是,未經(jīng)授權(quán)的用戶可通過(guò)輸入表單在郵件頭部插入數(shù)據(jù)。

    假如用戶在表單中的輸入框內(nèi)加入這些文本,會(huì)出現(xiàn)什么情況呢?

    someone@example.com%0ACc:person2@example.com%0ABcc:person3@example.com,person3@example.com,anotherperson4@example.com,person5@example.com%0ABTo:person6@example.com

    與往常一樣,mail() 函數(shù)把上面的文本放入郵件頭部,那么現(xiàn)在頭部有了額外的 Cc:, Bcc: 以及 To: 字段。當(dāng)用戶點(diǎn)擊提交按鈕時(shí),這封 e-mail 會(huì)被發(fā)送到上面所有的地址!

    11.2 PHP 防止 E-mail 注入

    防止 e-mail 注入的最好方法是對(duì)輸入進(jìn)行驗(yàn)證。

    下面的代碼增加了檢測(cè)表單中 email 字段的輸入驗(yàn)證程序:

    <html><body><?phpfunction spamcheck($field)  {  //filter_var() sanitizes the e-mail   //address using FILTER_SANITIZE_EMAIL  $field=filter_var($field, FILTER_SANITIZE_EMAIL);    //filter_var() validates the e-mail  //address using FILTER_VALIDATE_EMAIL  if(filter_var($field, FILTER_VALIDATE_EMAIL))    {    return TRUE;    }  else    {    return FALSE;    }  }if (isset($_REQUEST['email']))  {//if "email" is filled out, proceed  //check if the email address is invalid  $mailcheck = spamcheck($_REQUEST['email']);  if ($mailcheck==FALSE)    {    echo "Invalid input";    }  else    {//send email    $email = $_REQUEST['email'] ;     $subject = $_REQUEST['subject'] ;    $message = $_REQUEST['message'] ;    mail("someone@example.com", "Subject: $subject",    $message, "From: $email" );    echo "Thank you for using our mail form";    }  }else  {//if "email" is not filled out, display the form  echo "<form method='post' action='mailform.php'>  Email: <input name='email' type='text' /><br />  Subject: <input name='subject' type='text' /><br />  Message:<br />  <textarea name='message' rows='15' cols='40'>  </textarea><br />  <input type='submit' />  </form>";  }?></body></html>

    在上面的代碼中,我們使用了 PHP 過(guò)濾器來(lái)對(duì)輸入進(jìn)行驗(yàn)證:

    FILTER_SANITIZE_EMAIL 從字符串中刪除電子郵件的非法字符FILTER_VALIDATE_EMAIL 驗(yàn)證電子郵件地址12、PHP 錯(cuò)誤處理

    在 PHP 中,默認(rèn)的錯(cuò)誤處理很簡(jiǎn)單。一條消息會(huì)被發(fā)送到瀏覽器,這條消息帶有文件名、行號(hào)以及一條描述錯(cuò)誤的消息。

    12.1 PHP 錯(cuò)誤處理

    在創(chuàng)建腳本和 web 應(yīng)用程序時(shí),錯(cuò)誤處理是一個(gè)重要的部分。如果代碼缺少錯(cuò)誤檢測(cè)編碼,那么程序看上去很不專業(yè),也為安全風(fēng)險(xiǎn)敞開(kāi)了大門。

    下面介紹 PHP 中一些最為重要的錯(cuò)誤檢測(cè)方法。

    介紹不同的錯(cuò)誤處理方法:

    簡(jiǎn)單的 "die()" 語(yǔ)句 自定義錯(cuò)誤和錯(cuò)誤觸發(fā)器錯(cuò)誤報(bào)告12.2 基本的錯(cuò)誤處理:使用 die() 函數(shù)

    第一個(gè)例子展示了一個(gè)打開(kāi)文本文件的簡(jiǎn)單腳本:

    <?php$file=fopen("welcome.txt","r");?>

    如果文件不存在,會(huì)獲得類似這樣的錯(cuò)誤:

    Warning: fopen(welcome.txt) [function.fopen]: failed to open stream: No such file or directory in C:webfolder	est.php on line 2

    為了避免用戶獲得類似上面的錯(cuò)誤消息,在訪問(wèn)文件之前檢測(cè)該文件是否存在:

    <?phpif(!file_exists("welcome.txt")) { die("File not found"); }else { $file=fopen("welcome.txt","r"); }?>

    現(xiàn)在,假如文件不存在,會(huì)得到類似這樣的錯(cuò)誤消息:

    File not found

    比起之前的代碼,上面的代碼更有效,這是由于它采用了一個(gè)簡(jiǎn)單的錯(cuò)誤處理機(jī)制在錯(cuò)誤之后終止了腳本。

    不過(guò),簡(jiǎn)單地終止腳本并不總是恰當(dāng)?shù)姆绞健?/p>12.3 創(chuàng)建自定義錯(cuò)誤處理器

    創(chuàng)建一個(gè)自定義的錯(cuò)誤處理器非常簡(jiǎn)單。簡(jiǎn)單地創(chuàng)建了一個(gè)專用函數(shù),可以在 PHP 中發(fā)生錯(cuò)誤時(shí)調(diào)用該函數(shù)。

    該函數(shù)必須有能力處理至少兩個(gè)參數(shù) (error level 和 error message),但是可以接受最多五個(gè)參數(shù)(可選的:file, line-number 以及 error context):

    語(yǔ)法
    error_function(error_level,error_message,error_file,error_line,error_context)
    參數(shù) 描述 error_level

    必需。為用戶定義的錯(cuò)誤規(guī)定錯(cuò)誤報(bào)告級(jí)別。必需是一個(gè)值數(shù)

    參見(jiàn)下面的表格:錯(cuò)誤報(bào)告級(jí)別 error_message 必需。為用戶定義的錯(cuò)誤規(guī)定錯(cuò)誤消息。 error_file 可選。規(guī)定錯(cuò)誤在其中發(fā)生的文件名。 error_line 可選。規(guī)定錯(cuò)誤發(fā)生的行號(hào)。 error_context 可選。規(guī)定一個(gè)數(shù)組,包含了當(dāng)錯(cuò)誤發(fā)生時(shí)在用的每個(gè)變量以及它們的值。
    12.4 錯(cuò)誤報(bào)告級(jí)別

    這些錯(cuò)誤報(bào)告級(jí)別是錯(cuò)誤處理程序旨在處理的錯(cuò)誤的不同的類型:

    值 常量 描述 2 E_WARNING 非致命的 run-time 錯(cuò)誤。不暫停腳本執(zhí)行。 8 E_NOTICE

    Run-time 通知。

    腳本發(fā)現(xiàn)可能有錯(cuò)誤發(fā)生,但也可能在腳本正常運(yùn)行時(shí)發(fā)生。

    256 E_USER_ERROR 致命的用戶生成的錯(cuò)誤。這類似于程序員使用 PHP 函數(shù) trigger_error() 設(shè)置的 E_ERROR。 512 E_USER_WARNING 非致命的用戶生成的警告。這類似于程序員使用 PHP 函數(shù) trigger_error() 設(shè)置的 E_WARNING。 1024 E_USER_NOTICE 用戶生成的通知。這類似于程序員使用 PHP 函數(shù) trigger_error() 設(shè)置的 E_NOTICE。 4096 E_RECOVERABLE_ERROR 可捕獲的致命錯(cuò)誤。類似 E_ERROR,但可被用戶定義的處理程序捕獲。(參見(jiàn) set_error_handler()) 8191 E_ALL

    所有錯(cuò)誤和警告,除級(jí)別 E_STRICT 以外。

    (在 PHP 6.0,E_STRICT 是 E_ALL 的一部分)

    錯(cuò)誤報(bào)告級(jí)別

    現(xiàn)在,讓我們創(chuàng)建一個(gè)處理錯(cuò)誤的函數(shù):

    function customError($errno, $errstr) {  echo "<b>Error:</b> [$errno] $errstr<br />"; echo "Ending Script"; die(); }

    上面的代碼是一個(gè)簡(jiǎn)單的錯(cuò)誤處理函數(shù)。當(dāng)它被觸發(fā)時(shí),它會(huì)取得錯(cuò)誤級(jí)別和錯(cuò)誤消息。然后它會(huì)輸出錯(cuò)誤級(jí)別和消息,并終止腳本。

    現(xiàn)在,我們已經(jīng)創(chuàng)建了一個(gè)錯(cuò)誤處理函數(shù),我們需要確定在何時(shí)觸發(fā)該函數(shù)。

    12.5 Set Error Handler

    PHP 的默認(rèn)錯(cuò)誤處理程序是內(nèi)建的錯(cuò)誤處理程序。想把上面的函數(shù)改造為腳本運(yùn)行期間的默認(rèn)錯(cuò)誤處理程序。

    可以修改錯(cuò)誤處理程序,使其僅應(yīng)用到某些錯(cuò)誤,這樣腳本就可以不同的方式來(lái)處理不同的錯(cuò)誤。不過(guò),在本例中,針對(duì)所有錯(cuò)誤來(lái)使用我們的自定義錯(cuò)誤處理程序:

    set_error_handler("customError");

    由于希望自定義函數(shù)來(lái)處理所有錯(cuò)誤,set_error_handler() 僅需要一個(gè)參數(shù),可以添加第二個(gè)參數(shù)來(lái)規(guī)定錯(cuò)誤級(jí)別。

    實(shí)例

    通過(guò)嘗試輸出不存在的變量,來(lái)測(cè)試這個(gè)錯(cuò)誤處理程序:

    <?php//error handler functionfunction customError($errno, $errstr) {  echo "<b>Error:</b> [$errno] $errstr"; }//set error handlerset_error_handler("customError");//trigger errorecho($test);?>

    以上代碼的輸出應(yīng)該類似這樣:

    Error: [8] Undefined variable: test
    12.6 觸發(fā)錯(cuò)誤

    在腳本中用戶輸入數(shù)據(jù)的位置,當(dāng)用戶的輸入無(wú)效時(shí)觸發(fā)錯(cuò)誤的很有用的。在 PHP 中,這個(gè)任務(wù)由 trigger_error() 完成。

    例子

    在本例中,如果 "test" 變量大于 "1",就會(huì)發(fā)生錯(cuò)誤:

    <?php$test=2;if ($test>1){trigger_error("Value must be 1 or below");}?>

    以上代碼的輸出應(yīng)該類似這樣:

    Notice: Value must be 1 or belowin C:webfolder	est.php on line 6

    可以在腳本中任何位置觸發(fā)錯(cuò)誤,通過(guò)添加的第二個(gè)參數(shù),能夠規(guī)定所觸發(fā)的錯(cuò)誤級(jí)別。

    可能的錯(cuò)誤類型:E_USER_ERROR - 致命的用戶生成的 run-time 錯(cuò)誤。錯(cuò)誤無(wú)法恢復(fù)。腳本執(zhí)行被中斷。E_USER_WARNING - 非致命的用戶生成的 run-time 警告。腳本執(zhí)行不被中斷。E_USER_NOTICE - 默認(rèn)。用戶生成的 run-time 通知。腳本發(fā)現(xiàn)了可能的錯(cuò)誤,也有可能在腳本運(yùn)行正常時(shí)發(fā)生。例子

    在本例中,如果 "test" 變量大于 "1",則發(fā)生 E_USER_WARNING 錯(cuò)誤。如果發(fā)生了 E_USER_WARNING,將使用自定義錯(cuò)誤處理程序并結(jié)束腳本:

    <?php//error handler functionfunction customError($errno, $errstr) {  echo "<b>Error:</b> [$errno] $errstr<br />"; echo "Ending Script"; die(); }//set error handlerset_error_handler("customError",E_USER_WARNING);//trigger error$test=2;if ($test>1) { trigger_error("Value must be 1 or below",E_USER_WARNING); }?>

    以上代碼的輸出應(yīng)該類似這樣:

    Error: [512] Value must be 1 or belowEnding Script

    現(xiàn)在,已經(jīng)介紹了如何創(chuàng)建自己的 error,以及如何觸發(fā)它們,現(xiàn)在介紹一下錯(cuò)誤記錄。

    12.7 錯(cuò)誤記錄

    默認(rèn)地,根據(jù)在 php.ini 中的 error_log 配置,PHP 向服務(wù)器的錯(cuò)誤記錄系統(tǒng)或文件發(fā)送錯(cuò)誤記錄。通過(guò)使用 error_log() 函數(shù),可以向指定的文件或遠(yuǎn)程目的地發(fā)送錯(cuò)誤記錄。

    通過(guò)電子郵件向自己發(fā)送錯(cuò)誤消息,是一種獲得指定錯(cuò)誤的通知的好辦法。

    通過(guò) E-Mail 發(fā)送錯(cuò)誤消息

    在下面的例子中,如果特定的錯(cuò)誤發(fā)生,將發(fā)送帶有錯(cuò)誤消息的電子郵件,并結(jié)束腳本:

    <?php//error handler functionfunction customError($errno, $errstr) {  echo "<b>Error:</b> [$errno] $errstr<br />"; echo "Webmaster has been notified"; error_log("Error: [$errno] $errstr",1, "someone@example.com","From: webmaster@example.com");}//set error handlerset_error_handler("customError",E_USER_WARNING);//trigger error$test=2;if ($test>1) { trigger_error("Value must be 1 or below",E_USER_WARNING); }?>

    以上代碼的輸出應(yīng)該類似這樣:

    Error: [512] Value must be 1 or belowWebmaster has been notified

    接收自以上代碼的郵件類似這樣:

    Error: [512] Value must be 1 or below

    這個(gè)方法不適合所有的錯(cuò)誤。常規(guī)錯(cuò)誤應(yīng)當(dāng)通過(guò)使用默認(rèn)的 PHP 記錄系統(tǒng)在服務(wù)器上進(jìn)行記錄。

    13、PHP 異常處理

    異常(Exception)用于在指定的錯(cuò)誤發(fā)生時(shí)改變腳本的正常流程。

    13.1 什么是異常?

    PHP 5 提供了一種新的面向?qū)ο?/u>的錯(cuò)誤處理方法。

    異常處理用于在指定的錯(cuò)誤(異常)情況發(fā)生時(shí)改變腳本的正常流程。這種情況稱為異常。

    當(dāng)異常被觸發(fā)時(shí),通常會(huì)發(fā)生:

    當(dāng)前代碼狀態(tài)被保存代碼執(zhí)行被切換到預(yù)定義的異常處理器函數(shù)根據(jù)情況,處理器也許會(huì)從保存的代碼狀態(tài)重新開(kāi)始執(zhí)行代碼,終止腳本執(zhí)行,或從代碼中另外的位置繼續(xù)執(zhí)行腳本

    我們將介紹不同的錯(cuò)誤處理方法:

    異常的基本使用創(chuàng)建自定義的異常處理器多個(gè)異常重新拋出異常設(shè)置頂層異常處理器13.2 異常的基本使用

    當(dāng)異常被拋出時(shí),其后的代碼不會(huì)繼續(xù)執(zhí)行,PHP 會(huì)嘗試查找匹配的 "catch" 代碼塊。

    如果異常沒(méi)有被捕獲,而且又沒(méi)用使用 set_exception_handler() 作相應(yīng)的處理的話,那么將發(fā)生一個(gè)嚴(yán)重的錯(cuò)誤(致命錯(cuò)誤),并且輸出 "Uncaught Exception" (未捕獲異常)的錯(cuò)誤消息。

    嘗試拋出一個(gè)異常,同時(shí)不去捕獲它:

    <?php//create function with an exceptionfunction checkNum($number) { if($number>1)  {  throw new Exception("Value must be 1 or below");  } return true; }//trigger exceptioncheckNum(2);?>

    上面的代碼會(huì)獲得類似這樣的一個(gè)錯(cuò)誤:

    Fatal error: Uncaught exception 'Exception' with message 'Value must be 1 or below' in C:webfolder	est.php:6 Stack trace: #0 C:webfolder	est.php(12): checkNum(28) #1 {main} thrown in C:webfolder	est.php on line 6
    13.3 Try, throw 和 catch

    要避免上面例子出現(xiàn)的錯(cuò)誤,我們需要?jiǎng)?chuàng)建適當(dāng)?shù)拇a來(lái)處理異常。

    正確的處理程序應(yīng)當(dāng)包括:

    Try - 使用異常的函數(shù)應(yīng)該位于 "try" 代碼塊內(nèi)。如果沒(méi)有觸發(fā)異常,則代碼將照常繼續(xù)執(zhí)行。但是如果異常被觸發(fā),會(huì)拋出一個(gè)異常。Throw - 這里規(guī)定如何觸發(fā)異常。每一個(gè) "throw" 必須對(duì)應(yīng)至少一個(gè) "catch"Catch - "catch" 代碼塊會(huì)捕獲異常,并創(chuàng)建一個(gè)包含異常信息的對(duì)象

    讓我們觸發(fā)一個(gè)異常:

    <?php//創(chuàng)建可拋出一個(gè)異常的函數(shù)function checkNum($number) { if($number>1)  {  throw new Exception("Value must be 1 or below");  } return true; }//在 "try" 代碼塊中觸發(fā)異常try { checkNum(2); //If the exception is thrown, this text will not be shown echo 'If you see this, the number is 1 or below'; }//捕獲異常catch(Exception $e) { echo 'Message: ' .$e->getMessage(); }?>

    上面代碼將獲得類似這樣一個(gè)錯(cuò)誤:

    Message: Value must be 1 or below 
    例子解釋:

    上面的代碼拋出了一個(gè)異常,并捕獲了它:

    創(chuàng)建 checkNum() 函數(shù)。它檢測(cè)數(shù)字是否大于 1。如果是,則拋出一個(gè)異常。在 "try" 代碼塊中調(diào)用 checkNum() 函數(shù)。checkNum() 函數(shù)中的異常被拋出"catch" 代碼塊接收到該異常,并創(chuàng)建一個(gè)包含異常信息的對(duì)象 ($e)。通過(guò)從這個(gè) exception 對(duì)象調(diào)用 $e->getMessage(),輸出來(lái)自該異常的錯(cuò)誤消息

    不過(guò),為了遵循“每個(gè) throw 必須對(duì)應(yīng)一個(gè) catch”的原則,可以設(shè)置一個(gè)頂層的異常處理器來(lái)處理漏掉的錯(cuò)誤。

    13.4 創(chuàng)建一個(gè)自定義的 Exception 類

    創(chuàng)建自定義的異常處理程序非常簡(jiǎn)單。簡(jiǎn)單地創(chuàng)建了一個(gè)專門的類,當(dāng) PHP 中發(fā)生異常時(shí),可調(diào)用其函數(shù)。該類必須是 exception 類的一個(gè)擴(kuò)展。

    這個(gè)自定義的 exception 類繼承了 PHP 的 exception 類的所有屬性,您可向其添加自定義的函數(shù)。

    開(kāi)始創(chuàng)建 exception 類:

    <?phpclass customException extends Exception { public function errorMessage()  {  //error message  $errorMsg = 'Error on line '.$this->getLine().' in '.$this->getFile()  .': <b>'.$this->getMessage().'</b> is not a valid E-Mail address';  return $errorMsg;  } }$email = "someone@example...com";try { //check if  if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE)  {  //throw exception if email is not valid  throw new customException($email);  } }catch (customException $e) { //display custom message echo $e->errorMessage(); }?>

    這個(gè)新的類是舊的 exception 類的副本,外加 errorMessage() 函數(shù)。正因?yàn)樗桥f類的副本,因此它從舊類繼承了屬性和方法,可以使用 exception 類的方法,比如 getLine() 、 getFile() 以及 getMessage()。

    例子解釋:

    上面的代碼拋出了一個(gè)異常,并通過(guò)一個(gè)自定義的 exception 類來(lái)捕獲它:

    customException() 類是作為舊的 exception 類的一個(gè)擴(kuò)展來(lái)創(chuàng)建的。這樣它就繼承了舊類的所有屬性和方法。創(chuàng)建 errorMessage() 函數(shù)。如果 e-mail 地址不合法,則該函數(shù)返回一條錯(cuò)誤消息把 $email 變量設(shè)置為不合法的 e-mail 地址字符串執(zhí)行 "try" 代碼塊,由于 e-mail 地址不合法,因此拋出一個(gè)異常"catch" 代碼塊捕獲異常,并顯示錯(cuò)誤消息13.5 多個(gè)異常

    可以為一段腳本使用多個(gè)異常,來(lái)檢測(cè)多種情況。

    可以使用多個(gè) if..else 代碼塊,或一個(gè) switch 代碼塊,或者嵌套多個(gè)異常。這些異常能夠使用不同的 exception 類,并返回不同的錯(cuò)誤消息:

    <?phpclass customException extends Exception{public function errorMessage(){//error message$errorMsg = 'Error on line '.$this->getLine().' in '.$this->getFile().': <b>'.$this->getMessage().'</b> is not a valid E-Mail address';return $errorMsg;}}$email = "someone@example.com";try { //check if  if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE)  {  //throw exception if email is not valid  throw new customException($email);  } //check for "example" in mail address if(strpos($email, "example") !== FALSE)  {  throw new Exception("$email is an example e-mail");  } }catch (customException $e) { echo $e->errorMessage(); }catch(Exception $e) { echo $e->getMessage(); }?>
    例子解釋:

    上面的代碼測(cè)試了兩種條件,如何任何條件不成立,則拋出一個(gè)異常:

    customException() 類是作為舊的 exception 類的一個(gè)擴(kuò)展來(lái)創(chuàng)建的。這樣它就繼承了舊類的所有屬性和方法。創(chuàng)建 errorMessage() 函數(shù)。如果 e-mail 地址不合法,則該函數(shù)返回一個(gè)錯(cuò)誤消息。執(zhí)行 "try" 代碼塊,在第一個(gè)條件下,不會(huì)拋出異常。由于 e-mail 含有字符串 "example",第二個(gè)條件會(huì)觸發(fā)異常。"catch" 代碼塊會(huì)捕獲異常,并顯示恰當(dāng)?shù)腻e(cuò)誤消息

    如果沒(méi)有捕獲 customException,緊緊捕獲了 base exception,則在那里處理異常。

    13.6 重新拋出異常

    有時(shí),當(dāng)異常被拋出時(shí),希望以不同于標(biāo)準(zhǔn)的方式對(duì)它進(jìn)行處理。可以在一個(gè) "catch" 代碼塊中再次拋出異常。

    腳本應(yīng)該對(duì)用戶隱藏系統(tǒng)錯(cuò)誤。對(duì)程序員來(lái)說(shuō),系統(tǒng)錯(cuò)誤也許很重要,但是用戶對(duì)它們并不感興趣。為了讓用戶更容易使用,您可以再次拋出帶有對(duì)用戶比較友好的消息的異常:

    <?phpclass customException extends Exception { public function errorMessage()  {  //error message  $errorMsg = $this->getMessage().' is not a valid E-Mail address.';  return $errorMsg;  } }$email = "someone@example.com";try { try  {  //check for "example" in mail address  if(strpos($email, "example") !== FALSE)   {   //throw exception if email is not valid   throw new Exception($email);   }  } catch(Exception $e)  {  //re-throw exception  throw new customException($email);  } }catch (customException $e) { //display custom message echo $e->errorMessage(); }?>
    例子解釋:

    上面的代碼檢測(cè)在郵件地址中是否含有字符串 "example"。如果有,則再次拋出異常:

    customException() 類是作為舊的 exception 類的一個(gè)擴(kuò)展來(lái)創(chuàng)建的。這樣它就繼承了舊類的所有屬性和方法。創(chuàng)建 errorMessage() 函數(shù)。如果 e-mail 地址不合法,則該函數(shù)返回一個(gè)錯(cuò)誤消息。把 $email 變量設(shè)置為一個(gè)有效的郵件地址,但含有字符串 "example"。"try" 代碼塊包含另一個(gè) "try" 代碼塊,這樣就可以再次拋出異常。由于 e-mail 包含字符串 "example",因此觸發(fā)異常。"catch" 捕獲到該異常,并重新拋出 "customException"。捕獲到 "customException",并顯示一條錯(cuò)誤消息。

    如果在其目前的 "try" 代碼塊中異常沒(méi)有被捕獲,則它將在更高層級(jí)上查找 catch 代碼塊。

    13.7 設(shè)置頂層異常處理器 (Top Level Exception Handler)

    set_exception_handler() 函數(shù)可設(shè)置處理所有未捕獲異常的用戶定義函數(shù)。

    <?phpfunction myException($exception){echo "<b>Exception:</b> " , $exception->getMessage();}set_exception_handler('myException');throw new Exception('Uncaught Exception occurred');?>

    以上代碼的輸出應(yīng)該類似這樣:

    Exception: Uncaught Exception occurred

    在上面的代碼中,不存在 "catch" 代碼塊,而是觸發(fā)頂層的異常處理程序。應(yīng)該使用此函數(shù)來(lái)捕獲所有未被捕獲的異常。

    13.8 異常的規(guī)則需要進(jìn)行異常處理的代碼應(yīng)該放入 try 代碼塊內(nèi),以便捕獲潛在的異常。每個(gè) try 或 throw 代碼塊必須至少擁有一個(gè)對(duì)應(yīng)的 catch 代碼塊。使用多個(gè) catch 代碼塊可以捕獲不同種類的異常。可以在 try 代碼塊內(nèi)的 catch 代碼塊中再次拋出(re-thrown)異常。

    簡(jiǎn)而言之:如果拋出了異常,就必須捕獲它。

    14、PHP 過(guò)濾器(Filter)

    PHP 過(guò)濾器用于驗(yàn)證和過(guò)濾來(lái)自非安全來(lái)源的數(shù)據(jù),比如用戶的輸入。

    14.1 什么是 PHP 過(guò)濾器?

    PHP 過(guò)濾器用于驗(yàn)證和過(guò)濾來(lái)自非安全來(lái)源的數(shù)據(jù)。

    驗(yàn)證和過(guò)濾用戶輸入或自定義數(shù)據(jù)是任何 Web 應(yīng)用程序的重要組成部分。

    設(shè)計(jì) PHP 的過(guò)濾器擴(kuò)展的目的是使數(shù)據(jù)過(guò)濾更輕松快捷。

    14.2 為什么使用過(guò)濾器?

    幾乎所有 web 應(yīng)用程序都依賴外部的輸入。這些數(shù)據(jù)通常來(lái)自用戶或其他應(yīng)用程序(比如 web 服務(wù))。通過(guò)使用過(guò)濾器,您能夠確保應(yīng)有程序獲得正確的輸入類型。

    您應(yīng)該始終對(duì)外部數(shù)據(jù)進(jìn)行過(guò)濾!

    輸入過(guò)濾是最重要的應(yīng)用程序安全課題之一。

    14.2.1 什么是外部數(shù)據(jù)?來(lái)自表單的輸入數(shù)據(jù)Cookies服務(wù)器變量數(shù)據(jù)庫(kù)查詢結(jié)果14.3 函數(shù)和過(guò)濾器

    如需過(guò)濾變量,請(qǐng)使用下面的過(guò)濾器函數(shù)之一:

    filter_var() - 通過(guò)一個(gè)指定的過(guò)濾器來(lái)過(guò)濾單一的變量filter_var_array() - 通過(guò)相同的或不同的過(guò)濾器來(lái)過(guò)濾多個(gè)變量filter_input - 獲取一個(gè)輸入變量,并對(duì)它進(jìn)行過(guò)濾filter_input_array - 獲取多個(gè)輸入變量,并通過(guò)相同的或不同的過(guò)濾器對(duì)它們進(jìn)行過(guò)濾

    在下面的例子中,用 filter_var() 函數(shù)驗(yàn)證了一個(gè)整數(shù):

    <?php$int = 123;if(!filter_var($int, FILTER_VALIDATE_INT)) { echo("Integer is not valid"); }else { echo("Integer is valid"); }?>

    上面的代碼使用了 "FILTER_VALIDATE_INT" 過(guò)濾器來(lái)過(guò)濾變量。由于這個(gè)整數(shù)是合法的,因此代碼的輸出是:"Integer is valid"。

    假如嘗試使用一個(gè)非整數(shù)的變量,則輸出是:"Integer is not valid"。

    14.4 Validating 和 Sanitizing

    有兩種過(guò)濾器:

    14.4.1 Validating 過(guò)濾器:用于驗(yàn)證用戶輸入嚴(yán)格的格式規(guī)則(比如 URL 或 E-Mail 驗(yàn)證)如果成功則返回預(yù)期的類型,如果失敗則返回 FALSE14.4.2 Sanitizing 過(guò)濾器:用于允許或禁止字符串中指定的字符無(wú)數(shù)據(jù)格式規(guī)則始終返回字符串14.5 選項(xiàng)和標(biāo)志

    選項(xiàng)和標(biāo)志用于向指定的過(guò)濾器添加額外的過(guò)濾選項(xiàng)。

    不同的過(guò)濾器有不同的選項(xiàng)和標(biāo)志。

    在下面的例子中,我們用 filter_var() 和 "min_range" 以及 "max_range" 選項(xiàng)驗(yàn)證了一個(gè)整數(shù):

    <?php$var=300;$int_options = array("options"=>array ( "min_range"=>0, "max_range"=>256 ));if(!filter_var($var, FILTER_VALIDATE_INT, $int_options)) { echo("Integer is not valid"); }else { echo("Integer is valid"); }?>

    就像上面的代碼一樣,選項(xiàng)必須放入一個(gè)名為 "options" 的相關(guān)數(shù)組中。如果使用標(biāo)志,則不需在數(shù)組內(nèi)。

    由于整數(shù)是 "300",它不在指定的范圍內(nèi),以上代碼的輸出將是 "Integer is not valid"。

    14.6 驗(yàn)證輸入

    驗(yàn)證來(lái)自表單的輸入。

    首先確認(rèn)是否存在正在查找的輸入數(shù)據(jù)。

    然后用 filter_input() 函數(shù)過(guò)濾輸入的數(shù)據(jù)。

    在下面的例子中,輸入變量 "email" 被傳到 PHP 頁(yè)面:

    <?phpif(!filter_has_var(INPUT_GET, "email")) { echo("Input type does not exist"); }else { if (!filter_input(INPUT_GET, "email", FILTER_VALIDATE_EMAIL))  {  echo "E-Mail is not valid";  } else  {  echo "E-Mail is valid";  } }?>
    例子解釋:

    上面的例子有一個(gè)通過(guò) "GET" 方法傳送的輸入變量 (email):

    檢測(cè)是否存在 "GET" 類型的 "email" 輸入變量如果存在輸入變量,檢測(cè)它是否是有效的郵件地址14.7 凈化輸入

    清理從表單傳來(lái)的 URL。

    首先確認(rèn)是否存在正在查找的輸入數(shù)據(jù)。

    然后,用 filter_input() 函數(shù)來(lái)凈化輸入數(shù)據(jù)。

    在下面的例子中,輸入變量 "url" 被傳到 PHP 頁(yè)面:

    <?phpif(!filter_has_var(INPUT_POST, "url")) { echo("Input type does not exist"); }else { $url = filter_input(INPUT_POST, "url", FILTER_SANITIZE_URL); }?>
    例子解釋:

    上面的例子有一個(gè)通過(guò) "POST" 方法傳送的輸入變量 (url):

    檢測(cè)是否存在 "POST" 類型的 "url" 輸入變量如果存在此輸入變量,對(duì)其進(jìn)行凈化(刪除非法字符),并將其存儲(chǔ)在 $url 變量中

    假如輸入變量類似這樣:"http://www.W3非o法ol.com.c字符n/",則凈化后的 $url 變量應(yīng)該是這樣的:

    http://www.W3School.com.cn/
    14.8 過(guò)濾多個(gè)輸入

    表單通常由多個(gè)輸入字段組成。為了避免對(duì) filter_var 或 filter_input 重復(fù)調(diào)用,可以使用 filter_var_array 或 the filter_input_array 函數(shù)。

    在本例中,使用 filter_input_array() 函數(shù)來(lái)過(guò)濾三個(gè) GET 變量。接收到的 GET 變量是一個(gè)名字、一個(gè)年齡以及一個(gè)郵件地址:

    <?php$filters = array ( "name" => array  (  "filter"=>FILTER_SANITIZE_STRING  ), "age" => array  (  "filter"=>FILTER_VALIDATE_INT,  "options"=>array   (   "min_range"=>1,   "max_range"=>120   )  ), "email"=> FILTER_VALIDATE_EMAIL, );$result = filter_input_array(INPUT_GET, $filters);if (!$result["age"]) { echo("Age must be a number between 1 and 120.<br />"); }elseif(!$result["email"]) { echo("E-Mail is not valid.<br />"); }else { echo("User input is valid"); }?>
    例子解釋:

    上面的例子有三個(gè)通過(guò) "GET" 方法傳送的輸入變量 (name, age and email)

    設(shè)置一個(gè)數(shù)組,其中包含了輸入變量的名稱,以及用于指定的輸入變量的過(guò)濾器調(diào)用 filter_input_array 函數(shù),參數(shù)包括 GET 輸入變量及剛才設(shè)置的數(shù)組檢測(cè) $result 變量中的 "age" 和 "email" 變量是否有非法的輸入。(如果存在非法輸入,)

    filter_input_array() 函數(shù)的第二個(gè)參數(shù)可以是數(shù)組或單一過(guò)濾器的 ID。

    如果該參數(shù)是單一過(guò)濾器的 ID,那么這個(gè)指定的過(guò)濾器會(huì)過(guò)濾輸入數(shù)組中所有的值。

    如果該參數(shù)是一個(gè)數(shù)組,那么此數(shù)組必須遵循下面的規(guī)則:

    必須是一個(gè)關(guān)聯(lián)數(shù)組,其中包含的輸入變量是數(shù)組的鍵(比如 "age" 輸入變量)此數(shù)組的值必須是過(guò)濾器的 ID ,或者是規(guī)定了過(guò)濾器、標(biāo)志以及選項(xiàng)的數(shù)組14.9 使用 Filter Callback

    通過(guò)使用 FILTER_CALLBACK 過(guò)濾器,可以調(diào)用自定義的函數(shù),把它作為一個(gè)過(guò)濾器來(lái)使用。這樣,就擁有了數(shù)據(jù)過(guò)濾的完全控制權(quán)。

    可以創(chuàng)建自己的自定義函數(shù),也可以使用已有的 PHP 函數(shù)。

    規(guī)定準(zhǔn)備用到過(guò)濾器函數(shù)的方法,與規(guī)定選項(xiàng)的方法相同。

    在下面的例子中,使用了一個(gè)自定義的函數(shù)把所有 "_" 轉(zhuǎn)換為空格:

    <?phpfunction convertSpace($string){return str_replace("_", " ", $string);}$string = "Peter_is_a_great_guy!";echo filter_var($string, FILTER_CALLBACK, array("options"=>"convertSpace"));?>

    以上代碼的結(jié)果是這樣的:

    Peter is a great guy!
    例子解釋:

    上面的例子把所有 "_" 轉(zhuǎn)換成空格:

    創(chuàng)建一個(gè)把 "_" 替換為空格的函數(shù)調(diào)用 filter_var() 函數(shù),它的參數(shù)是 FILTER_CALLBACK 過(guò)濾器以及包含函數(shù)的數(shù)組

    PHP編程

    鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

  • 發(fā)表評(píng)論 共有條評(píng)論
    用戶名: 密碼:
    驗(yàn)證碼: 匿名發(fā)表
    精品乱子伦一区二区| 日韩美女中文字幕| 中文字幕2020第一页| 亚洲第一视频| 欧美日韩国产一区在线| 在线中文字幕视频观看| 日韩精品一级| 国产一级在线播放| 精品国产不卡一区二区| 高清在线一区| 欧美日韩高清在线播放| 国产丝袜欧美中文另类| 日韩 欧美 综合| 亚洲第一视频网站| 高清中文字幕在线| 欧美sm一区| 精品久久九九| 欧美日韩精品久久久| 免费网站看黄yyy222| 欧美不卡123| 欧洲精品久久久| 人成在线免费视频| 男人的天堂网av| 亚洲欧美中文字幕| 午夜高潮免费视频| 欧美专区中文字幕| 国产绿帽一区二区三区| 91精品国产自产观看在线| 日韩福利视频导航| 欧美日韩第一| 黄色片免费看| 亚洲电影中文字幕在线观看| 中文字幕在线视频久| 综合图区亚洲白拍在线| 精品日韩99亚洲| 日韩中文字幕精品视频| 精品调教chinesegay| 黄色国产在线| 久久久久蜜桃| 白嫩少妇丰满一区二区| 日韩在线一区二区| av中文在线资源| 色综合婷婷久久| 欧美日韩国产一级片| 免费视频中文字幕| av首页在线| 99久久精品国产亚洲| 亚洲社区在线| 日韩久久99| 青青久在线视频免费观看| 国产三级视频网站| 欧美三级在线看| 日韩精品视频在线播放| 欧美亚洲免费高清在线观看| 一区二区三区视频网站 | 亚洲 欧美综合在线网络| www..com日韩| 国产最新在线| 欧美日韩国产一二| av免费观看网站| 中文字幕在线观看网址| 一区二区三区在线免费| 国产999精品在线观看| www.三级.com| 色综合久久88色综合天天免费| 91精品国产网站| 亚洲一区中文| 1区2区在线| 欧美 日韩 国产在线观看| 免费日韩精品中文字幕视频在线| 日韩在线视频一区二区三区| 在线综合 亚洲 欧美中文字幕| 欧美一级搡bbbb搡bbbb| 中文字幕精品亚洲| 中文字幕线观看| 在线精品视频免费播放| 亚洲伊人婷婷| 日韩国产一区| 国自产拍在线网站网址视频| 91精品国产综合久久香蕉的特点| 国产wwww| 午夜精品免费视频| 日本xxxwww免费视频| wwwwww在线观看| 国产三级精品在线观看| 精品三级久久| av免费在线网站| 色综合影院在线| 精品精品久久| 久久精品一二三| 欧美亚洲免费高清在线观看| 不卡在线视频| 中文字幕亚洲字幕| 免费精品国产自产拍观看| 欧美日韩视频在线| 亚洲va久久久噜噜噜久久| 91精品国产综合久久久久| 亚洲 国产 欧美 日韩| 国产欧美亚洲一区| 成人a在线观看| 亚洲第一精品在线| 国产劲爆久久| 国产成人一二三区| 99久热re在线精彩视频| 欧美日韩激情一区| 亚洲免费在线视频一区 二区| www.久久久精品| 亚洲综合在线电影| 精品亚洲永久免费| 色综合久久88色综合天天免费| 欧美日韩国产一区中文午夜 | 日韩欧美在线字幕| 国产激情久久| 日韩精品在线网站| 日韩色在线观看| 欧美日韩国产免费| 免费看ww视频网站入口| 亚洲国产91精品在线观看| 麻豆一区二区99久久久久| 日韩不卡一二三区| 国产香蕉免费精品视频| 日韩欧美在线不卡| 日韩视频国产视频| 欧美日韩视频网站| 亚洲社区在线| 精品视频久久| 亚洲免费在线视频一区 二区| 欧美一级二级三级区| 欧美日韩成人一区二区| 久久精品电影| 婷婷中文字幕一区三区| 一区二区在线视频播放| 国产欧美日韩在线看| 日韩一二三四区| 国产 欧美在线| 日韩在线观看视频一区二区| 欧美婷婷久久| 欧美日韩三级一区| 中文字幕在线观看亚洲| 91精品国产调教在线观看| 91欧美在线| 精品国产免费视频| 日韩一级网站| 日韩亚洲一区中文字幕| 日韩不卡高清视频| 久久人人88| 视频一区视频二区中文| 免费精品国产自产拍观看| 国产91欧美| 国产欧美亚洲一区| 国产日韩av一区| 精品网站999www| 日韩精品视频网站| 在线国产日本| 国产在线观看91| 中文字幕日韩视频| 欧美日韩精品综合| 日韩欧美国产不卡| 日韩在线小视频| 亚洲免费观看视频| 免费日韩精品中文字幕视频在线| 中文字幕在线观看播放| 中文字幕日韩欧美| 国产黄在线观看免费观看不卡| 久久精品一二三| 精品视频三区| 自拍日韩亚洲一区在线| 91精品国产综合久久精品app| 亚洲一区中文字幕在线| 韩国v欧美v日本v亚洲| 日韩视频在线一区| 欧美一级免费在线观看| 久久久精品国产免费观看同学| 国产成人va亚洲电影| 欧美日韩中文精品| 欧美日韩国产中字| 国产久卡久卡久卡久卡视频精品| 国产高清在线一区| 国产资源中文字幕| 中文字幕国产亚洲| 一区二区三区在线播| 日韩午夜黄色| 在线日韩中文| 中文字幕亚洲免费| 99日韩精品| 婷婷精品视频| 免费精品国产自产拍在| 精品日韩在线播放| 午夜私人影院在线观看| 不卡专区在线| 亚洲欧美中文字幕| 中文字幕亚洲区| 欧美中文字幕在线观看视频| 国产在线二区| 欧美日韩国产一级片| 精品国产乱码一区二区| 久久视频在线免费观看| 91精品视频国产| 日韩免费视频一区二区视频在线观看| 92久久精品| 国产成人精品网址| 亚洲欧洲一区二区天堂久久| 国产婷婷色一区二区三区在线| 中文字幕国产欧美| 91精品在线免费观看| 中文精品视频| 日韩视频一区| 日韩在线视频一区| 国产一卡2卡3卡免费网站| 亚洲二区自拍| 蜜桃视频中文字幕| 日韩精品综合在线| 综合图区亚洲白拍在线| 欧美久久在线观看| 伊人国产视频| 欧美 日韩 国产在线观看| √新版天堂资源在线资源| 国产九九在线| 福利一区二区| 蜜桃久久久久| 91色在线看| 国产午夜精品久久| 亚洲福利在线看| 一级片免费在线| av中文资源在线| 日韩精品手机在线观看| 精品日韩av| 午夜国产视频| 91精品国产91久久久久| 久久婷婷中文字幕| 欧美片网站免费| 日韩精品资源二区在线| a在线观看免费视频| 日韩综合精品| 久久99精品久久久久婷婷| 日韩一级精品| 老司机久久99久久精品播放免费| 中文字幕精品一区二区三区在线| 精品一二三四| 日韩欧美色综合网站| h片精品在线观看| 国产一区三区三区| 91精品网站| lutube成人福利在线观看| 久久精品99国产国产精| 欧美性极品xxxx做受| 国产成人精品日本亚洲专区61| 亚洲综合在线中文字幕| 欧美日韩国产一二| 日本中文字幕在线观看| 国产日产一区二区三区| www.尤物.com| av午夜在线| 日韩三级视频在线| 97最新国自产拍视频在线完整在线看| 亚洲男女av一区二区| 日韩精品视频在线观看视频| 国产成人精品av久久| 欧美一级日韩不卡播放免费 | 免费日韩精品中文字幕视频在线| 中文字幕精品在线视频| 亚洲国产www| www.狠狠干| 欧美日韩国产中文精品字幕自在自线| 亚洲国产欧美日韩在线| 国产在线不卡av| 欧美精选午夜久久久乱码6080| 日韩欧美综合在线| 国产偷久久久精品专区| www日韩欧美| 91精品国产综合久久香蕉最新版| 亚洲国产欧美日韩在线| 日韩三级视频中文字幕| 精品亚洲综合| 91精品国产全国免费观看| 中文字幕欧美国内| 国产欧美三级| 日韩精品三级| 中文字幕线观看| 亚洲第一网中文字幕| 久久久99精品久久| 日韩精品在线看| 91精品国产综合久久精品| 91精品国产欧美日韩| www.三级.com| 欧美日韩精品综合在线 | 亚洲高清免费一级二级三级| 国产欧美日韩久久| 中文字幕在线中文字幕二区| 日韩午夜中文字幕| 日韩精品首页| 天堂在线视频中文网| 久久久久久91| 欧美黄页在线免费观看| 福利在线国产| 国产羞羞视频在线播放| 国产九九在线| 日韩欧美在线中文字幕| 日韩视频专区| 国产一区久久| 国产1区在线| 国产高清在线观看| 自拍日韩亚洲一区在线| 国产九九在线| 精品国产欧美| 欧美日韩中文字幕在线| 精人妻一区二区三区| 在线视频三区| 亚洲视频在线观看三级| 国产高清精品在线| 91精品综合久久| 午夜视频在线观看一区| 最新日韩中文字幕| 国产黄色小视频| 国产欧美久久久久久久久| 91九色在线播放| 欧美自拍一区| 免费视频国产一区| 亚洲一区中文在线| 91精品在线国产| 国产一二三精品| 国产成人日日夜夜| 日韩一级网站| aaa大片在线观看 | 日韩欧中文字幕| 婷婷精品进入| av免费在线观看网址| 国产欧美日韩综合精品| 国产最新在线| 日韩中文字幕在线一区| 日韩在线视频免费观看高清中文| 欧美一级日韩一级| 精品日韩一区二区三区免费视频| 国产黄色网页| 国产亚洲短视频| 国产中文在线播放| 精品三级在线| 欧美人妻一区二区三区| 亚洲社区在线| 不卡在线视频| 日韩高清在线不卡| 中文字幕在线观看国产| 日韩av综合在线观看| 亚洲热在线观看| 日韩欧美综合在线| 中文字幕在线高清| 在线一区二区三区精品| 天天综合天天添夜夜添狠狠添| 国产aa精品| 亚洲福利精品在线| 中文在线不卡视频| 国产欧美日韩在线看| 欧美在线观看视频一区| av影视在线看| 国产偷国产偷亚洲清高网站 | 欧美日韩在线观看一区| 亚洲一卡二卡在线观看| 在线视频一区二区三区在线播放| 日韩亚洲欧美中文在线| 国产蜜臀在线| 精品av中文字幕在线毛片| 国产欧美日韩视频| 中文字幕精品亚洲| 人妻一区二区三区免费| 欧美久久久精品| 91精品国产91| 精品三级av| 亚洲高清视频一区| 亚洲成年人影院在线| 精品亚洲国内自在自线福利| 91精品国产免费| 欧美日韩精品三区| 91精品国产99| 中文字幕国产日韩| 91精品啪在线观看国产60岁| 中文字幕在线观看播放| 在线日韩中文| 精品国产综合久久| 欧美日韩国产一级片| 国产香蕉免费精品视频| 国产视频2区| 免费视频国产一区| 国产不卡一区二区在线观看| 欧美日韩亚洲不卡| 日韩精品视频免费在线观看| 日韩av一区二| 国产字幕在线看| 日韩av一区在线| 色猫猫国产区一区二在线视频| 精品日韩视频在线观看| 成人福利一区| 正在播放日韩精品| 欧美国产亚洲一区| 欧美不卡一二三| 欧美日韩在线不卡| 福利在线国产| 欧美在线视频一区二区| 91精品在线国产| 日本亚洲视频在线| 一区二区三区在线不卡|