PHP開發基礎教學之PHP對檔...LOGIN

PHP開發基礎教學之PHP對檔案的操作

一、檔案系統

1.我們會點選滑鼠右鍵刪除檔案、會control+c(或右鍵)複製、貼上文件,會新建一些文件,檢測這個文件是不是只讀文件。

2.在電腦裡面進行的這些操作,在程式碼裡面如果能操作就好了。

3.因為,如果有了這些操作。我們能做很多事了:

  •  可不可以寫入修改設定檔?

  • 是不是可以做PHP安裝的時候偵測檔案的權限

  • 是不是可以做產生Html檔案等等很多不同的動作

  • ..... 其他太多太多的地方用到了檔案操作。

4.學習文件處理本質上面就是學習文件處理的函數。再結合之前寫的程式碼,完善自己的業務處理能力。


二、讀取檔案

#1.readfile讀取檔案

那要如何讀取一個檔案呢?我們先學一個函數。

int readfile ( string $檔名)

功能:傳入一個檔案路徑,輸出一個檔案。

下面的這一段程式碼中,只要傳入檔案名稱或指定的檔案路徑就把檔案讀取出來了。

<?php
    //linux类的读了方式
    readfile("/home/paul/test.txt");
    //windows类的读取方式
    readfile("c:\boot.ini");
?>

注意:上面的程式碼中windows的斜線是\斜線,可能會轉義掉一些字元。因此,我們寫的時候寫上兩條斜線。

2.file_get_contents開啟檔案

上面的是單純打檔案就直接輸出了,有沒有開啟檔案後,能夠賦值給一個變數的操作方式呢。

PHP當然會提供這種方式。這個方式就是PHP打開文件並返回內容的方式之一,我們來看看函數:

string file_get_contents ( string filename)

功能:傳入一個檔案或檔案路徑,開啟這個檔案返回檔案的內容。文件的內容是一個字串。

<?php
    $filename = 'NoAlike.txt';
    $filestring = file_get_contents($filename);
    echo $filestring;
?>

上面的程式碼,就開啟了一個文件,並且將文件當中的內容進行了輸出。

我們來針對之前的知識把程式碼進行一下擴充。用一用之前的知識點。

<?php
    //假设我们有一个多行的文件叫NoAlike.txt,没有的话你可以新建一个这个文件
     $filename = 'NoAlike.txt';
    //打开这个文件,将文件内容赋值给$filestring
    $filestring = file_get_contents($filename);
    //因为每一行有一个回车即\n,我用\n来把这个字符串切割成数组
    $filearray = explode("\n", $filestring);
    //把切割成的数组,下标赋值给$key,值赋值给$val,每次循环将$key加1。
    while (list($key, $val) = each($filearray)) {
        ++$key;
        $val = trim($val);
        //用的单引号,单引号不解释变量进行了拼接而已
        print 'Line' . $key .':'.  $val.'<br />';
    }
?>

上面,我們就把之前所學的知識進行了組合。

3.fopen、fread、fclose操作讀取檔案

#上面file_get_contents開啟檔案的方式簡單、粗獷。下面的

  •  resource fopen ( string $檔名, string 模式)

  • string fread ( resource $操作資源, int 讀取長度)

  •  bool fclose ( resource $操作資源)

#透過上面的函數我們來講解資源類型的通常操作方式:

  •  開啟資源

  • 使用相關函數進行動作

  • # 關閉資源

    #

fopen函數 fopen函數的功能是開啟文件,參數主要有兩個:

l 文件開啟的路徑

l 打開文件的模式

返回類型是一個資源類型,我們第一次遇到了之前基礎類型的時候所講到的資源類型。
資源類型需要其他的函數來操作這個資源。所有的資源有開啟就要有關閉。

fread函數 函數的功能的功能是讀取開啟的檔案資源。讀取指定長度的檔案資源,讀取一部分向後移動一部分。至到文件結尾。

fclose函數 fclose函數的功能是關閉資源。資源有開啟就有關閉。

了解完函數,後兩個函數比較簡單。而fopen函數的模式到底是什麼,fopen的模式有下面幾個,我們來講一下fopen的模式:


