php高級教程03
date() date函數
PHP date() 函數可把時間戳格式化爲可讀性更好的日期和時間。
語法
string date ( string $format [, int $timestamp ] )
參數 | 描述 |
---|---|
format | 必需。規定時間戳的格式。 |
timestamp | 可選。規定時間戳。默認是當前的日期和時間。 |
date() 函數的第一個必需參數 format 規定了如何格式化日期/時間。
這裏列出了一些可用的字符:
- d - 代表月中的天 (01 - 31)
- m - 代表月 (01 - 12)
- Y - 代表年 (四位數)
- H - 代表小時 (24 小時制,帶前導零(00 到 23)
- h - 代表小時 (12 小時制,帶前導零(01 到 12)
- i - 代表分,帶前導零(00 到 59)
- s - 代表秒,帶前導零(00 到 59)
<?php
echo date("Y/m/d");
echo "<br>";
echo date("Y.m.d");
echo "<br>";
echo date("Y-m-d-h-i-s");
echo "<br>";
echo date("Y-m-d H:i:s");
echo "<br>";
echo date("Y 年 m 月 d 日 H 點 i 分 s秒");
?>
PHP 包含文件
PHP include 和 require 語句
在 PHP 中,您可以在服務器執行 PHP 文件之前在該文件中插入一個文件的內容。
include 和 require 語句用於在執行流中插入寫在其他文件中的有用的代碼。
include 和 require 除了處理錯誤的方式不同之外,在其他方面都是相同的:
- require 生成一個致命錯誤(E_COMPILE_ERROR),在錯誤發生後腳本會停止執行。
- include 生成一個警告(E_WARNING),在錯誤發生後腳本會繼續執行。
因此,如果您希望繼續執行,並向用戶輸出結果,即使包含文件已丟失,那麼請使用 include。否則,在框架、CMS 或者複雜的 PHP 應用程序編程中,請始終使用 require 向執行流引用關鍵文件。這有助於提高應用程序的安全性和完整性,在某個關鍵文件意外丟失的情況下。
包含文件省去了大量的工作。這意味着您可以爲所有網頁創建標準頁頭、頁腳或者菜單文件。然後,在頁頭需要更新時,您只需更新這個頁頭包含文件即可。
語法
include 'filename';
或者
require 'filename';
基礎實例
假設您有一個標準的頁頭文件,名爲 "header.php"。如需在頁面中引用這個頁頭文件,請使用 include/require:
<?php include 'php6.php'; ?>#在同一路徑
<h1>歡迎來到我的主頁!</h1>
<p>一些文本。</p>
<?php include '123/php6.php'; ?>#不同路徑
<h1>歡迎來到我的主頁!</h1>
<p>一些文本。</p>
基礎實例
假設我們有一個定義變量的包含文件("vars.php")
<?php
$color='red';
$car='BMW';
?>
使用
<h1>歡迎來到我的主頁!</h1>
<?php
include 'vars.php';
echo "I have a $color $car"; // I have a red BMW
?>
include 和 require 的區別
-
require 一般放在 PHP 文件的最前面,程序在執行前就會先導入要引用的文件;
-
include 一般放在程序的流程控制中,當程序執行時碰到纔會引用,簡化程序的執行流程。
-
require 引入的文件有錯誤時,執行會中斷,並返回一個致命錯誤;
-
include 引入的文件有錯誤時,會繼續執行,並返回一個警告。
文件處理
fopen() 函數用於在 PHP 中打開文件。
模式 | 描述 |
---|---|
r | 只讀。在文件的開頭開始。 |
r+ | 讀/寫。在文件的開頭開始。 |
w | 只寫。打開並清空文件的內容;如果文件不存在,則創建新文件。 |
w+ | 讀/寫。打開並清空文件的內容;如果文件不存在,則創建新文件。 |
a | 追加。打開並向文件末尾進行寫操作,如果文件不存在,則創建新文件。 |
a+ | 讀/追加。通過向文件末尾寫內容,來保持文件內容。 |
x | 只寫。創建新文件。如果文件已存在,則返回 FALSE 和一個錯誤。 |
x+ | 讀/寫。創建新文件。如果文件已存在,則返回 FALSE 和一個錯誤。 |
打開文件
fopen() 函數用於在 PHP 中打開文件。
此函數的第一個參數含有要打開的文件的名稱,第二個參數規定了使用哪種模式來打開文件:
<?php
$file=fopen("123.txt","r");
?>
如果 fopen() 函數不能打開指定的文件,下面的實例會生成一段消息:
<?php
$file=fopen("123.txt","r") or exit("無法打開文件!");
?>
#用相對路徑打不開子目錄中的文件時,可用絕對路徑打開,如下:
$file=fopen("D:\\phpstudy_pro\\unins000.dat","r") or exit("無法打開文件!");
#如果打開一個文件,文件名爲中文,如果系統編程和當前文檔編碼不一致,會導致文件找不到無法打開,解決方法是用 iconv 函數編碼轉換成一致,如下:
$fpath=iconv('UTF-8','GB2312',"阿三.txt");
$file=fopen($fpath,"r") or exit("無法打開文件!");
關閉文件
fclose() 函數用於關閉打開的文件:
<?php
$file = fopen("test.txt","r");
//執行一些代碼
fclose($file);
?>
檢測文件末尾(EOF)
feof() 函數檢測是否已到達文件末尾(EOF)。
在循環遍歷未知長度的數據時,feof() 函數很有用。
註釋:在 w 、a 和 x 模式下,您無法讀取打開的文件!
if (feof($file)) echo "文件結尾";
逐行讀取文件
fgets() 函數用於從文件中逐行讀取文件。
註釋:在調用該函數之後,文件指針會移動到下一行。
實例
下面的實例逐行讀取文件,直到文件末尾爲止:
<?php
$file=fopen("123.txt","r") or exit("無法打開文件!");
while(!feof($file))
{
echo fgets($file). "<br>";
}
if (feof($file))
{echo "文件結尾";}
fclose($file);
?>
逐字符讀取文件
fgetc() 函數用於從文件中逐字符地讀取文件。
註釋:在調用該函數之後,文件指針會移動到下一個字符。
實例
下面的實例逐字符地讀取文件,直到文件末尾爲止:
<?php
$file=fopen("123.txt","r") or exit("無法打開文件!");
while (!feof($file))
{
echo fgetc($file);
#echo "<br>";
}
if (feof($file))
{echo "文件結尾";}
fclose($file);
?>
PHP 文件上傳
$_GET
$_POST
$_FILES
通過 PHP,可以把文件上傳到服務器。
本章節實例在 test 項目下完成,目錄結構爲:
test
|-----upload # 文件上傳的目錄
|-----form.html # 表單文件
|-----upload_file.php # php 上傳代碼
創建一個文件上傳表單
允許用戶從表單上傳文件是非常有用的。
請看下面這個供上傳文件的 HTML 表單:
<form>
文件上傳:<input type="file" name="file" id="file"><br><br>
提交:<input type="submit" name="submit" value="點擊上傳">
</form>
將以上代碼保存到 form.html 文件中。
<form action="" method="post" enctype="multipart/form-data">
文件上傳:<input type="file" name="file" id="file"><br><br>
提交:<input type="submit" name="submit" value="點擊上傳">
有關上面的 HTML 表單的一些注意項列舉如下:
- input 標籤的 type="file" 屬性規定了應該把輸入作爲文件來處理。舉例來說,當在瀏覽器中預覽時,會看到輸入框旁邊有一個瀏覽按鈕。
註釋:允許用戶上傳文件是一個巨大的安全風險。請僅僅允許可信的用戶執行文件上傳操作。
創建上傳腳本
"upload_file.php" 文件含有供上傳文件的代碼:
通過使用 PHP 的全局數組 $_FILES,你可以從客戶計算機向遠程服務器上傳文件。
第一個參數是表單的 input name,第二個下標可以是 "name"、"type"、"size"、"tmp_name" 或 "error"。如下所示:
$_FILES 數組內容如下:
$_FILES["file"]["name"] - 上傳文件的名稱
$_FILES['myFile']['name'] 客戶端文件的原名稱。
$_FILES["file"]["type"] - 上傳文件的類型
$_FILES['myFile']['type'] 文件的 MIME 類型,需要瀏覽器提供該信息的支持,例如"image/gif"。
$_FILES["file"]["size"] - 上傳文件的大小,以字節計
$_FILES['myFile']['size'] 已上傳文件的大小,單位爲字節。
$_FILES["file"]["tmp_name"] - 存儲在服務器的文件的臨時副本的名稱
$_FILES['myFile']['tmp_name'] 文件被上傳後在服務端儲存的臨時文件名,一般是系統默認。可以在 php.ini 的 upload_tmp_dir 指定,但 用 putenv() 函數設置是不起作用的。
$_FILES["file"]["error"] - 由文件上傳導致的錯誤代碼
$_FILES['myFile']['error'] 和該文件上傳相關的錯誤代碼。['error'] 是在 PHP 4.2.0 版本中增加的。下面是它的說明:(它們在 PHP 4.3.0 之後變成了 PHP 常量。)
UPLOAD_ERR_OK - 值:0; 沒有錯誤發生,文件上傳成功。
UPLOAD_ERR_INI_SIZE - 值:1; 上傳的文件超過了 php.ini 中 upload_max_filesize 選項限制的值。
UPLOAD_ERR_FORM_SIZE - 值:2; 上傳文件的大小超過了 HTML 表單中 MAX_FILE_SIZE 選項指定的值。
UPLOAD_ERR_PARTIAL - 值:3; 文件只有部分被上傳。
UPLOAD_ERR_NO_FILE - 值:4; 沒有文件被上傳。
UPLOAD_ERR_NO_TMP_DIR -其值爲 6,找不到臨時文件夾。PHP 4.3.10 和 PHP 5.0.3 引進。
UPLOAD_ERR_CANT_WRITE - 其值爲 7,文件寫入失敗。PHP 5.1.0 引進。
這是一種非常簡單文件上傳方式。基於安全方面的考慮,您應當增加有關允許哪些用戶上傳文件的限制。
<?php
if ($_FILES["file"]["error"] > 0)
{
echo "錯誤:" . $_FILES["file"]["error"] . "<br>";
}
else
{
echo "上傳文件名: " . $_FILES["file"]["name"] . "<br>";
echo "文件類型: " . $_FILES["file"]["type"] . "<br>";
echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
echo "文件臨時存儲的位置: " . $_FILES["file"]["tmp_name"];
}
?>
注意:文件被上傳結束後,默認地被存儲在了臨時目錄中,這時您必須將它從臨時目錄中刪除或移動到其它地方,如果沒有,則會被刪除。也就是不管是否上傳成功,腳本執行完後臨時目錄裏的文件肯定會被刪除。所以在刪除之前要用PHP的 copy() 函數將它複製到其它位置,此時,纔算完成了上傳文件過程。
上傳限制
在這個腳本中,我們增加了對文件上傳的限制。用戶只能上傳 .gif、.jpeg、.jpg、.png 文件,文件大小必須小於 200 kB:
<?php
// 允許上傳的圖片後綴
$allowedExts = array("gif", "jpeg", "jpg", "png");
$temp = explode(".", $_FILES["file"]["name"]);
$extension = end($temp); // 獲取文件後綴名
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/jpg")
|| ($_FILES["file"]["type"] == "image/pjpeg")
|| ($_FILES["file"]["type"] == "image/x-png")
|| ($_FILES["file"]["type"] == "image/png"))
&& ($_FILES["file"]["size"] < 204800) // 小於 200 kb
&& in_array($extension, $allowedExts))
{
if ($_FILES["file"]["error"] > 0)
{
echo "錯誤:: " . $_FILES["file"]["error"] . "<br>";
}
else
{
echo "上傳文件名: " . $_FILES["file"]["name"] . "<br>";
echo "文件類型: " . $_FILES["file"]["type"] . "<br>";
echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
echo "文件臨時存儲的位置: " . $_FILES["file"]["tmp_name"];
}
}
else
{
echo "非法的文件格式";
}
?>
保存被上傳的文件
上面的實例在服務器的 PHP 臨時文件夾中創建了一個被上傳文件的臨時副本。
這個臨時的副本文件會在腳本結束時消失。要保存被上傳的文件,我們需要把它拷貝到另外的位置:
<?php
// 允許上傳的圖片後綴
$allowedExts = array("gif", "jpeg", "jpg", "png");
$temp = explode(".", $_FILES["file"]["name"]);
echo $_FILES["file"]["size"];
$extension = end($temp); // 獲取文件後綴名
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/jpg")
|| ($_FILES["file"]["type"] == "image/pjpeg")
|| ($_FILES["file"]["type"] == "image/x-png")
|| ($_FILES["file"]["type"] == "image/png"))
&& ($_FILES["file"]["size"] < 204800) // 小於 200 kb
&& in_array($extension, $allowedExts))
{
if ($_FILES["file"]["error"] > 0)
{
echo "錯誤:: " . $_FILES["file"]["error"] . "<br>";
}
else
{
echo "上傳文件名: " . $_FILES["file"]["name"] . "<br>";
echo "文件類型: " . $_FILES["file"]["type"] . "<br>";
echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
echo "文件臨時存儲的位置: " . $_FILES["file"]["tmp_name"] . "<br>";
// 判斷當前目錄下的 upload 目錄是否存在該文件
// 如果沒有 upload 目錄,你需要創建它,upload 目錄權限爲 777
if (file_exists("upload/" . $_FILES["file"]["name"]))
{
echo $_FILES["file"]["name"] . " 文件已經存在。 ";
}
else
{
// 如果 upload 目錄不存在該文件則將文件上傳到 upload 目錄下(重要)
move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]);
echo "文件存儲在: " . "upload/" . $_FILES["file"]["name"];
}
}
}
else
{
echo "非法的文件格式";
}
?>
上面的腳本檢測了文件是否已存在,如果不存在,則把文件拷貝到名爲 "upload" 的目錄下。
Cookie 是什麼?
cookie 常用於識別用戶。cookie 是一種服務器留在用戶計算機上的小文件。每當同一臺計算機通過瀏覽器請求頁面時,這臺計算機將會發送 cookie。通過 PHP,您能夠創建並取回 cookie 的值。
如何創建 Cookie?
setcookie() 函數用於設置 cookie。
註釋:setcookie() 函數必須位於 標籤之前。
實例 1
在下面的例子中,我們將創建名爲 "user" 的 cookie,併爲它賦值 "runoob"。我們也規定了此 cookie 在一小時後過期:
<?php
setcookie("user", "runoob", time()+3600);
?>
<html>
.....
註釋:在發送 cookie 時,cookie 的值會自動進行 URL 編碼,在取回時進行自動解碼。(爲防止 URL 編碼,請使用 setrawcookie() 取而代之。)
實例 2
您還可以通過另一種方式設置 cookie 的過期時間。這也許比使用秒錶示的方式簡單。
<?php
$expire=time()+60*60*24*30;
setcookie("user", "runoob", $expire);
?>
<html>
.....
在上面的實例中,過期時間被設置爲一個月(60 秒 * 60 分 * 24 小時 * 30 天)。
如何取回 Cookie 的值?
PHP 的 $_COOKIE 變量用於取回 cookie 的值。
在下面的實例中,我們取回了名爲 "user" 的 cookie 的值,並把它顯示在了頁面上:
<?php
// 輸出 cookie 值
echo $_COOKIE["user"];
// 查看所有 cookie
print_r($_COOKIE);
?>
在下面的實例中,我們使用 isset() 函數來確認是否已設置了 cookie:
<html>
<head>
<meta charset="utf-8">
<title>菜鳥教程(runoob.com)</title>
</head>
<body>
<?php
if (isset($_COOKIE["user"]))
echo "歡迎 " . $_COOKIE["user"] . "!<br>";
else
echo "普通訪客!<br>";
?>
</body>
</html>
如何刪除 Cookie?
當刪除 cookie 時,您應當使過期日期變更爲過去的時間點。
刪除的實例:
<?php
// 設置 cookie 過期時間爲過去 1 小時
setcookie("user", "", time()-3600);
?>
PHP Session
PHP session 變量用於存儲關於用戶會話(session)的信息,或者更改用戶會話(session)的設置。Session 變量存儲單一用戶的信息,並且對於應用程序中的所有頁面都是可用的。
PHP Session 變量
您在計算機上操作某個應用程序時,您打開它,做些更改,然後關閉它。這很像一次對話(Session)。計算機知道您是誰。它清楚您在何時打開和關閉應用程序。然而,在因特網上問題出現了:由於 HTTP 地址無法保持狀態,Web 服務器並不知道您是誰以及您做了什麼。
PHP session 解決了這個問題,它通過在服務器上存儲用戶信息以便隨後使用(比如用戶名稱、購買商品等)。然而,會話信息是臨時的,在用戶離開網站後將被刪除。如果您需要永久存儲信息,可以把數據存儲在數據庫中。
Session 的工作機制是:爲每個訪客創建一個唯一的 id (UID),並基於這個 UID 來存儲變量。UID 存儲在 cookie 中,或者通過 URL 進行傳導。
開始 PHP Session
在您把用戶信息存儲到 PHP session 中之前,首先必須啓動會話。
註釋:session_start() 函數必須位於 標籤之前:
實例
上面的代碼會向服務器註冊用戶的會話,以便您可以開始保存用戶信息,同時會爲用戶會話分配一個 UID。
存儲 Session 變量
存儲和取回 session 變量的正確方法是使用 PHP $_SESSION 變量:
實例
<?php
session_start();
// 存儲 session 數據
$_SESSION['views']=1;
?>
<html>
<head>
<meta charset="utf-8">
<title>菜鳥教程(runoob.com)</title>
</head>
<body>
<?php
// 檢索 session 數據
echo "瀏覽量:". $_SESSION['views'];
?>
</body>
</html>
輸出:
瀏覽量:1
在下面的實例中,我們創建了一個簡單的 page-view 計數器。isset() 函數檢測是否已設置 "views" 變量。如果已設置 "views" 變量,我們累加計數器。如果 "views" 不存在,則創建 "views" 變量,並把它設置爲 1:
實例
<?php
session_start();
if(isset($_SESSION['views']))
{
$_SESSION['views']=$_SESSION['views']+1;
}
else
{
$_SESSION['views']=1;
}
echo "瀏覽量:". $_SESSION['views'];
?>
銷燬 Session
如果您希望刪除某些 session 數據,可以使用 unset() 或 session_destroy() 函數。
unset() 函數用於釋放指定的 session 變量:
實例
<?php
session_start();
if(isset($_SESSION['views']))
{
unset($_SESSION['views']);
}
?>
您也可以通過調用 session_destroy() 函數徹底銷燬 session:
實例
<?php
session_destroy();
?>
註釋:session_destroy() 將重置 session,您將失去所有已存儲的 session 數據