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

首頁 > 編程 > PHP > 正文

PHP筆記

2020-03-22 17:43:43
字體:
來源:轉載
供稿:網友
  • 什么是 PHP?PHP 是 "PHP Hypertext Preprocessor" 的首字母縮略詞PHP 是一種被廣泛使用的開源腳本語言PHP 腳本在服務器上執行PHP 沒有成本,可供免費下載和使用

    基礎 PHP 語法

    注釋:PHP 語句以分號結尾(;)。PHP 代碼塊的關閉標簽也會自動表明分號(因此在 PHP 代碼塊的最后一行不必使用分號)。

    PHP 大小寫敏感

    在 PHP 中,所有用戶定義的函數、類和關鍵詞(例如 if、else、echo 等等)都對大小寫不敏感。
    不過在 PHP 中,所有變量都對大小寫敏感。

    PHP 變量規則:變量以 $ 符號開頭,其后是變量的名稱變量名稱必須以字母或下劃線開頭變量名稱不能以數字開頭變量名稱只能包含字母數字字符和下劃線(A-z、0-9 以及 _)變量名稱對大小寫敏感($y 與 $Y 是兩個不同的變量)

    注釋:PHP 變量名稱對大小寫敏感!

    PHP 變量作用域

    在 PHP 中,可以在腳本的任意位置對變量進行聲明。

    變量的作用域指的是變量能夠被引用/使用的那部分腳本。

    PHP 有三種不同的變量作用域:

    local(局部)global(全局)html' target='_blank'>static(靜態)Local 和 Global 作用域

    函數之外聲明的變量擁有 Global 作用域,只能在函數以外進行訪問。

    函數內部聲明的變量擁有 LOCAL 作用域,只能在函數內部進行訪問。

    注釋:您可以在不同的函數中創建名稱相同的局部變量,因為局部變量只能被在其中創建它的函數識別。

    PHP static 關鍵詞

    通常,當函數完成/執行后,會刪除所有變量。不過,有時我需要不刪除某個局部變量。實現這一點需要更進一步的工作。

    要完成這一點,請在您首次聲明變量時使用 static 關鍵詞:

    實例
    <?phpfunction myTest() {  static $x=0;  echo $x;  $x++;}myTest();myTest();myTest();?>

    運行實例

    然后,每當函數被調用時,這個變量所存儲的信息都是函數最后一次被調用時所包含的信息。

    注釋:該變量仍然是函數的局部變量。

    PHP 5 echo 和 print 語句在 PHP 中,有兩種基本的輸出方法:echo 和 print。
    PHP echo 和 print 語句

    echo 和 print 之間的差異:

    echo - 能夠輸出一個以上的字符串print - 只能輸出一個字符串,并始終返回 1

    提示:echo 比 print 稍快,因為它不返回任何值。

    PHP echo 語句

    echo 是一個語言結構,有無括號均可使用:echo 或 echo()。

    PHP echo 語句

    echo 是一個語言結構,有無括號均可使用:echo 或 echo()。

    顯示字符串

    下面的例子展示如何用 echo 命令來顯示不同的字符串(同時請注意字符串中能包含 HTML 標記):

    <?phpecho "<h4>PHP is fun!</h4>";echo "Hello world!<br>";echo "I'm about to learn PHP!<br>";echo "This", " string", " was", " made", " with multiple parameters.";?>
    PHP print 語句

    print 也是語言結構,有無括號均可使用:print 或 print()。

    顯示字符串

    下面的例子展示如何用 print 命令來顯示不同的字符串(同時請注意字符串中能包含 HTML 標記):

    <?phpprint "<h4>PHP is fun!</h4>";print "Hello world!<br>";print "I'm about to learn PHP!";?>
    PHP 數據類型

    字符串、整數、浮點數、邏輯、數組、對象、NULL。

    PHP 字符串

    字符串是字符序列,比如 "Hello world!"。

    字符串可以是引號內的任何文本。您可以使用單引號或雙引號:

    PHP 整數

    整數是沒有小數的數字。

    整數規則:

    整數必須有至少一個數字(0-9)整數不能包含逗號或空格整數不能有小數點整數正負均可可以用三種格式規定整數:十進制、十六進制(前綴是 0x)或八進制(前綴是 0)

    PHP 數組

    數組在一個變量中存儲多個值。

    PHP var_dump() 會返回變量的數據類型和值:

    PHP 對象

    對象是存儲數據和有關如何處理數據的信息的數據類型。

    在 PHP 中,必須明確地聲明對象。

    ??????

    PHP 對象

    對象是存儲數據和有關如何處理數據的信息的數據類型。

    在 PHP 中,必須明確地聲明對象。

    首先我們必須聲明對象的類。對此,我們使用 class 關鍵詞。類是包含屬性和方法的結構。

    然后我們在對象類中定義數據類型,然后在該類的實例中使用此數據類型:

    實例
    <?phpclass Car{  var $color;  function Car($color="green") {    $this->color = $color;  }  function what_color() {    return $this->color;  }}?>

    PHP NULL 值

    特殊的 NULL 值表示變量無值。NULL 是數據類型 NULL 唯一可能的值。

    NULL 值標示變量是否為空。也用于區分空字符串與空值數據庫。

    可以通過把值設置為 NULL,將變量清空。

    PHP strlen() 函數

    strlen() 函數返回字符串的長度,以字符計。

    提示:strlen() 常用于循環和其他函數,在確定字符串何時結束很重要時。(例如,在循環中,我們也許需要在字符串的最后一個字符之后停止循環)。

    PHP String 函數

    實例

    查找 "php" 在字符串中第一次出現的位置:

    <?phpecho strpos("You love php, I love php too!","php");?>

    運行實例

    定義和用法

    strpos() 函數查找字符串在另一字符串中第一次出現的位置。

    注釋:strpos() 函數對大小寫敏感。

    注釋:該函數是二進制安全的。

    相關函數:stripos() - 查找字符串在另一字符串中第一次出現的位置(不區分大小寫)strripos() - 查找字符串在另一字符串中最后一次出現的位置(不區分大小寫)strrpos() - 查找字符串在另一字符串中最后一次出現的位置(區分大小寫)PHP 常量

    常量類似變量,但是常量一旦被定義就無法更改或撤銷定義。

    常量是單個值的標識符(名稱)。在腳本中無法改變該值。

    有效的常量名以字符或下劃線開頭(常量名稱前面沒有 $ 符號)。

    注釋:與變量不同,常量貫穿整個腳本是自動全局的。

    設置 PHP 常量

    如需設置常量,請使用 define() 函數 - 它使用三個參數:

    首個參數定義常量的名稱第二個參數定義常量的值可選的第三個參數規定常量名是否對大小寫敏感。默認是 false。

    PHP 算數運算符

    + 加法 $x + $y $x 與 $y 求和 - 減法 $x - $y $x 與 $y 的差數 * 乘法 $x * $y $x 與 $y 的乘積 / 除法 $x / $y $x 與 $y 的商數 % 模數 $x % $y $x 除 $y 的余數
    運算符 名稱 例子 結果

    PHP 字符串運算符 . 串接 $txt1 = "Hello"$txt2 = $txt1 . " world!" 現在 $txt2 包含 "Hello world!" .= 串接賦值 $txt1 = "Hello"$txt1 .= " world!" 現在 $txt1 包含 "Hello world!"
    運算符 名稱 例子 結果
    PHP 遞增/遞減運算符 ++$x 前遞增 $x 加一遞增,然后返回 $x $x++ 后遞增 返回 $x,然后 $x 加一遞增 --$x 前遞減 $x 減一遞減,然后返回 $x $x-- 后遞減 返回 $x,然后 $x 減一遞減
    運算符 名稱 描述
    PHP 比較運算符

    PHP 比較運算符用于比較兩個值(數字或字符串):

    == 等于 $x == $y 如果 $x 等于 $y,則返回 true。 === 全等(完全相同) $x === $y 如果 $x 等于 $y,且它們類型相同,則返回 true。 != 不等于 $x != $y 如果 $x 不等于 $y,則返回 true。 <> 不等于 $x <> $y 如果 $x 不等于 $y,則返回 true。 !== 不全等(完全不同) $x !== $y 如果 $x 不等于 $y,且它們類型不相同,則返回 true。 > 大于 $x > $y 如果 $x 大于 $y,則返回 true。 < 大于 $x < $y 如果 $x 小于 $y,則返回 true。 >= 大于或等于 $x >= $y 如果 $x 大于或者等于 $y,則返回 true. <= 小于或等于 $x <= $y 如果 $x 小于或者等于 $y,則返回 true。
    運算符 名稱 例子 結果
    PHP 邏輯運算符 and 與 $x and $y 如果 $x 和 $y 都為 true,則返回 true。 or 或 $x or $y 如果 $x 和 $y 至少有一個為 true,則返回 true。 xor 異或 $x xor $y 如果 $x 和 $y 有且僅有一個為 true,則返回 true。 && 與 $x && $y 如果 $x 和 $y 都為 true,則返回 true。 || 或 $x || $y 如果 $x 和 $y 至少有一個為 true,則返回 true。 ! 非 !$x 如果 $x 不為 true,則返回 true。
    運算符 名稱 例子 結果
    PHP 數組運算符

    PHP 數組運算符用于比較數組:

    + 聯合 $x + $y $x 和 $y 的聯合(但不覆蓋重復的鍵) == 相等 $x == $y 如果 $x 和 $y 擁有相同的鍵/值對,則返回 true。 === 全等 $x === $y 如果 $x 和 $y 擁有相同的鍵/值對,且順序相同類型相同,則返回 true。 != 不相等 $x != $y 如果 $x 不等于 $y,則返回 true。 <> 不相等 $x <> $y 如果 $x 不等于 $y,則返回 true。 !== 不全等 $x !== $y 如果 $x 與 $y 完全不同,則返回 true。
    運算符 名稱 例子 結果
    PHP if...else...elseif 語句

    條件語句用于基于不同條件執行不同的動作

    PHP 條件語句

    在您編寫代碼時,經常會希望為不同的決定執行不同的動作。您可以在代碼中使用條件語句來實現這一點。

    在 PHP 中,我們可以使用以下條件語句:

    if 語句 - 如果指定條件為真,則執行代碼if...else 語句 - 如果條件為 true,則執行代碼;如果條件為 false,則執行另一端代碼if...elseif....else 語句 - 選擇若干段代碼塊之一來執行switch 語句 - 語句多個代碼塊之一來執行

    switch 語句用于基于不同條件執行不同動作。

    Switch 語句

    如果您希望有選擇地執行若干代碼塊之一,請使用 Switch 語句。

    使用 Switch 語句可以避免冗長的 if..elseif..else 代碼塊。

    工作原理:

    對表達式(通常是變量)進行一次計算把表達式的值與結構中 case 的值進行比較如果存在匹配,則執行與 case 關聯的代碼代碼執行后,break 語句阻止代碼跳入下一個 case 中繼續執行如果沒有 case 為真,則使用 default 語句PHP while 循環

    PHP while 循環在指定條件為 true 時執行代碼塊。

    PHP 循環

    在您編寫代碼時,經常需要反復運行同一代碼塊。我們可以使用循環來執行這樣的任務,而不是在腳本中添加若干幾乎相等的代碼行。

    在 PHP 中,我們有以下循環語句:

    while - 只要指定條件為真,則循環代碼塊do...while - 先執行一次代碼塊,然后只要指定條件為真則重復循環for - 循環代碼塊指定次數foreach - 遍歷數組中的每個元素并循環代碼塊

    請注意,do while 循環只在執行循環內的語句之后才對條件進行測試。這意味著 do while 循環至少會執行一次語句,即使條件測試在第一次就失敗了。

    下面的例子把 $x 設置為 6,然后運行循環,隨后對條件進行檢查

    實例
    <?php $x=6;do {  echo "這個數字是:$x <br>";  $x++;} while ($x<=5);?>

    PHP for 循環執行代碼塊指定的次數。

    PHP for 循環

    如果您已經提前確定腳本運行的次數,可以使用 for 循環。

    PHP foreach 循環

    foreach 循環只適用于數組,并用于遍歷數組中的每個鍵/值對。

    語法
    foreach ($array as $value) {  code to be executed;}

    每進行一次循環迭代,當前數組元素的值就會被賦值給 $value 變量,并且數組指針會逐一地移動,直到到達最后一個數組元素。

    PHP 函數

    PHP 的真正力量來自它的函數:它擁有超過 1000 個內建的函數。

    PHP 用戶定義函數

    除了內建的 PHP 函數,我們可以創建我們自己的函數。

    函數是可以在程序中重復使用的語句塊。

    頁面加載時函數不會立即執行。

    函數只有在被調用時才會執行。

    在 PHP 創建用戶定義函數

    用戶定義的函數聲明以關單 "function" 開頭:

    語法
    function functionName() {  被執行的代碼;}

    注釋:函數名能夠以字母或下劃線開頭(而非數字)。

    注釋:函數名對大小寫不敏感。

    提示:函數名應該能夠反映函數所執行的任務。

    在下面的例子中,我們創建名為 "writeMsg()" 的函數。打開的花括號({)指示函數代碼的開始,而關閉的花括號(})指示函數的結束。

    <?phpfunction writeMsg() {  echo "Hello world!";}writeMsg(); // 調用函數?>
    PHP 函數參數

    可以通過參數向函數傳遞信息。參數類似變量。

    參數被定義在函數名之后,括號內部。您可以添加任意多參數,只要用逗號隔開即可。

    下面的例子中的函數有一個參數($fname)。當調用 familyName() 函數時,我們同時要傳遞一個名字(例如 Bill),這樣會輸出不同的名字,但是姓氏相同:

    實例
    <?phpfunction familyName($fname) {  echo "$fname Zhang.<br>";}familyName("Li");familyName("Hong");familyName("Tao");familyName("Xiao Mei");familyName("Jian");?>
    PHP 默認參數值

    下面的例子展示了如何使用默認參數。如果我們調用沒有參數的 setHeight() 函數,它的參數會取默認值:

    實例
    <?phpfunction setHeight($minheight=50) {  echo "The height is : $minheight <br>";}setHeight(350);setHeight(); // 將使用默認值 50setHeight(135);setHeight(80);?>
    PHP 函數 - 返回值

    如需使函數返回值,請使用 return 語句:

    實例
    <?phpfunction sum($x,$y) {  $z=$x+$y;  return $z;}echo "5 + 10 = " . sum(5,10) . "<br>";echo "7 + 13 = " . sum(7,13) . "<br>";echo "2 + 4 = " . sum(2,4);?>
    上述示例輸出結果:

    5 + 10 = 15
    7 + 13 = 20
    2 + 4 = 6

    PHP 數組

    數組能夠在單獨的變量名中存儲一個或多個值。

    數組能夠在單一變量名中存儲許多值,并且您能夠通過引用下標號來訪問某個值。

    在 PHP 中,有三種數組類型:

    索引數組 - 帶有數字索引的數組關聯數組 - 帶有指定鍵的數組多維數組 - 包含一個或多個數組的數組

    下面的例子創建名為 $cars 的索引數組,為其分配三個元素,然后輸出包含數組值的一段文本:

    實例
    <?php$cars=array("Volvo","BMW","SAAB");echo "I like " . $cars[0] . ", " . $cars[1] . " and " . $cars[2] . ".";?>

    運行實例

    獲得數組的長度 - count() 函數

    count() 函數用于返回數組的長度(元素數):

    實例
    <?php$cars=array("Volvo","BMW","SAAB");echo count($cars);?>

    運行實例

    遍歷索引數組

    如需遍歷并輸出索引數組的所有值,您可以使用 for 循環,就像這樣:

    實例
    <?php$cars=array("Volvo","BMW","SAAB");$arrlength=count($cars);for($x=0;$x<$arrlength;$x++) {  echo $cars[$x];  echo "<br>";}?>

    運行實例

    PHP 關聯數組

    關聯數組是使用您分配給數組的指定鍵的數組。

    有兩種創建關聯數組的方法:

    $age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");

    或者:

    $age['Peter']="35";$age['Ben']="37";$age['Joe']="43";

    隨后可以在腳本中使用指定鍵:

    實例
    <?php$age=array("Bill"=>"35","Steve"=>"37","Peter"=>"43");echo "Peter is " . $age['Peter'] . " years old.";?>

    運行實例

    遍歷關聯數組

    如需遍歷并輸出關聯數組的所有值,您可以使用 foreach 循環,就像這樣:

    實例
    <?php$age=array("Bill"=>"35","Steve"=>"37","Peter"=>"43");foreach($age as $x=>$x_value) {  echo "Key=" . $x . ", Value=" . $x_value;  echo "<br>";}?>

    運行實例

    數組中的元素能夠以字母或數字順序進行升序或降序排序。

    PHP - 數組的排序函數

    在本節中,我們將學習如下 PHP 數組排序函數:

    sort() - 以升序對數組排序rsort() - 以降序對數組排序asort() - 根據值,以升序對關聯數組進行排序ksort() - 根據鍵,以升序對關聯數組進行排序arsort() - 根據值,以降序對關聯數組進行排序krsort() - 根據鍵,以降序對關聯數組進行排序根據鍵對數組進行降序排序 - krsort()
    <!DOCTYPE html><html><body><?php$age=array("Bill"=>"35","Steve"=>"37","Peter"=>"43");krsort($age);foreach($age as $x=>$x_value)    {    echo "Key=" . $x . ", Value=" . $x_value;    echo "<br>";    }?></body></html>
    PHP 全局變量 - 超全局變量

    PHP 中的許多預定義變量都是“超全局的”,這意味著它們在一個腳本的全部作用域中都可用。在函數或方法中無需執行 global $variable; 就可以訪問它們。

    這些超全局變量是:

    $GLOBALS$_SERVER$_REQUEST$_POST$_GET$_FILES$_ENV$_COOKIE$_SESSION

    下表列出了您能夠在 $_SERVER 中訪問的最重要的元素:

    $_SERVER['PHP_SELF'] 返回當前執行腳本的文件名。 $_SERVER['GATEWAY_INTERFACE'] 返回服務器使用的 CGI 規范的版本。 $_SERVER['SERVER_ADDR'] 返回當前運行腳本所在的服務器的 IP 地址。 $_SERVER['SERVER_NAME'] 返回當前運行腳本所在的服務器的主機名(比如 www.w3school.com.cn)。 $_SERVER['SERVER_SOFTWARE'] 返回服務器標識字符串(比如 Apache/2.2.24)。 $_SERVER['SERVER_PROTOCOL'] 返回請求頁面時通信協議的名稱和版本(例如,“HTTP/1.0”)。 $_SERVER['REQUEST_METHOD'] 返回訪問頁面使用的請求方法(例如 POST)。 $_SERVER['REQUEST_TIME'] 返回請求開始時的時間戳(例如 1577687494)。 $_SERVER['QUERY_STRING'] 返回查詢字符串,如果是通過查詢字符串訪問此頁面。 $_SERVER['HTTP_ACCEPT'] 返回來自當前請求的請求頭。 $_SERVER['HTTP_ACCEPT_CHARSET'] 返回來自當前請求的 Accept_Charset 頭( 例如 utf-8,ISO-8859-1) $_SERVER['HTTP_HOST'] 返回來自當前請求的 Host 頭。 $_SERVER['HTTP_REFERER'] 返回當前頁面的完整 URL(不可靠,因為不是所有用戶代理都支持)。 $_SERVER['HTTPS'] 是否通過安全 HTTP 協議查詢腳本。 $_SERVER['REMOTE_ADDR'] 返回瀏覽當前頁面的用戶的 IP 地址。 $_SERVER['REMOTE_HOST'] 返回瀏覽當前頁面的用戶的主機名。 $_SERVER['REMOTE_PORT'] 返回用戶機器上連接到 Web 服務器所使用的端口號。 $_SERVER['SCRIPT_FILENAME'] 返回當前執行腳本的絕對路徑。 $_SERVER['SERVER_ADMIN'] 該值指明了 Apache 服務器配置文件中的 SERVER_ADMIN 參數。 $_SERVER['SERVER_PORT'] Web 服務器使用的端口。默認值為 “80”。 $_SERVER['SERVER_SIGNATURE'] 返回服務器版本和虛擬主機名。 $_SERVER['PATH_TRANSLATED'] 當前腳本所在文件系統(非文檔根目錄)的基本路徑。 $_SERVER['SCRIPT_NAME'] 返回當前腳本的路徑。 $_SERVER['SCRIPT_URI'] 返回當前頁面的 URI。
    元素/代碼 描述

    PHP 超全局變量 $_GET 和 $_POST 用于收集表單數據(form-data)。
    注意:在處理 PHP 表單時請關注安全!

    GET vs. POST

    GET 和 POST 都創建數組(例如,array( key => value, key2 => value2, key3 => value3, ...))。此數組包含鍵/值對,其中的鍵是表單控件的名稱,而值是來自用戶的輸入數據。

    GET 和 POST 被視作 $_GET 和 $_POST。它們是超全局變量,這意味著對它們的訪問無需考慮作用域 - 無需任何特殊代碼,您能夠從任何函數、類或文件訪問它們。

    $_GET 是通過 URL 參數傳遞到當前腳本的變量數組。

    $_POST 是通過 HTTP POST 傳遞到當前腳本的變量數組。

    何時使用 GET?

    通過 GET 方法從表單發送的信息對任何人都是可見的(所有變量名和值都顯示在 URL 中)。GET 對所發送信息的數量也有限制。限制在大于 2000 個字符。不過,由于變量顯示在 URL 中,把頁面添加到書簽中也更為方便。

    GET 可用于發送非敏感的數據。

    注釋:絕不能使用 GET 來發送密碼或其他敏感信息!

    何時使用 POST?

    通過 POST 方法從表單發送的信息對其他人是不可見的(所有名稱/值會被嵌入 HTTP 請求的主體中),并且對所發送信息的數量也無限制。

    此外 POST 支持高階功能,比如在向服務器上傳文件時進行 multi-part 二進制輸入。

    不過,由于變量未顯示在 URL 中,也就無法將頁面添加到書簽。

    提示:開發者偏愛 POST 來發送表單數據。

    如何使用 PHP 來驗證表單數據。

    PHP 表單驗證

    提示:在處理 PHP 表單時請重視安全性!

    什么是 $_SERVER["PHP_SELF"] 變量?

    $_SERVER["PHP_SELF"] 是一種超全局變量,它返回當前執行腳本的文件名。

    因此,$_SERVER["PHP_SELF"] 將表單數據發送到頁面本身,而不是跳轉到另一張頁面。這樣,用戶就能夠在表單頁面獲得錯誤提示信息。

    什么是 htmlspecialchars() 函數?

    htmlspecialchars() 函數把特殊字符轉換為 HTML 實體。這意味著 < 和 > 之類的 HTML 字符會被替換為 &lt; 和 &gt; 。這樣可防止攻擊者通過在表單中注入 HTML 或 JavaScript 代碼(跨站點腳本攻擊)對代碼進行利用。

    關于 PHP 表單安全性的重要提示

    $_SERVER["PHP_SELF"] 變量能夠被黑客利用!

    如果您的頁面使用了 PHP_SELF,用戶能夠輸入下劃線然后執行跨站點腳本(XSS)。

    提示:跨站點腳本(Cross-site scripting,XSS)是一種計算機安全漏洞類型,常見于 Web 應用程序。XSS 能夠使攻擊者向其他用戶瀏覽的網頁中輸入客戶端腳本。

    假設我們的一張名為 "test_form.php" 的頁面中有如下表單:

    <form method="post" action="<?php echo $_SERVER["PHP_SELF"];?>">

    現在,如果用戶進入的是地址欄中正常的 URL:"http://www.example.com/test_form.php",上面的代碼會轉換為:

    <form method="post" action="test_form.php">

    到目前,一切正常。

    不過,如果用戶在地址欄中鍵入了如下 URL:

    http://www.example.com/test_form.php/%22%3E%3Cscript%3Ealert('hacked')%3C/script%3E

    在這種情況下,上面的代碼會轉換為:

    <form method="post" action="test_form.php"/><script>alert('hacked')</script>

    這段代碼加入了一段腳本和一個提示命令。并且當此頁面加載后,就會執行 JavaScript 代碼(用戶會看到一個提示框)。這僅僅是一個關于 PHP_SELF 變量如何被利用的簡單無害案例。

    您應該意識到 <script> 標簽內能夠添加任何 JavaScript 代碼!黑客能夠把用戶重定向到另一臺服務器上的某個文件,該文件中的惡意代碼能夠更改全局變量或將表單提交到其他地址以保存用戶數據,等等。

    如果避免 $_SERVER["PHP_SELF"] 被利用?

    通過使用 htmlspecialchars() 函數能夠避免 $_SERVER["PHP_SELF"] 被利用。

    表單代碼是這樣的:

    <form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">

    htmlspecialchars() 函數把特殊字符轉換為 HTML 實體。現在,如果用戶試圖利用 PHP_SELF 變量,會導致如下輸出:

    <form method="post" action="test_form.php/"><script>alert('hacked')</script>">

    無法利用,沒有危害!

    通過 PHP 驗證表單數據

    我們要做的第一件事是通過 PHP 的 htmlspecialchars() 函數傳遞所有變量。

    在我們使用 htmlspecialchars() 函數后,如果用戶試圖在文本字段中提交以下內容:

    <script>location.href('http://www.hacked.com')</script>

    - 代碼不會執行,因為會被保存為轉義代碼,就像這樣:

    &lt;script&gt;location.href('http://www.hacked.com')&lt;/script&gt;

    現在這條代碼顯示在頁面上或 e-mail 中是安全的。

    在用戶提交該表單時,我們還要做兩件事:

    (通過 PHP trim() 函數)去除用戶輸入數據中不必要的字符(多余的空格、制表符、換行)(通過 PHP stripslashes() 函數)刪除用戶輸入數據中的反斜杠()

    接下來我們創建一個檢查函數(相比一遍遍地寫代碼,這樣效率更好)。

    我們把函數命名為 test_input()。

    現在,我們能夠通過 test_input() 函數檢查每個 $_POST 變量,腳本是這樣的:

    <!DOCTYPE HTML> <html><head></head><body> <?php// define variables and set to empty values$name = $email = $gender = $comment = $website = "";if ($_SERVER["REQUEST_METHOD"] == "POST") {   $name = test_input($_POST["name"]);   $email = test_input($_POST["email"]);   $website = test_input($_POST["website"]);   $comment = test_input($_POST["comment"]);   $gender = test_input($_POST["gender"]);}function test_input($data) {   $data = trim($data);   $data = stripslashes($data);   $data = htmlspecialchars($data);   return $data;}?><h4>PHP 驗證實例</h4><form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">    姓名:<input type="text" name="name">   <br><br>   電郵:<input type="text" name="email">   <br><br>   網址:<input type="text" name="website">   <br><br>   評論:<textarea name="comment" rows="5" cols="40"></textarea>   <br><br>   性別:   <input type="radio" name="gender" value="female">女性   <input type="radio" name="gender" value="male">男性   <br><br>   <input type="submit" name="submit" value="提交"> </form><?phpecho "<h4>您的輸入:</h4>";echo $name;echo "<br>";echo $email;echo "<br>";echo $website;echo "<br>";echo $comment;echo "<br>";echo $gender;?></body></html>
    制作必填輸入字段,并創建需要時所用的錯誤消息。
    運行實例
    <!DOCTYPE HTML> <html><head><style>.error {color: #FF0000;}</style></head><body> <?php// 定義變量并設置為空值$nameErr = $emailErr = $genderErr = $websiteErr = "";$name = $email = $gender = $comment = $website = "";if ($_SERVER["REQUEST_METHOD"] == "POST") {   if (empty($_POST["name"])) {     $nameErr = "姓名是必填的";   } else {     $name = test_input($_POST["name"]);   }      if (empty($_POST["email"])) {     $emailErr = "電郵是必填的";   } else {     $email = test_input($_POST["email"]);   }        if (empty($_POST["website"])) {     $website = "";   } else {     $website = test_input($_POST["website"]);   }   if (empty($_POST["comment"])) {     $comment = "";   } else {     $comment = test_input($_POST["comment"]);   }   if (empty($_POST["gender"])) {     $genderErr = "性別是必選的";   } else {     $gender = test_input($_POST["gender"]);   }}function test_input($data) {   $data = trim($data);   $data = stripslashes($data);   $data = htmlspecialchars($data);   return $data;}?><h4>PHP 驗證實例</h4><p>* 必需的字段</p><form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">    姓名:<input type="text" name="name">   * <?php echo $nameErr;?>   <br><br>   電郵:<input type="text" name="email">   * <?php echo $emailErr;?>   <br><br>   網址:<input type="text" name="website">   <?php echo $websiteErr;?>   <br><br>   評論:<textarea name="comment" rows="5" cols="40"></textarea>   <br><br>   性別:   <input type="radio" name="gender" value="female">女性   <input type="radio" name="gender" value="male">男性   * <?php echo $genderErr;?>   <br><br>   <input type="submit" name="submit" value="提交"> </form><?phpecho "<h4>您的輸入:</h4>";echo $name;echo "<br>";echo $email;echo "<br>";echo $website;echo "<br>";echo $comment;echo "<br>";echo $gender;?></body></html>
    接下來是驗證輸入數據,即“Name 字段是否只包含字母和空格?”,以及“E-mail 字段是否包含有效的電子郵件地址語法?”,并且如果填寫了 Website 字段,“這個字段是否包含了有效的 URL?”。
    如何驗證名字、電郵和 URL。(具體細節????去學習正則表達式中的基礎知識。)
    PHP - 驗證名字

    以下代碼展示的簡單方法檢查 name 字段是否包含字母和空格。如果 name 字段無效,則存儲一條錯誤消息:

    $name = test_input($_POST["name"]);if (!preg_match("/^[a-zA-Z ]*$/",$name)) {  $nameErr = "只允許字母和空格!"; }
    PHP - 驗證Email.

    以下代碼展示的簡單方法檢查 e-mail 地址語法是否有效。如果無效則存儲一條錯誤消息:

    $email = test_input($_POST["email"]);if (!preg_match("/([w-]+@[w-]+.[w-]+)/",$email)) {  $emailErr = "無效的 email 格式!"; }
    PHP - 驗證 URL

    以下代碼展示的方法檢查 URL 地址語法是否有效(這條正則表達式同時允許 URL 中的斜杠)。如果 URL 地址語法無效,則存儲一條錯誤消息:

    $website = test_input($_POST["website"]);if (!preg_match("/(?:(?:https?|ftp)://|www.)[-a-z0-9+&@#/%?=~_|!:,.;]*[-a-z0-9+&@#/%=~_|]/i",$website)) {  $websiteErr = "無效的 URL"; }

    PHP—驗證Name ,E-mail,以及URL的方法同理,只是規則有些不同。

    PHP—保留表單中的值。

    如需在用戶點擊提交按鈕后在輸入字段中顯示值,我們在以下輸入字段的 value 屬性中增加了一小段 PHP 腳本:name、email 以及 website。在 comment 文本框字段中,我們把腳本放到了 <textarea> 與 </textarea> 之間。這些腳本輸出 $name、$email、$website 和 $comment 變量的值。

    然后,我們還需要顯示選中了哪個單選按鈕。對此,我們必須操作 checked 屬性(而非單選按鈕的 value 屬性):

    PHP - 完整的表單實例

    下面是 PHP 表單驗證實例的完整代碼:

    <!DOCTYPE HTML> <html><head><style>.error {color: #FF0000;}</style></head><body> <?php// 定義變量并設置為空值$nameErr = $emailErr = $genderErr = $websiteErr = "";$name = $email = $gender = $comment = $website = "";if ($_SERVER["REQUEST_METHOD"] == "POST") {   if (empty($_POST["name"])) {     $nameErr = "姓名是必填的";   } else {     $name = test_input($_POST["name"]);     // 檢查姓名是否包含字母和空白字符     if (!preg_match("/^[a-zA-Z ]*$/",$name)) {       $nameErr = "只允許字母和空格";      }   }      if (empty($_POST["email"])) {     $emailErr = "電郵是必填的";   } else {     $email = test_input($_POST["email"]);     // 檢查電子郵件地址語法是否有效     if (!preg_match("/([w-]+@[w-]+.[w-]+)/",$email)) {       $emailErr = "無效的 email 格式";      }   }        if (empty($_POST["website"])) {     $website = "";   } else {     $website = test_input($_POST["website"]);     // 檢查 URL 地址語法是否有效(正則表達式也允許 URL 中的斜杠)     if (!preg_match("/(?:(?:https?|ftp)://|www.)[-a-z0-9+&@#/%?=~_|!:,.;]*[-a-z0-9+&@#/%=~_|]/i",$website)) {       $websiteErr = "無效的 URL";      }   }   if (empty($_POST["comment"])) {     $comment = "";   } else {     $comment = test_input($_POST["comment"]);   }   if (empty($_POST["gender"])) {     $genderErr = "性別是必選的";   } else {     $gender = test_input($_POST["gender"]);   }}function test_input($data) {   $data = trim($data);   $data = stripslashes($data);   $data = htmlspecialchars($data);   return $data;}?><h4>PHP 驗證實例</h4><p>* 必需的字段</p><form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">    姓名:<input type="text" name="name">   * <?php echo $nameErr;?>   <br><br>   電郵:<input type="text" name="email">   * <?php echo $emailErr;?>   <br><br>   網址:<input type="text" name="website">   <?php echo $websiteErr;?>   <br><br>   評論:<textarea name="comment" rows="5" cols="40"></textarea>   <br><br>   性別:   <input type="radio" name="gender" value="female">女性   <input type="radio" name="gender" value="male">男性   * <?php echo $genderErr;?>   <br><br>   <input type="submit" name="submit" value="提交"> </form><?phpecho "<h4>您的輸入:</h4>";echo $name;echo "<br>";echo $email;echo "<br>";echo $website;echo "<br>";echo $comment;echo "<br>";echo $gender;?></body></html>
    PHP - 多維數組

    多維數組指的是包含一個或多個數組的數組。

    PHP 能理解兩、三、四或五級甚至更多級的多維數組。不過,超過三級深的數組對于大多數人難于管理。

    注釋:數組的維度指示您需要選擇元素的索引數。

    對于二維數組,您需要兩個索引來選取元素對于三維數組,您需要三個索引來選取元素
    <!DOCTYPE html><html><body><?php$cars = array   (   array("Volvo",33,20),   array("BMW",17,15),   array("Saab",5,2),   array("Land Rover",15,11)   );   for ($row = 0; $row <  4; $row++) {   echo "<p><b>行數 $row</b></p>";   echo "<ul>";   for ($col = 0; $col <  3; $col++) {     echo "<li>".$cars[$row][$col]."</li>";   }   echo "</ul>";}?></body></html>
    PHP date() 函數用于對日期或時間進行格式化。
    PHP Date() 函數

    PHP Date() 函數把時間戳格式化為更易讀的日期和時間。

    語法
    date(format,timestamp)
    format 必需。規定時間戳的格式。 timestamp 可選。規定時間戳。默認是當前時間和日期。
    參數 描述
    獲得簡單的日期

    date() 函數的格式參數是必需的,它們規定如何格式化日期或時間。

    下面列出了一些常用于日期的字符:

    d - 表示月里的某天(01-31)m - 表示月(01-12)Y - 表示年(四位數)1 - 表示周里的某天

    其他字符,比如 "/", "." 或 "-" 也可被插入字符中,以增加其他格式。

    獲得簡單的時間

    下面是常用于時間的字符:

    h - 帶有首位零的 12 小時小時格式i - 帶有首位零的分鐘s - 帶有首位零的秒(00 -59)a - 小寫的午前和午后(am 或 pm)通過 PHP mktime() 創建日期

    date() 函數中可選的時間戳參數規定時間戳。如果您未規定時間戳,將使用當前日期和時間(正如上例中那樣)。

    mktime() 函數返回日期的 Unix 時間戳。Unix 時間戳包含 Unix 紀元(1970 年 1 月 1 日 00:00:00 GMT)與指定時間之間的秒數。

    語法
    mktime(hour,minute,second,month,day,year)
    更多日期實例

    下例輸出下周六的日期:

    實例
    <?php$startdate = strtotime("Saturday");$enddate = strtotime("+6 weeks",$startdate);while ($startdate < $enddate) {  echo date("M d", $startdate),"<br>";  $startdate = strtotime("+1 week", $startdate);}?>

    下例輸出七月四日之前的天數:

    實例
    <?php$d1=strtotime("December 31");$d2=ceil(($d1-time())/60/60/24);echo "距離十二月三十一日還有:" . $d2 ." 天。";?>

    ceil() 函數向上舍入為最接近的整數。

    語法
    ceil(x)
    x 必需。一個數。
    參數 描述
    說明

    返回不小于 x 的下一個整數,x 如果有小數部分則進一位。ceil() 返回的類型仍然是 float,因為 float 值的范圍通常比 integer 要大。

    服務器端包含 (SSI) 用于創建可在多個頁面重復使用的函數、頁眉、頁腳或元素。

    include (或 require)語句會獲取指定文件中存在的所有文本/代碼/標記,并復制到使用 include 語句的文件中。

    包含文件很有用,如果您需要在網站的多張頁面上引用相同的 PHP、HTML 或文本的話。

    PHP include 和 require 語句

    通過 include 或 require 語句,可以將 PHP 文件的內容插入另一個 PHP 文件(在服務器執行它之前)。

    include 和 require 語句是相同的,除了錯誤處理方面:

    require 會生成致命錯誤(E_COMPILE_ERROR)并停止腳本include 只生成警告(E_WARNING),并且腳本會繼續

    因此,如果您希望即使包含文件已丟失,仍然繼續執行,并向用戶輸出結果,那么請使用 include。否則,在框架、CMS 或者復雜的 PHP 應用程序編程中,請始終使用 require 向執行流引用關鍵文件。這有助于提高應用程序的安全性和完整性,在某個關鍵文件意外丟失的情況下。

    包含文件省去了大量的工作。這意味著您可以為所有頁面創建標準頁頭、頁腳或者菜單文件。然后,在頁頭需要更新時,您只需更新這個頁頭包含文件即可。

    注釋:

    請在此時使用 require:當文件被應用程序請求時。

    請在此時使用 include:當文件不是必需的,且應用程序在文件未找到時應該繼續運行時。

    PHP 操作文件

    PHP 擁有的多種函數可供創建、讀取、上傳以及編輯文件。

    注意:請謹慎操作文件!

    當您操作文件時必須非常小心。如果您操作失誤,可能會造成非常嚴重的破壞。常見的錯誤是:

    編輯錯誤的文件被垃圾數據填滿硬盤意外刪除文件內容

    在本節中,我們向您講解如何在服務器上打開、讀取以及關閉文件。

    PHP Open File - fopen()PHP Filesystem 簡介

    Filesystem 函數允許您訪問和操作文件系統。

    PHP 讀取單行文件 - fgets()

    fgets() 函數用于從文件讀取單行。

    下例輸出 "webdictionary.txt" 文件的首行:

    實例
    <?php$myfile = fopen("webdictionary.txt", "r") or die("Unable to open file!");echo fgets($myfile);fclose($myfile);?>

    運行實例

    注釋:調用 fgets() 函數之后,文件指針會移動到下一行。

    PHP 檢查 End-Of-File - feof()

    feof() 函數檢查是否已到達 "end-of-file" (EOF)。

    feof() 對于遍歷未知長度的數據很有用。

    下例逐行讀取 "webdictionary.txt" 文件,直到 end-of-file:

    實例
    <?php$myfile = fopen("webdictionary.txt", "r") or die("Unable to open file!");// 輸出單行直到 end-of-filewhile(!feof($myfile)) {  echo fgets($myfile) . "<br>";}fclose($myfile);?>

    運行實例

    PHP 讀取單字符 - fgetc()

    fgetc() 函數用于從文件中讀取單個字符。

    下例逐字符讀取 "webdictionary.txt" 文件,直到 end-of-file:

    實例
    <?php$myfile = fopen("webdictionary.txt", "r") or die("Unable to open file!");// 輸出單字符直到 end-of-filewhile(!feof($myfile)) {  echo fgetc($myfile);}fclose($myfile);?>

    運行實例

    注釋:在調用 fgetc() 函數之后,文件指針會移動到下一個字符。


    安裝

    Filesystem 函數是 PHP 核心的組成部分。無需安裝即可使用這些函數。

    Runtime 配置

    文件系統函數的行為受到 php.ini 中設置的影響。

    文件系統配置選項:

    allow_url_fopen "1"

    本選項激活了 URL 形式的 fopen 封裝協議使得可以訪問 URL 對象例如文件。默認的封裝協議提供用 ftp 和 http 協議來訪問遠程文件,一些擴展庫例如 zlib 可能會注冊更多的封裝協議。

    (PHP 4.0.4 版以后可用。)

    PHP_INI_SYSTEM user_agent NULL

    定義 PHP 發送的 User-Agent。

    (PHP 4.3.0 版以后可用。)

    PHP_INI_ALL default_socket_timeout "60"

    基于 socket 的流的默認超時時間(秒)。

    (PHP 4.3.0 版以后可用。)

    PHP_INI_ALL from "" 定義匿名 ftp 的密碼(您的 email 地址)。 PHP_INI_ALL auto_detect_line_endings "0"

    當設為 On 時,PHP 將檢查通過 fgets() 和 file() 取得的數據中的行結束符號是符合 Unix,MS-DOS,還是 Macintosh 的習慣。

    這使得 PHP 可以和 Macintosh 系統交互操作,但是默認值是 Off,因為在檢測第一行的 EOL 習慣時會有很小的性能損失,而且在 Unix 系統下使用回車符號作為項目分隔符的人們會遭遇向下不兼容的行為。

    (PHP 4.3.0 版以后可用。)

    PHP_INI_ALL
    名稱 默認 描述 可改變
    Unix / Windows 兼容性

    當在 Unix 平臺上規定路徑時,正斜杠 (/) 用作目錄分隔符。而在 Windows 平臺上,正斜杠 (/) 和反斜杠 () 均可使用。

    PHP 文件上傳

    通過 PHP,可以把文件上傳到服務器。

    創建一個文件上傳表單

    <html><body><form action="upload_file.php" method="post"enctype="multipart/form-data"><label for="file">Filename:</label><input type="file" name="file" id="file" /> <br /><input type="submit" name="submit" value="Submit" /></form></body></html>

    form> 標簽的 enctype 屬性規定了在提交表單時要使用哪種內容類型。在表單需要二進制數據時,比如文件內容,請使用 "multipart/form-data"。

    <input> 標簽的 type="file" 屬性規定了應該把輸入作為文件來處理。舉例來說,當在瀏覽器中預覽時,會看到輸入框旁邊有一個瀏覽按鈕。

    注釋:允許用戶上傳文件是一個巨大的安全風險。請僅僅允許可信的用戶執行文件上傳操作。

    第一個參數是表單的 input name,第二個下標可以是 "name", "type", "size", "tmp_name" 或 "error"。就像這樣:

    $_FILES["file"]["name"] - 被上傳文件的名稱$_FILES["file"]["type"] - 被上傳文件的類型$_FILES["file"]["size"] - 被上傳文件的大小,以字節計$_FILES["file"]["tmp_name"] - 存儲在服務器的文件的臨時副本的名稱$_FILES["file"]["error"] - 由文件上傳導致的錯誤代碼 注釋:對于 IE,識別 jpg 文件的類型必須是 pjpeg,對于 FireFox,必須是 jpeg。

    注釋:這個例子把文件保存到了名為 "upload" 的新文件夾。

    <?phpif ((($_FILES["file"]["type"] == "image/gif")|| ($_FILES["file"]["type"] == "image/jpeg")|| ($_FILES["file"]["type"] == "image/pjpeg"))&& ($_FILES["file"]["size"] < 20000))  {  if ($_FILES["file"]["error"] > 0)    {    echo "Return Code: " . $_FILES["file"]["error"] . "<br />";    }  else    {    echo "Upload: " . $_FILES["file"]["name"] . "<br />";    echo "Type: " . $_FILES["file"]["type"] . "<br />";    echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";    echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />";    if (file_exists("upload/" . $_FILES["file"]["name"]))      {      echo $_FILES["file"]["name"] . " already exists. ";      }    else      {      move_uploaded_file($_FILES["file"]["tmp_name"],      "upload/" . $_FILES["file"]["name"]);      echo "Stored in: " . "upload/" . $_FILES["file"]["name"];      }    }  }else  {  echo "Invalid file";  }?>
    PHP Cookies什么是 Cookie?

    cookie 常用于識別用戶。cookie 是服務器留在用戶計算機中的小文件。每當相同的計算機通過瀏覽器請求頁面時,它同時會發送 cookie。通過 PHP,您能夠創建并取回 cookie 的值。

    setcookie() 函數用于設置 cookie。

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

    語法
    setcookie(name, value, expire, path, domain);
    PHP Sessions

    PHP session 變量用于存儲有關用戶會話的信息,或更改用戶會話的設置。Session 變量保存的信息是單一用戶的,并且可供應用程序中的所有頁面使用。

    Session 的工作機制是:為每個訪問者創建一個唯一的 id (UID),并基于這個 UID 來存儲變量。UID 存儲在 cookie 中,亦或通過 URL 進行傳導。

    PHP 發送電子郵件

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

    PHP mail() 函數

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

    語法
    mail(to,subject,message,headers,parameters)
    to 必需。規定 email 接收者。 subject 必需。規定 email 的主題。注釋:該參數不能包含任何新行字符。 message 必需。定義要發送的消息。應使用 LF ( ) 來分隔各行。 headers

    可選。規定附加的標題,比如 From、Cc 以及 Bcc。

    應當使用 CRLF ( ) 分隔附加的標題。

    parameters 可選。對郵件發送程序規定額外的參數。
    參數 描述

    注釋:PHP 需要一個已安裝且正在運行的郵件系統,以便使郵件函數可用。所用的程序通過在 php.ini 文件中的配置設置進行定義。請在我們的PHP Mail 參考手冊閱讀更多內容。

    <strong>PHP測試成功的郵件發送案例????????需要測試</strong>mail()函數的作用:連接到郵件服務器,利用smtp協議,與該服務器交互并投郵件。注意:1、mail函數不支持esmtp協議,---即,只能直投,不能登陸2、由上條,我們只能直投至最終的收件服務器地址.而該地址,又是在PHP.ini中指定的,所以我們想用mail()函數往 aseoev@163.com發信的話,我們要---1)查詢163郵件服務器的地址2)把該地址寫到php.ini里去php實例代碼如下:?123	SMTP = 163mx02.mxmail.netease.com sendmail_from = wusong@192.168.1.100 var_dump(mail('12345678@qq.com','from php mail function','very intresting'));但是使用php自帶的mail函數發送郵件我們需要在linux中安裝一個sendmail組件才可以否則無法使用。如果你沒有這個sendmail組件我們可以使用phpmailer函數來操作,例子代碼如下:?123456789101112131415161718192021222324	<?php    require('./PHPMailer/class.phpmailer.php');    $phpmailer = new PHPMailer();    $phpmailer->IsSMTP();    $phpmailer->Host = 'smtp.163.com';  $phpmailer->SMTPAuth = true;  $phpmailer->Username = '';  $phpmailer->Password = '';    $phpmailer->CharSet = 'utf-8';  $phpmailer->From = '';  $phpmailer->FromName = '';  $phpmailer->Subject = '';  $phpmailer->Body = '';    $phpmailer->AddAddress('never_kiss@163.com','Aseoe');    echo $phpmailer->send()?'發送成功':'發送失敗';   ?> 上面不帶內容,面看個帶內容的,代碼如下:?1234567891011121314151617181920212223242526272829303132333435363738	<?php   /** 用PHPMailer類來發信   步驟: 0: 引入 1: 實例化 2: 配置屬性 3: 調用發送 **/require('./PHPMailer/class.phpmailer.php'); $phpmailer = new PHPMailer();   /* 設置phpmailer發信用的方式 可用用win下mail()函數來發 可以用linux下sendmail,qmail組件來發 可以利用smtp協議登陸到某個賬戶上,來發 */$phpmailer->IsSMTP(); // 用smtp協議來發 $phpmailer->Host = 'smtp.163.com'; $phpmailer->SMTPAuth = true; $phpmailer->Username = ''; //發送郵箱的賬號(用163郵箱發信的賬號) $phpmailer->Password = ''; //發送郵箱的密碼 // 可以發信了 $phpmailer->CharSet='utf-8'; $phpmailer->From = 'never_4ill@163.com'; $phpmailer->FromName = 'neverkill'; $phpmailer->Subject = 'Superstart Aseoe'; $phpmailer->Body = '腳本之家(http://www.jb51.net 專注前端開發與編程設計.'; //設置收信人 $phpmailer->AddAddress('never_4ill@163.com','neverkill'); // 添加一個抄送 $phpmailer->AddCC('1234567','Aseoe'); // 發信 echo $phpmailer->send()?'ok':'fail'; 補充一個使用上面例子的方法:直接將phpmailer壓縮包解壓放到根目錄即可運行,直接把文件放到本地wamp 根目錄,運行02.php 郵件即可發出(前提php文件可執行)-(不行的話 在根目錄建一個文件夾 重復操作一次)http://localhost/02.php。

    PHP 防止 E-mail 注入模板代碼
    <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 過濾器來對輸入進行驗證:

    FILTER_SANITIZE_EMAIL 從字符串中刪除電子郵件的非法字符FILTER_VALIDATE_EMAIL 驗證電子郵件地址PHP 錯誤處理

    在 PHP 中,默認的錯誤處理很簡單。一條消息會被發送到瀏覽器,這條消息帶有文件名、行號以及一條描述錯誤的消息。

    在創建腳本和 web 應用程序時,錯誤處理是一個重要的部分。如果您的代碼缺少錯誤檢測編碼,那么程序看上去很不專業,也為安全風險敞開了大門。

    本教程介紹了 PHP 中一些最為重要的錯誤檢測方法。

    我們將為您講解不同的錯誤處理方法:

    簡單的 "die()" 語句 自定義錯誤和錯誤觸發器錯誤報告
    基本的錯誤處理:使用 die() 函數

    第一個例子展示了一個打開文本文件的簡單腳本:

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

    如果文件不存在,您會獲得類似這樣的錯誤:

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

    為了避免用戶獲得類似上面的錯誤消息,我們在訪問文件之前檢測該文件是否存在:

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

    現在,假如文件不存在,您會得到類似這樣的錯誤消息:

    File not found

    比起之前的代碼,上面的代碼更有效,這是由于它采用了一個簡單的錯誤處理機制在錯誤之后終止了腳本。

    不過,簡單地終止腳本并不總是恰當的方式。讓我們研究一下用于處理錯誤的備選的 PHP 函數。

    創建自定義錯誤處理器

    創建一個自定義的錯誤處理器非常簡單。我們很簡單地創建了一個專用函數,可以在 PHP 中發生錯誤時調用該函數。

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

    語法
    error_function(error_level,error_message,error_file,error_line,error_context)
    error_level

    必需。為用戶定義的錯誤規定錯誤報告級別。必須是一個值數。

    參見下面的表格:錯誤報告級別。

    error_message 必需。為用戶定義的錯誤規定錯誤消息。 error_file 可選。規定錯誤在其中發生的文件名。 error_line 可選。規定錯誤發生的行號。 error_context 可選。規定一個數組,包含了當錯誤發生時在用的每個變量以及它們的值。
    參數 描述
    錯誤報告級別

    這些錯誤報告級別是錯誤處理程序旨在處理的錯誤的不同的類型:

    2 E_WARNING 非致命的 run-time 錯誤。不暫停腳本執行。 8 E_NOTICE

    Run-time 通知。

    腳本發現可能有錯誤發生,但也可能在腳本正常運行時發生。

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

    所有錯誤和警告,除級別 E_STRICT 以外。

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

    常量 描述

    現在,讓我們創建一個處理錯誤的函數:

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

    上面的代碼是一個簡單的錯誤處理函數。當它被觸發時,它會取得錯誤級別和錯誤消息。然后它會輸出錯誤級別和消息,并終止腳本。

    現在,我們已經創建了一個錯誤處理函數,我們需要確定在何時觸發該函數。

    Set Error Handler

    PHP 的默認錯誤處理程序是內建的錯誤處理程序。我們打算把上面的函數改造為腳本運行期間的默認錯誤處理程序。

    可以修改錯誤處理程序,使其僅應用到某些錯誤,這樣腳本就可以不同的方式來處理不同的錯誤。不過,在本例中,我們打算針對所有錯誤來使用我們的自定義錯誤處理程序:

    set_error_handler("customError");

    由于我們希望我們的自定義函數來處理所有錯誤,set_error_handler() 僅需要一個參數,可以添加第二個參數來規定錯誤級別。

    實例

    通過嘗試輸出不存在的變量,來測試這個錯誤處理程序:

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

    以上代碼的輸出應該類似這樣:

    Error: [8] Undefined variable: test
    觸發錯誤

    在腳本中用戶輸入數據的位置,當用戶的輸入無效時觸發錯誤的很有用的。在 PHP 中,這個任務由 trigger_error() 完成。

    例子

    在本例中,如果 "test" 變量大于 "1",就會發生錯誤:

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

    以上代碼的輸出應該類似這樣:

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

    您可以在腳本中任何位置觸發錯誤,通過添加的第二個參數,您能夠規定所觸發的錯誤級別。

    可能的錯誤類型:E_USER_ERROR - 致命的用戶生成的 run-time 錯誤。錯誤無法恢復。腳本執行被中斷。E_USER_WARNING - 非致命的用戶生成的 run-time 警告。腳本執行不被中斷。E_USER_NOTICE - 默認。用戶生成的 run-time 通知。腳本發現了可能的錯誤,也有可能在腳本運行正常時發生。例子

    在本例中,如果 "test" 變量大于 "1",則發生 E_USER_WARNING 錯誤。如果發生了 E_USER_WARNING,我們將使用我們的自定義錯誤處理程序并結束腳本:

    <?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); }?>

    以上代碼的輸出應該類似這樣:

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

    現在,我們已經學習了如何創建自己的 error,以及如何觸發它們,現在我們研究一下錯誤記錄。

    錯誤記錄

    默認地,根據在 php.ini 中的 error_log 配置,PHP 向服務器的錯誤記錄系統或文件發送錯誤記錄。通過使用 error_log() 函數,您可以向指定的文件或遠程目的地發送錯誤記錄。

    通過電子郵件向您自己發送錯誤消息,是一種獲得指定錯誤的通知的好辦法。

    通過 E-Mail 發送錯誤消息

    在下面的例子中,如果特定的錯誤發生,我們將發送帶有錯誤消息的電子郵件,并結束腳本:

    <?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); }?>

    以上代碼的輸出應該類似這樣:

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

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

    Error: [512] Value must be 1 or below

    這個方法不適合所有的錯誤。常規錯誤應當通過使用默認的 PHP 記錄系統在服務器上進行記錄。

    PHP 異常處理

    當異常被觸發時,通常會發生:

    當前代碼狀態被保存代碼執行被切換到預定義的異常處理器函數根據情況,處理器也許會從保存的代碼狀態重新開始執行代碼,終止腳本執行,或從代碼中另外的位置繼續執行腳本

    我們將展示不同的錯誤處理方法:

    異常的基本使用創建自定義的異常處理器多個異常重新拋出異常設置頂層異常處理器異常的基本使用

    當異常被拋出時,其后的代碼不會繼續執行,PHP 會嘗試查找匹配的 "catch" 代碼塊。

    如果異常沒有被捕獲,而且又沒用使用 set_exception_handler() 作相應的處理的話,那么將發生一個嚴重的錯誤(致命錯誤),并且輸出 "Uncaught Exception" (未捕獲異常)的錯誤消息。

    讓我們嘗試拋出一個異常,同時不去捕獲它:

    Try, throw 和 catch

    要避免上面例子出現的錯誤,我們需要創建適當的代碼來處理異常。

    正確的處理程序應當包括:

    Try - 使用異常的函數應該位于 "try" 代碼塊內。如果沒有觸發異常,則代碼將照常繼續執行。但是如果異常被觸發,會拋出一個異常。Throw - 這里規定如何觸發異常。每一個 "throw" 必須對應至少一個 "catch"Catch - "catch" 代碼塊會捕獲異常,并創建一個包含異常信息的對象

    讓我們觸發一個異常:

    <?php//創建可拋出一個異常的函數function checkNum($number) { if($number>1)  {  throw new Exception("Value must be 1 or below");  } return true; }//在 "try" 代碼塊中觸發異常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(); }?>

    上面代碼將獲得類似這樣一個錯誤:

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

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

    創建 checkNum() 函數。它檢測數字是否大于 1。如果是,則拋出一個異常。在 "try" 代碼塊中調用 checkNum() 函數。checkNum() 函數中的異常被拋出"catch" 代碼塊接收到該異常,并創建一個包含異常信息的對象 ($e)。通過從這個 exception 對象調用 $e->getMessage(),輸出來自該異常的錯誤消息

    不過,為了遵循“每個 throw 必須對應一個 catch”的原則,可以設置一個頂層的異常處理器來處理漏掉的錯誤。

    PHP編程

    鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

  • 發表評論 共有條評論
    用戶名: 密碼:
    驗證碼: 匿名發表
    亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
    成人网欧美在线视频| 久久露脸国产精品| 成人黄色午夜影院| 久久成人免费视频| 亚洲国产成人在线视频| 成人精品视频在线| 欧美日韩国产123| 亚洲最大成人免费视频| 一区二区三区 在线观看视| 欧美亚洲国产另类| 人妖精品videosex性欧美| 91亚洲精品久久久| 欧美黄色片在线观看| 成人国产精品色哟哟| 欧美激情欧美激情| 亚洲精品国产精品国自产在线| 欧美成人午夜剧场免费观看| 久久艹在线视频| 日韩亚洲第一页| 中文国产亚洲喷潮| 欧美一区在线直播| 国产精品午夜国产小视频| 亚洲性生活视频在线观看| 亚洲欧美在线一区二区| 欧美中文字幕视频| 亚洲福利影片在线| 日韩精品久久久久久久玫瑰园| 欧美视频二区36p| 久久躁狠狠躁夜夜爽| 久久亚洲精品国产亚洲老地址| 欧美午夜女人视频在线| 最近2019年手机中文字幕| 欧美影院久久久| 欧洲s码亚洲m码精品一区| 国产精品偷伦一区二区| 亚洲男人天堂2023| 欧美成人精品一区二区| 国产热re99久久6国产精品| 久久影视电视剧免费网站清宫辞电视| 亚洲欧美日韩一区二区三区在线| 欧美日韩国产丝袜美女| 国产精品pans私拍| 疯狂欧美牲乱大交777| 国产一区二区三区欧美| 国产九九精品视频| 夜色77av精品影院| 久久精品国产欧美激情| 中文字幕日韩精品在线观看| 亚洲欧美在线看| 国产一区二区三区精品久久久| 中文字幕日韩精品在线观看| 91高清免费在线观看| 亚洲精品之草原avav久久| 日韩av大片在线| 韩国国内大量揄拍精品视频| 91精品国产91久久久久久不卡| 欧美自拍视频在线观看| 亚洲情综合五月天| 国产aⅴ夜夜欢一区二区三区| 欧美激情xxxx| 韩国三级电影久久久久久| 国产精品美女久久久久久免费| 国产精品白丝av嫩草影院| 中文字幕国产精品| 欧美中文字幕视频| 欧美专区国产专区| 国产成人91久久精品| 亚洲xxxx做受欧美| 91精品久久久久久久久久久| 国产精品网红直播| 欧美日韩电影在线观看| 国产一区二区三区高清在线观看| 亚洲人成毛片在线播放| 久久999免费视频| 久久精品中文字幕| 亚洲成人教育av| 啪一啪鲁一鲁2019在线视频| 麻豆国产精品va在线观看不卡| 国内外成人免费激情在线视频网站| 欧美激情伊人电影| 欧美日韩精品在线视频| 国产精品一区二区av影院萌芽| 欧美性jizz18性欧美| 丝袜美腿精品国产二区| 亚洲一区二区在线| 爽爽爽爽爽爽爽成人免费观看| 免费99精品国产自在在线| 久久国产精品久久国产精品| 国产综合香蕉五月婷在线| 在线观看精品自拍私拍| 97高清免费视频| 精品久久久久久久久久久久| 国产在线98福利播放视频| 国产999精品| 亚洲欧美日韩天堂一区二区| 亚洲国产97在线精品一区| 91九色在线视频| 国产精品爽黄69天堂a| 国产精品美女主播| 国产精品久久久久久久一区探花| 91精品在线观看视频| 57pao国产成人免费| 久久在线视频在线| 国产一区私人高清影院| 欧美精品激情在线观看| 亚洲人成啪啪网站| 热久久这里只有精品| zzijzzij亚洲日本成熟少妇| 国产日韩精品电影| 亚洲精品乱码久久久久久按摩观| 国产一区二区三区三区在线观看| 国产精品久久久久久久美男| 亚洲欧洲视频在线| 亚洲在线第一页| 一区二区在线视频播放| 中文字幕综合在线| 日韩在线视频观看正片免费网站| 久久久久久久久久久久久久久久久久av| 精品日本美女福利在线观看| 欧美大全免费观看电视剧大泉洋| 91精品国产91久久久久久吃药| 欧美日韩成人黄色| 亚洲精品色婷婷福利天堂| 国产精品女主播视频| 成人欧美一区二区三区黑人孕妇| 91精品免费看| 中文字幕久久久| 国产日本欧美一区| 亚洲欧美综合图区| 91精品国产综合久久久久久久久| 日韩亚洲在线观看| 91超碰caoporn97人人| 久久久久久这里只有精品| 日韩精品高清在线观看| 伊人久久大香线蕉av一区二区| 午夜精品国产精品大乳美女| 91久久久久久久久久久| 欧美激情一区二区三区成人| 日产精品久久久一区二区福利| 欧美洲成人男女午夜视频| 5566成人精品视频免费| 国产97在线观看| 亚洲第一精品福利| 亚洲国产精品一区二区久| 亚洲国产精品电影在线观看| 欧美激情按摩在线| 亚洲成人免费网站| 欧美激情伊人电影| 一区二区在线视频| 欧美综合国产精品久久丁香| 午夜精品久久久久久久久久久久| 97热在线精品视频在线观看| 日韩网站免费观看高清| 久久精品视频播放| 国外视频精品毛片| 欧美日韩中文字幕在线视频| 久久久久久伊人| 91美女片黄在线观| 色偷偷偷亚洲综合网另类| 国产视频亚洲视频| 欧美性69xxxx肥| 亚洲国产小视频在线观看| 国产亚洲欧洲高清| 欧美尺度大的性做爰视频|