38.png


##接下來,我們只來學習r模式,下節課我們在將寫入的時候再來講講其他幾個模式。


三、我們先會讀取檔案了,才能很好的掌握寫入檔案。

1.開啟檔案

<?php
    //你可以创建一个NoAlike.txt,以只读模式打开
    $fp = fopen('NoAlike.txt', "r");
 
 
    //var_dump()操作一下$fp看看效果,输出的是不是只有类型提示的是resource
    var_dump($fp);
?>

#2.讀取檔案

<?php
    $fp = fopen('NoAlike.txt', "r");
 
    //打开一个文件类型后,读取长度
    $contents = fread($fp, 1024);
?>

3.關閉檔案

<?php
    $fp = fopen($filename, 'r');
    $contents = fread($fp, 1024);
    fclose($fp);
    echo $contents;
?>

其他注意事項:

39.png


使用範例:


<?php
$fp = fopen($filename, 'ab');
$contents = fwrite($fp, '可爱的很\n哟');
fclose($fp);
echo $contents;
?>

說明:實驗無法讓肉眼看到這個實驗效果。大家記住有這個特色即可。

Windows 下提供了一個文字轉換標記('t')可以透明地將 \n 轉換為 \r\n。

與此對應也可以使用 'b' 來強制使用二進位模式,這樣就不會轉換資料。要使用這些標記,要么用 'b' 或用 't' 作為 mode 參數的最後一個字元。


四、建立並修改檔案內容

#1.file_put_contents寫入檔案

我們先來學習第一種寫入檔案的方式:

int file_put_contents ( string $檔案路徑, string $寫入資料])

功能:向指定的檔案當中寫入字串,如果檔案不存在則建立檔案。回傳的是寫入的位元組長度

<?php
    $data = "我是一个兵,来自老百姓";
 
    $numbytes = file_put_contents('binggege.txt', $data);
 
    if($numbytes){
 
        echo '写入成功,我们读取看看结果试试:';
 
        echo file_get_contents('binggege.txt');
 
    }else{
        echo '写入失败或者没有权限,注意检查';
    }
?>

我們發現寫入檔案也挺簡單的。按照這個函數的格式,指定文件,寫入字串資料就可以了。

2.fwrite配合fopen進行寫入運算

int fwrite ( resource $檔案資源變數, string $寫入的字串[, int 長度])

註:fwrite的別名函數是fputs

我們上課試了r模式,只道是讀取的時候使用,接下來我們用fwrite加上fopen中的w,寫入模式來進行檔案寫入。

我們來看看特點:

寫入方式打開,將檔案指標指向檔案頭並將檔案大小截為零。如果文件不存在則嘗試建立。

注意:在下面的實驗中,你可以試試看新建個test.txt檔案向裡面寫入內容。然後,可以試試看把test.txt刪除。看看有什麼提示。

<?php
    $filename = 'test.txt';
    $fp= fopen($filename, "w");
    $len = fwrite($fp, '我是一只来自南方的狼,一直在寻找心中的花姑娘');
    fclose($fp);
    print $len .'字节被写入了\n";
?>

總結:
1.無論有沒有新建都會開啟檔案重新寫入
2.原有的檔案內容會被覆寫
3.文件不存在會創建

那我們來比較以下幾個模式的差異:

40.png

我們來透過實驗證明:

<?php
    $filename = 'test.txt';
    $fp= fopen($filename, "r+");
    $len = fwrite($fp, '我是一只来自南方的狼,一直在寻找心中的花姑娘');
    fclose($fp);
    print $len .'字节被写入了\n';
?>

實驗時可以把r後面的+號去掉。

我們透過實驗,確實發現使用r模式,在文件存的時候可以進行寫入數據,只用r的話,寫入是不成功的。

3.a模式和w模式的不同

同樣是下面的這段程式碼,我們改為a模式。

<?php
    $filename = 'test.txt';
    $fp= fopen($filename, "a");
    $len = fwrite($fp,'读大学迷茫了,PHP学院PHP给你希望');
    echo  $len .'字节被写入了\n';
?>

