PHP學習記錄03

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 表單的一些注意項列舉如下:

  • 標籤的 enctype 屬性規定了在提交表單時要使用哪種內容類型。在表單需要二進制數據時,比如文件內容,請使用 "multipart/form-data"。
  • 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。通過 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 天)。

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 數據

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章