首頁 > 軟體

PHP和MySQL Web開發

2021-06-01 03:00:28

儘管目前開發主要是基於ThinkPHP框架,ThinkPHP框架的幫助文件看得比較多,但對於PHP的入門和系統學習還是基於《PHP和MySQL Web開發》這本書。

PHP語言特性

PHP檔案。PHP作為伺服器端指令碼語言,用於在Web伺服器上被解釋和執行。PHP檔案由PHP標記定義,它告訴Web伺服器PHP程式碼的開始和結束,也用於在混合編碼的檔案中隔離PHP程式碼和HTML。XML風格是PHP推薦使用的標記風格。應用ThinkPHP框架開發時,對於一個單獨的PHP檔案可以省略掉?>標記。PHP檔案也可以由PHP執行程式直接排程運行。

<?php  // PHP程式碼;?>

註釋。PHP支援C,C++和Shell指令碼風格的註釋。

<?php  // c/c++註釋  /* c/c++註釋 */  # Shell註釋?>

變數。PHP變數名稱都是以美元符號開始的。不要求在使用變數之前聲明變數,當第一次給一個變數賦值時就會創建這個變數變數的類型是由賦給變數的值確定的。PHP支援如下基本資料類型: Integer, Float, String, Boolean, Array, Object, NULL和resource。PHP的類型轉換與C語言的類型轉換相同。PHP還提供了可變變數,允許動態的改變一個變數的名稱。在雙引號中變數名稱將被變數時所替代,在單引號中變數名稱或者任何其他文字都會不經修改而傳送給瀏覽器。訪問表單資料有三種方法,其中中等風格是如今所推薦的。

<?php  $formVar = $_POST['表單控制項名'];//訪問表單資料

常量。使用define函數定義常量。常量名稱都是由大寫字母組成的,借鑑了C語言的慣例,前面沒有美元符號。常量只可以儲存布爾值、整數、浮點數或字元串資料。

<?php  define('CONST', value);

操作符。除了基本的操作符外,PHP提供了錯誤抑制操作符、執行操作符、陣列操作符以及類型操作符。錯誤抑制操作符@用於抑制警告,並通過錯誤處理函數來處理警告。執行操作符是一對反向單引號,PHP將試著將反向單引號之間的命令當做伺服器端的命令列來執行,表示式的值就是命令的執行結果。陣列操作符包括聯合、等價、恆等、非等價、非恆等等。類型操作符instanceof在面向物件程式設計中使用,用於檢查一個物件是否是特定類的事例。

<?php  $a = @(57/0); //錯誤抑制操作符  $out = `ls -la`; //執行操作符  $b = $obj instanceof SomeClass; //類型操作符  

控制結構。除了一般的控制結構, PHP還提供了Declare結構,用來設定程式碼塊的執行指令(即如何運行的規則)。