打開網頁執行這段程式碼,你會發現:每刷新一次,文件中就會多一段
讀大學迷茫了,PHP學院PHP給你希望。

總結:

41.png

4.x模式和w模式的不同

這段程式碼我們再實驗一次,改為x模式:

<?php
    $filename = 'test.txt';
    $fp= fopen($filename, "x");
    $len = fwrite($fp,'读大学迷茫了,PHP学院PHP给你希望');
    echo  $len .'字节被写入了\n';
?>

我們會發現:

#檔案存在的時候會報錯

如果把$filename 改成其他的檔名,就可以了。但是,再次刷新的時候又報錯了

x+ 是增強的x模式。讀取時也可以使用。




#五、建立暫存檔案

我們之前建立的文件都是永久文件。

而建立臨時檔案在我們平常的專案開發中也非常有用。建立臨時檔案的幾個好處:

1.文完後即刪除

2.不需要去維護這個檔案的刪除狀態

例如:我需要把A的檔案內容轉存B裡面,把B的檔案內容轉存到C裡面。

就跟現實生活中一樣,我可以先用一個臨時的瓶子把B的水裝起來,然後把A的資料寫入B裡面。把臨時瓶子的水追加到C裡面。

我們來學習這個函數:

resource tmpfile ( )

功能:建立一個暫存文件,傳回資源類型。關閉檔案即被刪除。

<?php
    //创建了一个临时文件
    $handle = tmpfile();
 
    //向里面写入了数据
    $numbytes = fwrite($handle, '写入临时文件');
 
    //关闭临时文件,文件即被删除
    fclose($handle);
 
    echo  '向临时文件中写入了'.$numbytes . '个字节';
?>



#

六、移動、拷貝和刪除檔案

#1.重新命名

bool rename ($舊名,$新名);

這個函數回傳一個bool值,將舊的名字改為新的名字。

<?php
    //旧文件名
    $filename = 'test.txt';
 
    //新文件名
    $filename2 = $filename . '.old';
 
    //复制文件
    rename($filename, $filename2);
?>

我們打開目錄,我們可以看看效果,你會發現把指定的文件,複製了一份到了目標路徑。

2.複製檔案

複製文件,就相當於複製技術,將一個原來的東西再克隆成一個新的東西。兩個長得一模一樣。

bool copy(來源檔案,目標檔案)

#功能:將指定路徑的來源文件,複製一份到目標檔案的位置。

我們來透過實驗和程式碼來玩:

<?php
    //旧文件名
    $filename = 'copy.txt';
 
    //新文件名
    $filename2 = $filename . '_new';
 
    //修改名字。
    copy($filename, $filename2);
?>

總結:
你會透過上面的例子,發現多出來了一個檔案。

3.刪除檔案

刪除檔案就是將指定路徑的一個檔案刪除,不過這個刪除是直接刪除。使用的是windows電腦,你在回收站看不到這個檔案。

你只會發現,這個檔案消失了。

bool unlink(指定路徑的檔案)

<?php
    $filename = 'test.txt';
 
    if (unlink($filename)) {
        echo  "删除文件成功 $filename!\n";
    } else {
        echo "删除 $filename 失败!\n";
    }
?>

#七、偵測檔案屬性函數

##有些同學特別好奇,偵測檔案屬性用在什麼地方。檢測文件屬性能用到的地方太多了。

我們來舉例子:

1.我們在做軟體安裝的時候,大家會發現如果檔案存在了,就跳到了其他的地方。

2.如果在安裝的過程當中,某些檔案沒有寫入權限,就不讓進行安裝。

我們來舉一個國內非常有名的軟體,discuz的安裝流程截圖給大家看看:42.png

 

上面的例子,就是典型的檔案偵測的用法。

我們來學習下面的一批函數。然後,我們來透過一個例子進行學習。
bool file_exists ( $指定檔案名稱或檔案路徑)

功能:檔案是否存在。


bool is_readable ( $指定檔案名稱或檔案路徑)

功能:檔案是否可讀取


bool is_writeable ( $指定文件名或檔案路徑)

功能:檔案是否可寫入


bool is_executable ( $指定檔案名稱或檔案路徑)

