摘要:使用類來管理日期和時間使用類來構造長度固定的時間段。時區的處理選擇。預處理語句時的實例。簡單而言,流是具有流式行為的資源對象。流的作用實際上是在出發地和目的地之間傳輸數據。錯誤由于某種原因導致無法運行,通常會觸發錯誤。
過濾、驗證、轉義
所有這些外部資源都不能完全相信
$_GET
$_POST
$_REQUEST
$_COOKIE
$argv
php://stdin
php://input
file_get_contents()
遠程數據庫
遠程API
客戶端的數據
過濾使用htmlentities()過濾HTML,將特殊字符轉換為HTML實體,轉義輸出,第二個參數使用ENT_QUOTES。
使用PDO預處理語句過濾SQL注入.
使用filter_var() & filter_input()函數來過濾和驗證不同類型的輸入。
密碼Eg: email, number, char, 特殊字符
最安全的哈希算法:bcrypt
使用:
password_hash() password_get_info() password_needs_rehash() password_verify()
函數來生成密碼。
日期,時間,時區使用PHP5.2.0引入的DateTime & DateInterval & DateTimeZone類來處理時間。
設置默認時區在php.ini中,設置
date.timezone = "country/city"
使用date_default_timezone_set()函數來設置默認時區。
DateTime Class使用DateTime類來管理日期和時間
$datetime = new DateTime();
使用DateInterval類來構造長度固定的時間段。配合上一個類中的方法使用。
DateTimeZone Class時區的處理選擇。
$timezone = new DateTimeZone("Asia/Shanghai"); $datetime = new DateTime("2016-05-20", $timezone); $datetime->setTimezone(new DateTimeZone("Asia/Hong_Kong"));
有時,我們需要迭代處理一段時間內反復出現的一系列日期和時間,重復在日程表中記事就是個好例子。DatePeriod類可以解決這種問題
DatePeriod實例就是迭代器,每次迭代會產出一個DateTime實例。
format("Y-m-d H:i:s"), PHP_EOL; }DB PDO擴展
http://php.net/manual/zh/pdo.drivers.php
預處理語句為了防止SQL注入,使用PDO的預處理語句。
預處理語句時PDOStatement的實例。可以通過PDO實例的prepare()方法獲取與處理語句對象。
$sql = "select id from users where email = :email"; $statement = $pdo->prepare($sql); $email = filter_input(INPUT_GET, "email"); $statement->bindValue(":email", $email);http://php.net/manual/pdo.constants.php
繼續:
$statement->execute(); while (($result = $statement->fetch(PDO::FETCH_ASSOC)) !== false) { echo $result["email"]; } $results = $statement->fetchAll(PDO::FETCH_ASSOC); foreach ($results as $result) { echo $result["email"]; }PDO的事務try { $pdo = new PDO(); }catch(PDOExcetion $e){ // } $stmtSubtract = $pdo->prepare(" UPDATE accounts SET amount = amount - :amount WHERE name = :name "); $stmtAdd = $pdo->prepare(" UPDATE accounts SET amount = amount + :amount WHERE name = :name "); $pdo->beginTransaction(); $fromAccount = "Checking"; $withdrawal = 50; $stmtSubtract->bindParam(":name", $fromAccount); $stmtSubtract->bindParam(":amount", $withDrawal, PDO::PARAM_INT); $stmtSubtract->execute(); $toAccount = "Savings"; $deposit = 50; $stmtSubtract->bindParam(":name", $$toAccount); $stmtSubtract->bindParam(":amount", $deposit, PDO::PARAM_INT); $stmtSubtract->execute(); $pdo->commit();多字節字符串PHP假設字符串中的每個自負都是八位字符,占一個字節的內存。然而考慮到國家化的時候,一個字符就不只占用一個字節了。
為了避免處理多字節字符串出錯,可以安裝mbstring擴展。替換PHP原生的函數。
關于字符編碼
一定要知道數據的字符編碼
使用UTF8存儲數據
使用UTF8輸出數據
在php.ini中設置,告訴PHP使用UTF8:
default_charset = "UTF-8";很多PHP函數都使用這個默認的字符集:
htmlentities() html_entity_decode() htmlspecialchars() 以及mbstring中的擴展函數流流在PHP4.3.0中引入,作用是使用統一的方式處理文件,網絡和數據壓縮等共用同一套函數和用法的操作。簡單而言,流是具有流式行為的資源對象。因此,流可以線性讀寫,或許還能使用fseek()函數定位到流中的任何位置。
流的作用實際上是在出發地和目的地之間傳輸數據。出發地和目的地可以是
流封裝協議文件,命令行進程,網絡連接,zip, TAR壓縮, 臨時內存,標準輸入輸出,或者是通過php流封裝協議實現的資源(http://php.net/manual/wrappers.php)
http://php.net/manual/wrappers.php
流封裝協議的作用是使用通用的接口封裝讀寫文件系統的差異。
每個流都有一個協議和目標
file:// 流封裝協議:// file_get_contents
fopen
fwrite
fclose
php://流封裝協議php://stdin
php://stdout
php://memory
php://temp
自己編寫流封裝協議PHP提供了一個示例streamWrapper類,編寫自定義的流封裝協議。
http://php.net/manual/class.streamwrapper.php
http://php.net/manual/stream.streamwrapper.example-1.php
流上下文有些PHP流能接受一系列可選的參數,這些參數叫流上下文,用于定制流的行為。
使用
stream_context_create()函數創建。
[ "method" => "POST", "header" => "", "content" => $requestBody, ], ]); $response = file_get_contents("http://x/xapi", false, $context);流過濾器把過濾器附加到現有的流上,使用
stream_filter_append()還可以使用php://filter流協議把過濾器附加到流上。
$handle = fopen("php://filter/read=string.toupper/resource=data.txt", "rb"); while () { }filter/read=/resource= :// 我們還可以使用php_user_filter類來自定義流過濾器
http://php.net/manual/en/class.php-user-filter.php
class DirtyWordsFilter extends php_user_filter { public function filter($in, $out, &$consumed, $closing) { $words = ["grime", "dirt", "grease"]; $wordData = []; foreach ($words as $word) { $replacement = array_fill(0, mb_strlen($word), "*"); $wordData[$word] = implode("", $replacement); } $bad = array_keys($wordData); $good = array_values($wordData); while ($bucket = stream_bucket_make_writeable($in)) { $bucket->data = str_replace($bad, $good, $bucket->data); $consumed += $bucket->datalen; stream_bucket_append($out, $bucket); } return PSFS_PASS_ON; } }然后,我們使用stream_filter_register()函數注冊這個自定義的流過濾器
stream_filter_register("dirty_words_filter", "DirtyWordsFilter");異常處理示例try { // } catch (PDOException $e) { } catch (Exception $e) { // 捕獲除了PDOException之外的所有異常 } finally { // 最終執行 }異常處理程序PHP允許我們注冊一個全局異常處理程序,捕獲所有未被捕獲的異常。
set_exception_handler(function (Exception $e) { // });在某些情況下,代碼執行完畢后,還需要還原成前一個異常處理程序。
restore_exception_handler()錯誤PHP由于某種原因導致無法運行,通常會觸發錯誤。
我們可以使用
trigger_error()自己觸發錯誤。
我們可以使用
error_reporting()或者php.ini中使用error_reporting指令,告訴PHP如何處理錯誤。
一定要遵守下述四個原則
一定要讓PHP報告錯誤
在開發環境中顯示錯誤
在生產環境中不能顯示錯誤
都要記錄錯誤
php.ini中:
//Dev display_startup_errors = On display_errors = On error_reporting = -1 log_errors = On //Prod display_startup_errors = Off display_errors = Off error_reporting = E_ALL & ~E_NOTICE log_errors = On錯誤處理的函數
set_error_handler(function ($error, $errstr, $errfile, $errline) { // Process error })我們也可以把PHP的錯誤轉換為異常
只能轉換滿足php.ini中error_reporting指令設置的錯誤
set_error_handler(function ($errno, $errstr, $errfile, $errline) { if (!(error_reporting() & $errno)) { return } throw new ErrorException($errstr, $errno, 0, $errfile, $errline); });參考
Modern PHP
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/21646.html
摘要:網站性能類似于二八定律,其中的優化將帶來網站的性能提升。代碼重用最大的性能缺陷之一是文件大小過大和不必要的瀏覽器呈現。最大程度上減少文件大小的快速方法就是盡可能多地重用樣式。此外,圖像可能被壓縮,刪除任何不必要的注釋和顏色配置文件。 性能與組織 當能夠扎實的理解并編寫HTML和CSS這門專業知識。隨著網站代碼量和流量的增長,另一種新技能也開始發揮作用,這對于開發效率和用戶體驗都至關重要...
摘要:網站性能類似于二八定律,其中的優化將帶來網站的性能提升。代碼重用最大的性能缺陷之一是文件大小過大和不必要的瀏覽器呈現。最大程度上減少文件大小的快速方法就是盡可能多地重用樣式。此外,圖像可能被壓縮,刪除任何不必要的注釋和顏色配置文件。 性能與組織 當能夠扎實的理解并編寫HTML和CSS這門專業知識。隨著網站代碼量和流量的增長,另一種新技能也開始發揮作用,這對于開發效率和用戶體驗都至關重要...
摘要:對于從零開始建網站的新手,知道下面十大忠告,可以少走彎路,早日走上康莊大道。阿里云自助建站平臺支持快速備案建一個手機網站手機網站具有讓消費者隨時隨地隨身訪問的優勢和方便快捷的不可取代的特點。對于從零開始建網站的新手,知道下面十大忠告,可以少走彎路,早日走上康莊大道。 1、一定要做網站規劃方案 一個網站的成功與否與建站前的網站規劃有著極為重要的關系。在建立網站前應明確建設網站的目的,確定網...
閱讀 1551·2021-11-25 09:43
閱讀 2332·2019-08-30 15:55
閱讀 1465·2019-08-30 13:08
閱讀 2666·2019-08-29 10:59
閱讀 810·2019-08-29 10:54
閱讀 1551·2019-08-26 18:26
閱讀 2546·2019-08-26 13:44
閱讀 2653·2019-08-23 18:36