php文件系統之讀取文件內容 PHP具有豐富的文件操作函數,最簡單的讀取文件的函數為file_get_contents,可以將整個文件全部讀取到一個字符串中。
$content = file_get_contents(‘./test.txt’); file_get_contents也可以通過參數控制讀取內容的開始點以及長度。
$content = file_get_contents(‘./test.txt’, null, null, 100, 500); PHP也提供類似于C語言操作文件的方法,使用fopen,fgets,fread等方法,fgets可以從文件指針中讀取一行,freads可以讀取指定長度的字符串。
PHP文件系統之判斷文件是否存在 一般情況下在對文件進行操作的時候需要先判斷文件是否存在,PHP中常用來判斷文件存在的函數有兩個is_file與file_exists.
PHP文件系統之取得文件的修改時間 文件有很多元屬性,包括:文件的所有者、創建時間、修改時間、最后的訪問時間等。
fileowner:獲得文件的所有者 filectime:獲取文件的創建時間 filemtime:獲取文件的修改時間 fileatime:獲取文件的訪問時間 其中最常用的是文件的修改時間,通過文件的修改時間,可以判斷文件的時效性,經常用在靜態文件或者緩存數據的更新。
PHP文件系統之取得文件的大小 通過filesize函數可以取得文件的大小,文件大小是以字節數表示的。
function getsize(
PHP日期和時間之取得當前的Unix時間戳 UNIX 時間戳(英文叫做:timestamp)是 PHP 中關于時間與日期的一個很重要的概念,它表示從 1970年1月1日 00:00:00 到當前時間的秒數之和。
PHP提供了內置函數 time() 來取得服務器當前時間的時間戳。那么獲取當前的UNIX時間戳就很簡單了。
$time = time();
echo $time;//1396193923,這個數字表示從1970年1月1日 00:00:00 到我輸出這個腳本時經歷了1396193923秒
PHP日期和時間之取得當前的日期 php內置了date()函數,來取得當前的日期。
函數說明:date(時間戳的格式, 規定時間戳【默認是當前的日期和時間,可選】)
返回值:函數日期和時間
例子:
//date函數,第二個參數取默認值的情況 echo date(“Y-m-d”);//2014-03-30
//date函數,第二個參數有值的情況 echo date(“Y-m-d”,’1396193923’);//2014-03-30,1396193923表示2014-03-30的unix時間戳
PHP日期和時間之取得日期的Unix時間戳 UNIX 時間戳(英文叫做:timestamp)是 PHP 中關于時間與日期的一個很重要的概念,它表示從 1970年1月1日 00:00:00 到當前時間的秒數之和。
PHP提供了內置函數strtotime實現功能:獲取某個日期的時間戳,或獲取某個時間的時間戳。例如:
echo strtotime(‘2014-04-29’);//1398700800,這個數字表示從1970年1月1日 00:00:00 到2014年4月29號經歷了1398700800秒
echo strtotime(‘2014-04-29 00:00:01’);//1398700801,這個數字表示從1970年1月1日 00:00:00 到2014-04-29 00:00:01時經歷了1398700801秒
大家發現上面的規律了嗎,其實strtotime(‘2014-04-29’)相當于strtotime(‘2014-04-29 00:00:00’)
PHP日期和時間之將格式化的日期字符串轉換為Unix時間戳 strtotime函數預期接受一個包含美國英語日期格式的字符串并嘗試將其解析為 Unix 時間戳。
函數說明:strtotime(要解析的時間字符串, 計算返回值的時間戳【默認是當前的時間,可選】) 返回值:成功則返回時間戳,否則返回 FALSE
比如
echo strtotime(“now”);//相當于將英文單詞now直接等于現在的日期和時間,并把這個日期時間轉化為unix時間戳。這個效果跟echo time();一樣。 echo strtotime(“+1 seconds”);//相當于將現在的日期和時間加上了1秒,并把這個日期時間轉化為unix時間戳。這個效果跟echo time()+1;一樣。 echo strtotime(“+1 day”);//相當于將現在的日期和時間加上了1天。 echo strtotime(“+1 week”);//相當于將現在的日期和時間加上了1周。 echo strtotime(“+1 week 3 days 7 hours 5 seconds”);//相當于將現在的日期和時間加上了1周3天7小時5秒。
PHP日期和時間之格式化格林威治(GMT)標準時間 gmdate 函數能格式化一個GMT的日期和時間,返回的是格林威治標準時(GMT)。
舉個例子,我們現在所在的中國時區是東八區,領先格林威治時間8個小時,有時候也叫GMT+8,那么服務器運行以下腳本返回的時間應該是這樣的: 當前時間假定是2014-05-01 15:15:22 echo date(‘Y-m-d H:i:s’, time()); //輸出為:2014-05-01 15:15:22 echo gmdate(‘Y-m-d H:i:s’, time()); //輸出為:2014-05-01 07:15:22 因為格林威治時間是現在中國時區的時間減去8個小時,所以相對于現在時間要少8個小時
GD指的是Graphic Device,PHP的GD庫是用來處理圖形的擴展庫,通過GD庫提供的一系列API,可以對圖像進行處理或者直接生成新的圖片。
PHP除了能進行文本處理以外,通過GD庫,可以對JPG、PNG、GIF、SWF等圖片進行處理。GD庫常用在圖片加水印,驗證碼生成等方面。
PHP默認已經集成了GD庫,只需要在安裝的時候開啟就行。
header("content-type: image/png");$img=imagecreatetruecolor(100, 100);$red=imagecolorallocate($img, 0xFF, 0x00, 0x00);imagefill($img, 0, 0, $red);imagepng($img);imagedestroy($img);PHP圖形操作之繪制線條 要對圖形進行操作,首先要新建一個畫布,通過imagecreatetruecolor函數可以創建一個真彩色的空白圖片:
$img = imagecreatetruecolor(100, 100); GD庫中對于畫筆所用的顏色,需要通過imagecolorallocate函數進行分配,通過參數設定RGB的顏色值來確定畫筆的顏色:
imageline(
header(“content-type: image/png”); imagepng($img); 最后可以調用imagedestroy釋放該圖片占用的內存。
imagedestroy($img); 通過上面的步驟,可以發現PHP繪制圖形非常的簡單,但很多時候我們不只是需要輸出圖片,可能我們還需要得到一個圖片文件,可以通過imagepng函數指定文件名將繪制后的圖像保存到文件中。
imagepng($img, ‘img.png’);
PHP圖形操作之在圖像中繪制文字 GD庫可以進行多種圖形的基本操作,常用的有繪制線條,背景填充,畫矩形,繪制文字等。
跟繪制線條類似,首先需要新建一個圖片與初始化顏色。
imagestring(
PHP圖形操作之輸出圖像文件 前面我們已經了解到,通過imagepng可以直接輸出圖像到瀏覽器,但是很多時候,我們希望將處理好的圖像保存到文件,以便可以多次使用。通過指定路徑參數將圖像保存到文件中。
PHP圖形操作之生成圖像驗證碼 簡單的驗證碼其實就是在圖片中輸出了幾個字符,通過我們前面章節講到的imagestring函數就能實現。
但是在處理上,為了使驗證碼更加的安全,防止其他程序自動識別,因此常常需要對驗證碼進行一些干擾處理,通常會采用繪制一些噪點,干擾線段,對輸出的字符進行傾斜、扭曲等操作。
可以使用imagesetpixel繪制點來實現噪點干擾,但是只繪制一個點的作用不大,因此這里常常會使用循環進行隨機繪制。
for(
PHP圖形操作之給圖片添加水印 給圖片添加水印的方法一般有兩種,一種是在圖片上面加上一個字符串,另一種是在圖片上加上一個logo或者其他的圖片。
因為這里處理的是已經存在的圖片,所以可以直接從已存在的圖片建立畫布,通過imagecreatefromjpeg可以直接從圖片文件創建圖像。
imagejpeg(
PHP異常處理之拋出一個異常 從PHP5開始,PHP支持異常處理,異常處理是面向對象一個重要特性,PHP代碼中的異常通過throw拋出,異常拋出之后,后面的代碼將不會再被執行。
既然拋出異常會中斷程序執行,那么為什么還需要使用異常處理?
異常拋出被用于在遇到未知錯誤,或者不符合預先設定的條件時,通知客戶程序,以便進行其他相關處理,不至于使程序直接報錯中斷。
當代碼中使用了try catch的時候,拋出的異常會在catch中捕獲,否則會直接中斷。
1、基本語法 try{ //可能出現錯誤或異常的代碼 //catch表示捕獲,Exception是php已定義好的異常類 } catch(Exception $e){ //對異常處理,方法: //1、自己處理 //2、不處理,將其再次拋出 } 2、處理處理程序應當包括: Try - 使用異常的函數應該位于 “try” 代碼塊內。如果沒有觸發異常,則代碼將照常繼續執行。但是如果異常被觸發,會拋出一個異常。 Throw - 這里規定如何觸發異常。注意:每一個 “throw” 必須對應至少一個 “catch”,當然可以對應多個”catch” Catch - “catch” 代碼塊會捕獲異常,并創建一個包含異常信息的對象。
//創建可拋出一個異常的函數 function checkNum(number){ if(number>1){ throw new Exception(“異常提示-數字必須小于等于1”); } return true; }
//在 “try” 代碼塊中觸發異常 try{ checkNum(2); //如果異常被拋出,那么下面一行代碼將不會被輸出 echo ‘如果能看到這個提示,說明你的數字小于等于1’; }catch(Exception e){ //捕獲異常 echo ‘捕獲異常: ’ .e->getMessage(); } 上面代碼將獲得類似這樣一個錯誤:
捕獲異常:: 異常提示-數字必須小于等于1
例子解釋:
上面的代碼拋出了一個異常,并捕獲了它:
創建 checkNum() 函數。它檢測數字是否大于 1。如果是,則拋出一個異常。 在 “try” 代碼塊中調用 checkNum() 函數。 checkNum() 函數中的異常被拋出 “catch” 代碼塊接收到該異常,并創建一個包含異常信息的對象 (
PHP異常處理之異常處理類 PHP具有很多異常處理類,其中Exception是所有異常處理的基類。
Exception具有幾個基本屬性與方法,其中包括了:
message 異常消息內容 code 異常代碼 file 拋出異常的文件名 line 拋出異常在該文件的行數
其中常用的方法有:
getTrace 獲取異常追蹤信息 getTraceAsString 獲取異常追蹤信息的字符串 getMessage 獲取出錯信息
如果必要的話,可以通過繼承Exception類來建立自定義的異常處理類。
//自定義的異常類,繼承了PHP的異?;怑xception class MyException extends Exception { function getInfo() { return ‘自定義錯誤信息’; } }
try { //使用異常的函數應該位于 “try” 代碼塊內。如果沒有觸發異常,則代碼將照常繼續執行。但是如果異常被觸發,會拋出一個異常。 throw new MyException(‘error’);//這里規定如何觸發異常。注意:每一個 “throw” 必須對應至少一個 “catch”,當然可以對應多個”catch” } catch(Exception e) {//”catch” 代碼塊會捕獲異常,并創建一個包含異常信息的對象 echoe->getInfo();//獲取自定義的異常信息 echo $e->getMessage();//獲取繼承自基類的getMessage信息 }
PHP異常處理之捕獲異常信息 在了解了異常處理的基本原理之后,我們可以通過try catch來捕獲異常,我們將執行的代碼放在try代碼塊中,一旦其中的代碼拋出異常,就能在catch中捕獲。
這里我們只是通過案例來了解try catch的機制以及異常捕獲的方法,在實際應用中,不會輕易的拋出異常,只有在極端情況或者非常重要的情況下,才會拋出異常,拋出異常,可以保障程序的正確性與安全,避免導致不可預知的bug。
一般的異常處理流程代碼為:
try { throw new Exception('wrong');} catch(Exception $ex) { echo 'Error:'.$ex->getMessage().'<br>'; echo $ex->getTraceAsString().'<br>';}echo '異常處理后,繼續執行其他代碼';PHP異常處理之獲取錯誤發生的所在行 在異常被捕獲之后,我們可以通過異常處理對象獲取其中的異常信息,前面我們已經了解捕獲方式,以及獲取基本的錯誤信息。
在實際應用中,我們通常會獲取足夠多的異常信息,然后寫入到錯誤日志中。
通過我們需要將報錯的文件名、行號、錯誤信息、異常追蹤信息等記錄到日志中,以便調試與修復問題。
<?phptry { throw new Exception('wrong');} catch(Exception $ex) { $msg = 'Error:'.$ex->getMessage()."/n"; $msg.= $ex->getTraceAsString()."/n"; $msg.= '異常行號:'.$ex->getLine()."/n"; $msg.= '所在文件:'.$ex->getFile()."/n"; //將異常信息記錄到日志中 file_put_contents('error.log', $msg);}PHP通過安裝相應的擴展來實現數據庫操作,現代應用程序的設計離不開數據庫的應用,當前主流的數據庫有MsSQL,MySQL,Sybase,Db2,Oracle,PostgreSQL,access等,這些數據庫PHP都能夠安裝擴展來支持,一般情況下常說的LAMP架構指的是:linux、Apache、Mysql、PHP,因此Mysql數據庫在PHP中的應用非常廣泛,我們會在本章中簡單的了解Mysql的操作方法。
<?phpif (function_exists('mysql_connect')) { echo 'Mysql擴展已經安裝';}PHP數據庫擴展 PHP中一個數據庫可能有一個或者多個擴展,其中既有官方的,也有第三方提供的。像Mysql常用的擴展有原生的mysql庫,也可以使用增強版的mysqli擴展,還可以使用PDO進行連接與操作。
不同的擴展提供基本相近的操作方法,不同的是可能具備一些新特性,以及操作性能可能會有所不同。
mysql擴展進行數據庫連接的方法:
$link = mysql_connect('mysql_host', 'mysql_user', 'mysql_passWord');mysqli擴展:
$link = mysqli_connect('mysql_host', 'mysql_user', 'mysql_password');PDO擴展
$dsn = 'mysql:dbname=testdb;host=127.0.0.1';$user = 'dbuser';$password = 'dbpass';$dbh = new PDO($dsn, $user, $password);PHP數據庫操作之連接MySQL數據庫 PHP要對數據庫進行操作,首先要做的是與數據庫建立連接,通常我們使用mysql_connect函數進行數據庫連接,該函數需要指定數據庫的地址,用戶名及密碼。
$host = 'localhost';$user = 'code1';$pass = '';$link = mysql_connect($host, $user, $pass);PHP連接數據庫的方式類似于直接在命令行下通過進行連接,類似:mysql -hlocalhost -ucode1 -p,當連接成功以后,我們需要選擇一個操作的數據庫,通過mysql_select_db函數來選擇數據庫。
mysql_select_db('code1');通常我們會先設置一下當前連接使用的字符編碼,一般的我們會使用utf8編碼。
mysql_query("set names 'utf8'");通過上面的步驟,我們就與數據庫建立了連接,可以進行數據操作了。
PHP數據庫操作之執行MySQL查詢 在數據庫建立連接以后就可以進行查詢,采用mysql_query加sql語句的形式向數據庫發送查詢指令。
$res = mysql_query('select * from user limit 1');對于查詢類的語句會返回一個資源句柄(resource),可以通過該資源獲取查詢結果集中的數據。
$row = mysql_fetch_array($res);var_dump($row); 默認的,PHP使用最近的數據庫連接執行查詢,但如果存在多個連接的情況,則可以通過參數指令從那個連接中進行查詢。
$link1 = mysql_connect('127.0.0.1', 'code1', '');$link2 = mysql_connect('127.0.0.1', 'code1', '', true); //開啟一個新的連接$res = mysql_query('select * from user limit 1', $link1); //從第一個連接中查詢數據<?php//連接數據庫mysql_connect('127.0.0.1', 'code1', '');mysql_select_db('code1');mysql_query("set names 'utf8'");//在這里進行數據查詢$res = mysql_query('select * from user');$row = mysql_fetch_array($res);var_dump($row);PHP數據庫操作之插入新數據到MySQL中 當我們了解了如何使用mysql_query進行數據查詢以后,那么類似的,插入數據其實也是通過執行一個sql語句來實現,例如:
$uid = mysql_insert_id(); 這個id的作用非常大,通常可以用來判斷是否插入成功,或者作為關聯ID進行其他的數據操作。
PHP數據庫操作之取得數據查詢結果 通過前面的章節,我們發現PHP操作數據庫跟MySql客戶端上操作極為相似,先進行連接,然后執行sql語句,再然后獲取我們想要的結果集。
PHP有多個函數可以獲取數據集中的一行數據,最常用的是mysql_fetch_array,可以通過設定參數來更改行數據的下標,默認的會包含數字索引的下標以及字段名的關聯索引下標。
PHP數據庫操作之查詢分頁數據 上一節中,我們了解到通過循環可以獲取一個查詢的所有數據,在實際應用中,我們并不希望一次性獲取數據表中的所有數據,那樣性能會非常的低,因此會使用翻頁功能,每頁僅顯示10條或者20條數據。
通過mysql的limit可以很容易的實現分頁,limit m,n表示從m行后取n行數據,在PHP中我們需要構造m與n來實現獲取某一頁的所有數據。
假定當前頁為
在上面的例子中,我們使用了
PHP數據庫操作之更新與刪除數據 數據的更新與刪除相對比較簡單,只需要構建好相應的sql語句,然后調用mysql_query執行就能完成相應的更新與刪除操作。
$sql = "update user set name = '曹操' where id=2 limit 1";if (mysql_query($sql)) { echo '更新成功';}同樣的刪除可以使用類似以下的代碼:
$sql = "delete from user where id=2 limit 1";if (mysql_query($sql)) { echo '刪除成功';}對于刪除與更新操作,可以通過mysql_affected_rows函數來獲取更新過的數據行數,如果數據沒有變化,則結果為0。
$sql = "update user set name = '曹操' where id=2 limit 1";if (mysql_query($sql)) { echo mysql_affected_rows();}PHP數據庫操作之關閉MySQL連接 當數據庫操作完成以后,可以使用mysql_close關閉數據庫連接,默認的,當PHP執行完畢以后,會自動的關閉數據庫連接。
mysql_close(); 雖然PHP會自動關閉數據庫連接,一般情況下已經滿足需求,但是在對性能要求比較高的情況下,可以在進行完數據庫操作之后盡快關閉數據庫連接,以節省資源,提高性能。
在存在多個數據庫連接的情況下,可以設定連接資源參數來關閉指定的數據庫連接。
新聞熱點
疑難解答
圖片精選