功能:檔案是否可執行


#bool is_file ( $指定檔案名稱或檔案路徑)

功能:是否為檔案


bool is_dir ( $指定檔案名稱或檔案路徑)

功能:是否為目錄


void clearstatcache ( void )

功能:清楚檔案的狀態快取

###上面的功能一看就清楚了。那個實驗,我們就來寫這個最開始我們舉的這個例子。 ###

我們來講第一個例子,檔案鎖。如果已經安裝了,存在安裝鎖就提示已安裝,否則就繼續安裝。

我們假設安裝介面的網址是:install.php,安裝的鎖定檔案是install.lock。我們就可以偵測install.lock檔案是否存在。

<?php
if(file_exists('install.lock')){
    echo '已安装,请不要再次进行安装';
    exit;
}
?>

我們接下來做一個檔案安裝偵測的實驗來偵測檔案或目錄是否有寫入或讀取權限。如果沒有則不能進行安裝。

處理這件事的想法如下:

1.定義一批需要偵測權限的陣列

2.可以偵測是資料夾還是檔案

#3.做一個標置位變量,如果標置位變量一旦為false則不顯示下一步的安裝

<?php
 
//可以定义一批文件是否存在
$files = [
    'config.php',
    'img/',
    'uploads/',
];
 
//定义标志位变量
$flag = true;
foreach($files as  $v){
    echo $v;
 
    //判断是文件还是文件夹
 
    if(is_file($v)){
        echo '是一个文件    ';
    }else if(is_dir($v)){
        echo '是一个文件夹    ';
    }
 
    if(is_readable($v)){
        echo ' 可读';
    }else{
         echo '<font color="red">不可读</font>';
    }
 
    if(is_writeable($v)){
        echo '可写';
    }else{
        echo '<font color="red">不可写</font>';
    }
 
    echo '<br />';
}
 
if($flag){
    echo '<a href="step1">下一步</a>';
 
}else{
     echo '不能进行安装';
}
?>

透過上面的例子,我們就做到了。實現PHP某個軟體安裝過程當中的安裝檢測。

也就是我們上面思路的實作。


八、檔案常用函數與常數

#1.檔案運算的常數

下面這一個常數是最常用的。是檔案目錄的分割符的常數。

我們來看看格式:

43.png

windows 的路徑格式為d:\xxx\xxx 注意:windows支援d:/xxx/xxx
linux 的路徑格式為/home/xxx/xxx 注意:如果\home\xxx\xxx 在linux上是錯誤的
所以當你開啟轉義之類的話,轉義字元\ 用一起的話d:\ xxx\xxx 是一樣的。判斷時候有兩個 \ 有的話 再轉成一個\ 再把 \ 替換成 /當路徑分割,這樣在linux上或者windos上的路徑就能保持統一了。

我們會使用到一個常數:
DIRECTORY_SEPARATOR

我們來寫一個小的實例,定義目前檔案所在的路徑:

由於FILE是PHP的預定義常數,所以沒辦法改變,如果需要讓FILE也能自適應作業系統。
那麼就是不要用FILE,可以用自訂的常數,並且把FILE處理一下,如下:

<?php
$_current_file = str_replace(array('/', '\'), DIRECTORY_SEPARATOR, __FILE__);
define('__CUR_FILE__', $_current_file);
echo __CUR_FILE__;
?>

2.檔案指標運算子

rewind ( resource handle)

##功能:指標回到開始處

##fseek ( resource handle, int offset [, int from_where] )

功能:檔案指標向後移動指定字元
我們在先前的讀取當中我們發現fread讀取指定長度的資料。讀取指定長度的內容,下次再讀取的時候從原始位置開始再接著向後讀取。

 

44.png如上圖,我們可以想像:

1.檔案剛開啟的時候讀取到的是紅色的圖示

2 .檔案假色從A讀取到了C

3.我們在demo.txt檔案中寫入一批檔案:

    Abcdeefghijklk
  • # Opqrst
  • Uvwxyz
  •  12345678

我們可開始來實驗一次。

<?php
$fp = fopen('output.txt', 'r+');
//读取10个字符
echo fread($fp,10);
 
//指针设置回到开始处
rewind($handle);
//再读取10次看看输出的是什么
echo fread($fp,10);
 
//文件指针向后移动10个字符
echo fseek($fp,10);
 
//再看看文件中输出的是什么
echo fread($fp,10);
 
fclose($handle);
?>

上面的例子,你會發現fseek指定多長就移動多少個位元組。而rewind每次都是回到文件的起點。

那要如何移動到最末端呢?我們可以統計位元組數。在fseek的時候直接移到回後。

下面我們來講filesize統計位元組數。

3.filesize 偵測檔案的大小

<?php
$filename = 'demo.txt';
echo $filename . '文件大小为: ' . filesize($filename) . ' bytes';
?>

4.其它操作檔案的函數

其實還有一些其他操作檔案的函數,讀取檔案

45.png

我們透過一個實例來把上面幾個函數都用到。

我們在demo.txt檔案中寫入一批檔案:

#abcdeefghijklk
opqrst
uvwxyz
12345678

<?php
//以增加的r模式打开
$fp = fopen('demo.txt','r+');
//你分发现每次只读一个字符
echo  fgetc($fp);
 
//我要全部读取可以,读取一次将结果赋值一次给$string
while($string = fgetc($fp)){
    echo $string;
}
?>

fgets每次打開一行:

<?php
//以增加的r模式打开
$fp = fopen('demo.txt','r+');
//你分发现每次只读一个字符
echo  fgets($fp);
echo  fgets($fp);
echo  fgets($fp);
echo  fgets($fp);
?>

上面的程式碼,你會發現每次讀取一次都會開啟一行。讀取最後回傳的是false。

我們接下來看檔案截取函數:

<?php
//打开我们上面的demo.txt文件
$file = fopen("demo.txt", "a+");
//你可以数数20个字有多长,看看是不是达到效果了
echo ftruncate($file,20);
fclose($file);
?>

上例我們發現,截取多長就能顯示多長的內容。

5.檔案的時間函數

46.png

<?php
$filename = 'demo.txt';
if (file_exists($filename)) {
    echo "$filename文件的上次访问时间是: " . date("Y-m-d H:i:s", fileatime($filename));
    echo "$filename文件的创建时间是: " . date("Y-m-d H:i:s", filectime($filename));
     echo "$filename文件的修改时间是: " . date("Y-m-d H:i:s", filemtime($filename));
}
?>



##九、檔案鎖定機制

檔案鎖定機制一般在單一開啟檔案的時候根本看不到效果。這一塊的學習有一點抽象。

大家不要去思考怎麼實現的呀?

為什麼看不到效果呀?

答:因為電腦的操作太快了,基本上是毫秒的。所以這個實驗其實是看不到效果的。

這一章了解檔案鎖定的基本概念即可,熟悉檔案鎖定函數和鎖定機制。

文件鎖定的用途:

若一個人在寫入一個文件,另外一個人同時也打個了這個文件進行寫入文件。
這情況下,如果遇到一定的碰撞機率的話,不知道到底誰的操作為準。
因此,這個時候我們引入鎖定機制。

若用戶A在寫入或讀取這個檔案的時候,將檔案加上共享所。我可以讀,其他人也可以讀。

但是,我如果這與的時候。我使用獨佔鎖。這個文件歸我了,你們都別動,除非我將文件鎖進行釋放。

注意:不論加上了檔案鎖定後要注意釋放。

我們來看看這個函數:

bool flock ( resource $handle , int $operation)

功能:輕巧的諮詢文件鎖定

我們來看看鎖定類型:47.png

#我們接下來把demo.txt加上一個獨佔鎖,進行寫入操作。

<?php
$fp = fopen("demo.txt", "r+");
 // 进行排它型锁定
if (flock($fp, LOCK_EX)) {
    fwrite($fp, "文件这个时候被我独占了哟\n");
   // 释放锁定
    flock($fp, LOCK_UN);    
} else {
    echo "锁失败,可能有人在操作,这个时候不能将文件上锁";
}
fclose($fp);
?>
###說明:###

上例中我為了寫入文件,把文件加上了獨佔鎖。

如果我操作完成,寫入完成後,解除掉了獨佔鎖定。

如果是在讀取檔案的時候,大家可加依照同樣的處理思路加上共享鎖定。


第十、目錄處理函數

#之前我們處理的全都是文件,那目錄和資料夾怎麼處理呢?

我們就來學習目錄或稱為資料夾的處理相關函數。

處理資料夾的基本想法如下:

讀取某個路徑的時候判斷是否是資料夾

是資料夾的話,開啟指定資料夾,回傳文件目錄的資源變數

使用readdir讀取一次目錄中的文件,目錄指標向後偏移一次

使用readdir讀取到最後,沒有可讀的檔案回傳false

關閉檔案目錄

我們來學習一比常用函數:

48.png

#
<?php
//设置打开的目录是D盘
$dir = "d:/";
//判断是否是文件夹,是文件夹
if (is_dir($dir)) {
    if ($dh = opendir($dir)) {
       //读取一次向后移动一次文件夹指针
       echo readdir($dh).'<br />';
       echo readdir($dh).'<br />';
       echo readdir($dh).'<br />';
       echo readdir($dh).'<br />';
       //读取到最后返回false
       //关闭文件夹资源
        closedir($dh);
    }
}
?>

即然是讀取一次向後移動一次,我們是不是可以

<?php
//设置打开的目录是D盘
$dir = "d:/";
 
//判断是否是文件夹,是文件夹
if (is_dir($dir)) {
    if ($dh = opendir($dir)) {
       //读取到最后返回false,停止循环
       while (($file = readdir($dh)) !== false) {
            echo "文件名为: $file : 文件的类型是: " . filetype($dir . $file) . "<br />";
        }
        closedir($dh);
    }
}
?>

 


#十一、檔案權限設定

##檔案權限設定的函數在系統管理層級的軟體中很常用。例如:某個檔案不准許guest群組(來賓使用者)查看呀。

在企業管理中,某些使用者或某些使用者檔案只準讀取不准修改。這都是非常常用的功能。

附註:

本章為了解章節。如果沒有學過linux會有些吃力,可以跳過本章,了解有這個東西即可。

在實際生產環節中較少用處。

主要針對在linux下有過全面知識體系的同學可以重點學習。

windows下面有些功能無法實現。

49.png

上面的函數用法與linux的權限運算的用法一樣。

對於學過linux的同學來說學起來比較簡單。沒有學過的會有些吃力。

我只講一個例子,看看如何來修改權限:

chmod 主要是修改檔案的的權限

<?php
//修改linux  系统/var/wwwroot/某文件权限为755
chmod("/var/wwwroot/index.html", 755);  
chmod("/var/wwwroot/index.html", "u+rwx,go+rx");
chmod("/somedir/somefile", 0755);
?>




#1.情境重現

我們常常會遇到處理檔案路徑的情況。

例如:

檔案後綴需要取出來

路徑需要取出名字不取目錄

只需要取出路徑名中的目錄路徑

或把網址中的各部份解析取得獨立值

甚至是自己組成一個url出來
... ....

很多地方都需要用路徑處理類別的函數。

我們把常用的路徑處理函數為大家做了標註,大家對著這個路徑處理函數進行處理即可:

50.png

2.Pathinfo

array pathinfo ( string $路徑)
功能:傳入檔案路徑返回檔案的各個組成部分

我們用具體的範例來用一下:

<?php
$path_parts = pathinfo('d:/www/index.inc.php');
 
echo '文件目录名:'.$path_parts['dirname']."<br />";
echo '文件全名:'.$path_parts['basename']."<br />";
echo '文件扩展名:'.$path_parts['extension']."<br />";
echo '不包含扩展的文件名:'.$path_parts['filename']."<br />";
?>

結果如下:

檔案目錄名稱:d:/www
檔案全名:lib.inc.php
檔案副檔名:php
不包含擴充的檔名:lib.inc

3.Basename

#string basename ( string $路徑[, string $suffix ])
功能:傳入路徑回傳檔名

第一個參數傳入路徑。
第二個參數,指定我檔案名稱到了指定字元停止。

<?php 
echo "1: ".basename("d:/www/index.d", ".d").PHP_EOL;
echo "2: ".basename("d:/www/index.php").PHP_EOL;
echo "3: ".basename("d:/www/passwd").PHP_EOL; 
?>
4.Dirname
dirname(string $路径) 功能:返回文件路径的文件目录部份
<?php
dirname(__FILE__);
?>

結論:你可以執行看看是不是回傳了檔案的目錄部份。

5.parse_url

mixed parse_url ( string $路徑)
功能:將網址拆解成各部份

<?php
$url = 'http://username:password@hostname:9090/path?arg=value#anchor';
var_dump(parse_url($url));
?>

結果如下:

array(8) {
["scheme"]=> string(4) "http"
["host"]=> string(8 ) "hostname"
["port"]=> int(9090)
["user"]=> string(8) "username"
["pass"]=> string( 8) "password"
["path"]=> string(5) "/path"
["query"]=> string(9) "arg=value"
["fragment "]=> string(6) "anchor"
}

##6.http_build_query

string http_build_query ( mixed $需要處理的資料) 功能:產生url 中的query字串

<?php
//定义一个关联数组
$data = [
        'username'=>'liwenkai',
        'area'=>'hubei'
         ];
//生成query内容
echo http_build_query($data);
?>

結果如下:

username=liwenkai&area=hubei

http_build_url() 

#功能:產生一個url

 

註:PHP_EOL 常數
在windows平台相當於echo "\r\n";
在unix\linux平台相當於echo "\n";
在mac平台相當於echo "\r";




十三、文字留言本

我們講完了這麼多關於檔案處理的系統,可是我們連一個最基本的小東西都寫不出來。

從這一節開始,大家會發現大家能夠寫越來越多的東西了。

接下來我們來看看示範效果:

在下面一個介面中寫入留言內容的表單介面:


存在留言後的展示介面:

51.png

我們來看看檔案結構:

#index.php ---展示輸入方塊和留言內容write.php ---向message.txt寫入資料
message.txt ---存入聊天內容

index.php檔案

<?Php
//设置时区
date_default_timezone_set('PRC');
 
//读了内容
@$string = file_get_contents('message.txt');
 
//如果$string 不为空的时候执行,也就是message.txt中有留言数据
if (!empty($string)) {
 
    //每一段留言有一个分格符,但是最后多出了一个&^。因此,我们要将&^删掉
    $string = rtrim($string, '&^');
 
    //以&^切成数组
    $arr = explode('&^', $string);
 
    //将留言内容读取
    foreach ($arr as $value) {
 
        //将用户名和内容分开
        list($username, $content, $time) = explode('$#', $value);
 
        echo '用户名为<font color="gree">' . $username . '</font>内容为<font color="red">' . $content . '</font>时间为' . date('Y-m-d H:i:s', $time);
        echo '<hr />';
    }
 
}
 
?>
 
 
<h1>基于文件的留言本演示</h1>
<form action="write.php" method="post">
    用户名:<input type="text" name="username" /><br />
 
    留言内容:<textarea  name="content"></textarea><br />
 
    <input type="submit" value="提交" />
 
</form>

看了剛剛的展示內容,我們知道文件存儲時:

段與段之間進行了分割

內容與用戶之前用一個特殊的符號進行了分割

下面我們來寫write.php寫入留言至檔案的程式碼:

<?php
//追加方式打开文件
$fp=fopen('message.txt','a');
 
//设置时间
$time=time();
 
//得到用户名
$username=trim($_POST['username']);
//得到内容
$content=trim($_POST['content']);
 
 
//组合写入的字符串:内容和用户之间分开,使用$#
//行与行之间分开,使用&^
$string=$username.'$#'.$content.'$#'.$time.'&^';
 
//写入文件
fwrite($fp,$string);
 
//关闭文件
fclose($fp);
 
 
header('location:index.php');
 
?>
下一節
<?php //linux类的读了方式 readfile("/home/paul/test.txt"); //windows类的读取方式 readfile("c:\\boot.ini"); ?>
章節課件