<?php  declare(執行指令)  {    //程式碼  }

函數。PHP函數聲明以關鍵字function開始在函數內部聲明的變數作用域是從聲明它們的那條語句開始到函數末尾。使用關鍵字global可以手動指定一個在函數中定義或使用的變數,具有全局作用域。

<?phpfunction functionName(params){  // code}

類。與常見程式語言一樣,PHP使用關鍵字class創建類、使用extends指明類間的繼承關係,使用interface定義介面,使用abstract定義抽象類,使用final關鍵字禁止繼承和過載。但PHP使用名為__construct的函數聲明建構函式,使用名為__destruct的函數定義解構函式,使用特殊指針$this訪問操作或變數,使用__get和__set函數來檢查和設定任何屬性的值,使用__clone方法指定克隆行為以支援利用PHP的clone關鍵字複製物件,使用__call過載方法,使用__toString函數將類轉化為字元串。

<?php  class ClassName  {      //建構函式      function __construct($param)      {      }            public function __get($name)      {      }            public function __set($name, $value)      {      }            public function __call($mathod, $p)      {      }            public function __toString()      {      }            //解構函式      function __destruct()      {      }  }

PHP函數庫

一個語言的廣泛使用除了提供良好的語言特性外,還依賴於強大的函數庫。PHP同樣提供了一套豐富的函數庫來擴展其能力,書中僅介紹了包括陣列、字元串處理和檔案目錄操作等幾個方面的部分函數,而且PHP版本較老,更新更全的擴展可以到PHP的官網https://www.php.net/manual/zh/funcref.php上查詢。結合PHP官網梳理各類函數庫如下。

檔案系統函數庫。包括直接處理與裝置互動的Direct IO庫,基於檔案內容探索檔案類型的Fileinfo庫,監聽檔案變化的Inotify庫,為檔案新增額外屬性的xattr庫,返回檔案差異的xdiff庫,以及處理一般檔案系統和目錄的函數庫 。以下是處理一般檔案系統和目錄的部分常用函數。

//檢測檔案檔案的指定屬性bool file_exists(string $filepath); //檔案是否存在int filesize(string $filepath); //檢視檔案大小
//創建、賦值、移動、重新命名、刪除和鎖定檔案bool touch(string $file[, int $time[, int $atime]); //創建檔案void copy(string $sourcepath, string $destpath); //複製檔案void rename(string $oldfile, string $newfile); //移動檔案bool unlink(string $filepath); //刪除檔案bool flock(resource $handle, int $operation(, int & $wouldblock]); //鎖定檔案
//讀寫檔案resource fopen(string $filepath, string $mode); //開啟檔案bool feof(resource $handle); //檢查是否指向了檔案末尾//在檔案中定位void rewind(resource $handle); //將檔案指針復位到檔案的開始int ftell(resource $handle); //以位元組為單位報告檔案指針在當前檔案中的位置int fseek(resource $handle, int $offset[, int $whence]); //將檔案指針指向檔案的某個位置 //讀取一個字元string fgetc(resource $handle); //每次讀取一行內容string fgets(resource $handle, int $length); //每次讀取一行內容string fgetss(resource $handle, int $length[, stirng $allowable_tags]); //每次讀取一行內容,過濾字元串中包含的標記array fgetcsv(resource $handle, int $length[, string $delimiter[, string $enclosure]]); //每次讀取一行內容,基於界定符分割//讀取整個檔案int readfile(string $filename,[int $use_include_path[, resource $context]]); //讀取整個檔案,並將內容輸出到標準輸出bool fpassthru(resource $fp);//讀取整個檔案,並輸出到標準輸出array file(string $path); //讀取整個檔案,輸出到陣列string file_get_contents(); //讀取整個檔案,返回字元串//讀取任意長度string fread(resource $fp, int $length); //寫檔案fwrite(resource $handle, string $content[, int $length]);//寫檔案int file_put_contents(string $filename, string $data [, int $flags [, resource $context]]); //寫檔案,不需要開啟檔案獲得resource
fclose(resource $fp); //關閉檔案
//目錄函數和類resource opendir(string $path); //開啟所瀏覽的目錄resource readdir(resource $handle) //從目錄依次讀取檔案,沒有可讀的檔案,返回falsevoid closedir(resource $handle); //關閉目錄void rewinddir(resource $handle); //恢復目錄控制代碼到目錄開始array files = scandir(string $dirpath, int $sorting_order); //返回目錄下的檔名稱,並以字母表順序排序 //預設order為0,升序,1則為降序。string dirname(string $path); //返回路徑的目錄部分string basename(string $path); //返回路徑的檔名稱部分int disk_free_space(string $path); //磁碟或該目錄所在檔案系統的剩餘空間(位元組) mkdir(string $path, int $mode); //創建目錄,rmdir(string $path); //移除目錄 $dir = dir(string $path) //返回一個目錄物件,包含handle和path屬性$dir->read(); //同opendir$dir->close(); //同closedir$dir->rewind(); //同rewind

超級全局資料$_FILES。上傳檔案的表單標記中,必須設定屬性enctype="multipart/form-data"。可以設定一個隱藏的MAX_FILE_SIZE表單域,限制上傳檔案的最大位元組長度。上傳檔案時,檔案將儲存在伺服器臨時目錄,由超級全局陣列$_FILES儲存相應檔案資訊。

//form<form enctype="multipart/form-data">  <input type="hidden" name="MAX_FILE_SIZE" value="1000000"/>  <input type="file" name="userfile"/></form>
//$_FILES$_FILES['userfile']['tmp_name']; //檔案在Web伺服器中臨時儲存的位置$_FILES['userfile']['name']; //檔名稱$_FILES['userfile']['size']; //檔案的位元組大小$_FILES['userfile']['type']; //檔案的MIME類型$_FILES['userfile']['error']; //任何與檔案上傳相關的錯誤程式碼 //0, 沒有發生任何錯誤 //1, 上傳檔案大小超出了約定值 //2, 上傳檔案大小超出了表單的MAX_FILE_SIZE元素指定的最大值 //3, 檔案被部分上傳 //4, 沒有上傳任何檔案 //6, 在php.ini中沒有指定臨時目錄 //7, 檔案寫入磁碟失敗

日期和時間處理函數庫。包括處理日期和時間的DateTime類和不可變類DateTimeImmutable,處理時區的DateTimeZone類,處理時間間隔的DateInterval類,以處理時間週期的DatePeriod類,同時包括大量的直接可呼叫的Date/Time函數,以下是書中列舉的幾個常用的函數

string date ( string $format [, int $timestamp ])//格式化一個本地日期時間int mktime ([int $hour[, int $minute[, int $second[, int $month[, int $day[, int $year[, int $is_dst]]]]]]])int time(); //返回當前的 Unix 時間戳array getdate ( int $timestamp = time()); //返回一個根據timestamp得到包含有日期資訊的關聯陣列,預設輸入當前時間bool checkdate ( int $month , int $day , int $year ); //驗證由參數構成的日期的合法string strftime ( string $format , int $timestamp = time() ); //根據系統所在區域格式化一個時間

PHP選項/資訊類函數庫。支援獲取許多關於PHP本身的參數,其中與環境變數互動的函數如下。

string getenv ( string $varname , bool $local_only = false ); //獲取環境變數bool putenv ( string $setting ); //設定環境變數的值

PHP變數與類型相關擴展函數庫。包括陣列、類/物件、Ctype字元類型檢測函數、資料驗證和過濾函數、函數處理函數、反射API以及變數處理函數。變數處理函數允許我們使用不同的方法來操作和測試變數,部分函數如下。

string gettype(mixed $var); //獲得變數的類型bool settype(mixed $var, string $type); //設定變數的類型bool is_array(mixed $var); //檢查變數是否是陣列bool is_double(mixed $var); bool is_float(mixed $var);bool is_integer(mixed $var);bool is_string(mixed $var);bool is_object(mixed $var);bool is_resource(mixed $var);bool is_null(mixed $var);bool is_scalar(mixed $var); //檢查變數是否是標量bool is_numeric(mixed $var); //檢查變數是否是數字或數字字元串bool is_callable(mixed $var); //檢查變數是否是函數bool isset(mixed $var); //檢查變數是否存在bool empty(mixed $var); //檢查變數是否存在,存在的話值是否為非空且非零  void unset(mixed $var); //銷燬變數

文字處理函數庫。包括CommonMark——Markdown語法規範實現庫、詞法語法分析庫Parle、正則表示式庫PCRE、模糊雜湊演算法庫ssdeep和字元串處理函數庫等。

除此之外,PHP還提供了音訊格式操作、身份認證服務、壓縮與歸檔、加密、資料庫抽象、ImageMagick等影象生成與處理、國際化與字元編碼、郵件與FTP等服務、數學擴展庫、PS和XLSWriter等非文字內容的MIME輸出、程序控制擴展、搜尋引擎、伺服器擴展、Session、Web服務、XML操作等函數庫。這些函數庫內容龐雜,需要在以後的應用中不斷去PHP官網上學習。

Web安全性問題

對於Web應用來說,如何保證其安全性是一個非常重要的問題。書中也花了大量篇幅對其進行介紹,梳理了Web應用可能的安全威脅及應對方法。

資料的洩露。不要將不希望被別人看到的資訊儲存到Web伺服器上;必須限制訪問資訊的方法以及能夠訪問這些資訊的使用者;從伺服器上刪除不必要的服務;身份驗證,具體實現可以有許多不同的方法,但是通常只使用其中兩種形式——密碼和數字簽名;資訊加密小心謹慎的設計、配置、編碼和測試。對於Web資料庫伺服器的配置,確認只有超級使用者賬戶才可以訪問許可權表和管理資料庫,其他賬戶只能擁有訪問和或修改賬戶本身可以訪問的資料庫許可權;限制允許連線資料庫的使用者;通過加密的連線來連線伺服器;確保資料庫伺服器在任何時候能夠處理的連結數大於或超過Web伺服器和PHP的連線數。

資料丟失和資料破壞。只有一種真正的保護措施——備份。

資料修改。可以通過計算一個簽名,來防止資料在網路傳輸過程中被人修改。在作業系統中應用檔案許可權以防止未授權的訪問。

拒絕服務。發現被常規的DDOS工具佔用的預設埠並關閉這些埠;利用路由器提供的類似於限制使用特定協議的流量百分比的機制;唯一真正有效的防範措施是監視常規流量以及配備一批專家已在發生異常的時候採取對策。

否認。身份驗證;對於關係正處於持續過程中的雙方事務,採用經過簽名的數字證書進行通訊。

軟體錯誤。過濾使用者輸入;轉義輸出;確保Web伺服器被配置為只允許請求PHP和HTML檔案,而對其他類型的檔案的請求必須返回錯誤;任何其他檔案都必須與公共文件根目錄隔離;最好不要將儲存使用者名稱和密碼的檔案儲存在Web應用的文件根目錄。

另外利用防火牆隔離區域來保護網路。防火可以用於保護內部網路中的機器以防外來攻擊,也用於限制其內部的個人和機器的行為


IT145.com E-mail:sddin#qq.com