Thao tác với file trong PHP

Thao tác với file là một phần quan trọng của bất kỳ ứng dụng web nào. Bạn thường cần mở và xử lý một file cho một số tác vụ khác nhau.

Thao tác với file trong PHP

PHP có một số hàm để tạo, đọc, tải lên và chỉnh sửa các file.

Hãy cẩn thận khi thao tác với các tập tin!

Bạn có thể gây ra nhiều thiệt hại nếu bạn làm sai điều gì đó. Các lỗi thường gặp là: chỉnh sửa sai file, làm đầy ổ cứng với dữ liệu rác hoặc vô tình xóa nội dung của file.

Mở và đọc file trong PHP

Trong phần này, chúng tôi sẽ hướng dẫn bạn cách mở, đọc và đóng file trên máy chủ.

Hàm readfile() trong PHP

Hàm readfile() đọc nội dung của một file và viết nó vào bộ đệm đầu ra.

Giả sử chúng ta có một file văn bản có tên là "webdictionary.txt", được lưu trữ trên máy chủ, nội dung của nó trông như thế này:

AJAX = Asynchronous JavaScript and XML
CSS = Cascading Style Sheets
HTML = Hyper Text Markup Language
PHP = PHP Hypertext Preprocessor
SQL = Structured Query Language
SVG = Scalable Vector Graphics
XML = EXtensible Markup Language

Mã PHP để đọc file và ghi nó vào bộ đệm đầu ra như sau (hàm readfile() trả về số byte được đọc khi thành công):

<?php
   echo readfile("webdictionary.txt");
?>

Đây là kết quả:


AJAX = Asynchronous JavaScript and XML CSS = Cascading Style Sheets HTML = Hyper Text Markup Language PHP = PHP Hypertext Preprocessor SQL = Structured Query Language SVG = Scalable Vector Graphics XML = EXtensible Markup Language236

Hàm readfile() rất hữu ích nếu bạn chỉ muốn mở một tập tin và đọc tất cả nội dung của nó.

Hàm fopen() trong PHP

Một cách tốt hơn để mở file là sử dụng hàm fopen(). Hàm này cung cấp cho bạn nhiều tùy chọn hơn hàm readfile().

Tham số đầu tiên của hàm fopen() chứa tên của file sẽ được mở và tham số thứ hai chỉ định chế độ mở file. Ví dụ sau đây cũng tạo một thông báo nếu hàm fopen() không thể mở file được chỉ định:

<?php
   $myfile = fopen("webdictionary.txt", "r") or die("Unable to open file!");
   echo fread($myfile, filesize("webdictionary.txt"));
   fclose($myfile);
?>

Đây là kết quả:


AJAX = Asynchronous JavaScript and XML CSS = Cascading Style Sheets HTML = Hyper Text Markup Language PHP = PHP Hypertext Preprocessor SQL = Structured Query Language SVG = Scalable Vector Graphics XML = EXtensible Markup Language236
Lưu ý: Các hàm fread()fclose() sẽ được giải thích ở dưới đây.

File có thể được mở ở một trong các chế độ sau:

Chế độ Mô tả
r Mở một file chỉ đọc. Con trỏ file bắt đầu ở đầu file
w Mở một file chỉ ghi. Xóa nội dung của file hoặc tạo một file mới nếu nó không tồn tại. Con trỏ file bắt đầu ở đầu file
a Mở một file chỉ ghi. Các dữ liệu hiện có trong file được giữ nguyên. Con trỏ file bắt đầu ở cuối file. Tạo một file mới nếu file không tồn tại
x Tạo một file mới chỉ ghi. Trả về FALSE và lỗi nếu file đã tồn tại
r+ Mở một file để đọc / ghi. Con trỏ file bắt đầu ở đầu file
w+ Mở một file để đọc / ghi. Xóa nội dung của file hoặc tạo một file mới nếu nó không tồn tại. Con trỏ file bắt đầu ở đầu file
a+ Mở một file để đọc / ghi. Các dữ liệu hiện có trong file được giữ nguyên. Con trỏ file bắt đầu ở cuối file. Tạo một file mới nếu file không tồn tại
x+ Tạo một file mới để đọc / ghi. Trả về FALSE và lỗi nếu file đã tồn tại

Hàm fread() trong PHP

Hàm fread() được sử dụng để đọc nội dung từ một tập tin đang mở.

Tham số đầu tiên hàm fread() chứa tên của file cần đọc và tham số thứ hai chỉ định số byte tối đa cần đọc.

Đoạn mã PHP sau đây đọc file "webdictionary.txt" từ đầu đến cuối:


fread($myfile, filesize("webdictionary.txt"));

Hàm fclose() trong PHP

Hàm fclose() được sử dụng để đóng một tập tin đang mở.

Đây là một thực hành lập trình tốt (best pratice) để đóng tất cả các file sau khi bạn đã hoàn thành với chúng. Chắc chắn bạn sẽ không muốn một file đang mở chạy trên máy chủ và chiếm tài nguyên!

Hàm fclose() yêu cầu tên của file (hoặc một biến chứa tên file) mà chúng tôi muốn đóng:

<?php
    $myfile = fopen("webdictionary.txt", "r");
    // some code to be executed....
    fclose($myfile);
?>

Hàm fgets() trong PHP

Hàm fgets() được sử dụng để đọc một dòng duy nhất từ một tập tin.

Ví dụ dưới đây xuất ra dòng đầu tiên của file "webdictionary.txt":

<?php
    $myfile = fopen("webdictionary.txt", "r") or die("Unable to open file!");
    echo fgets($myfile);
    fclose($myfile);
?>

Đây là kết quả:

AJAX = Asynchronous JavaScript and XML
Lưu ý: Sau khi gọi hàm fgets(), con trỏ tệp đã chuyển sang dòng tiếp theo.

Hàm feof() trong PHP

Hàm feof() kiểm tra xem đã đọc tới ký tự "end-of-file" (EOF) chưa (ký tự kết thúc file).

Hàm feof() rất hữu ích cho vòng lặp duyệt qua dữ liệu có độ dài chưa xác định.

Ví dụ dưới đây đọc từng dòng file "webdictionary.txt", cho đến khi đạt đến cuối tệp:

<?php
    $myfile = fopen("webdictionary.txt", "r") or die("Unable to open file!");
    // Output one line until end-of-file
    while(!feof($myfile)) {
      echo fgets($myfile) . "<br>";
    }
    fclose($myfile);
?>

Đây là kết quả:

AJAX = Asynchronous JavaScript and XML
CSS = Cascading Style Sheets
HTML = Hyper Text Markup Language
PHP = PHP Hypertext Preprocessor
SQL = Structured Query Language
SVG = Scalable Vector Graphics
XML = EXtensible Markup Language

Hàm fgetc() trong PHP

Hàm fgetc() được sử dụng để đọc một ký tự duy nhất từ một tập tin.

Ví dụ dưới đây đọc từng ký tự trong file "webdictionary.txt" cho đến hết file:

<?php
    $myfile = fopen("webdictionary.txt", "r") or die("Unable to open file!");
    // Output one character until end-of-file
    while(!feof($myfile)) {
        echo fgetc($myfile);
    }
    fclose($myfile);
?>

Đây là kết quả:


AJAX = Asynchronous JavaScript and XML CSS = Cascading Style Sheets HTML = Hyper Text Markup Language PHP = PHP Hypertext Preprocessor SQL = Structured Query Language SVG = Scalable Vector Graphics XML = EXtensible Markup Language
Lưu ý: Sau khi gọi hàm fgetc(), con trỏ file sẽ di chuyển đến ký tự tiếp theo.

Tạo và ghi file trong PHP

Trong phần này, chúng tôi sẽ hướng dẫn bạn cách tạo và ghi vào một file trên máy chủ.

Hàm fopen() trong PHP

Hàm fopen() cũng được sử dụng để tạo ra một tập tin. Có thể hơi khó hiểu, nhưng trong PHP một file được tạo bằng cách sử dụng cùng chức năng để mở file.

Nếu bạn sử dụng fopen() trên một file không tồn tại, nó sẽ tạo file với điều kiện là file được mở để ghi (w) hoặc nối thêm (a).

Ví dụ dưới đây tạo một file mới gọi là "testfile.txt". File sẽ được tạo trong cùng thư mục chứa mã PHP:

$myfile = fopen("testfile.txt", "w")

Nếu bạn gặp lỗi khi cố gắng chạy mã này, hãy kiểm tra xem bạn đã cấp quyền cho file PHP của bạn để ghi thông tin vào ổ cứng chưa.

Hàm fwrite() trong PHP

Hàm fwrite() được sử dụng để ghi vào một tập tin.

Tham số đầu tiên của hàm fwrite() là tên của file cần ghi và tham số thứ hai là chuỗi được ghi.

Ví dụ dưới đây ghi một vài tên vào một file mới có tên là "newfile.txt":

<?php
    $myfile = fopen("newfile.txt", "w") or die("Unable to open file!");
    $txt = "John Doe\n";
    fwrite($myfile, $txt);
    $txt = "Jane Doe\n";
    fwrite($myfile, $txt);
    fclose($myfile);
?>

Lưu ý rằng chúng tôi đã ghi vào file "newfile.txt" hai lần. Mỗi lần chúng tôi ghi vào file, chúng tôi đã gửi chuỗi $txt mà lần đầu tiên chứa "John Doe" và lần thứ hai chứa "Jane Doe". Sau khi ghi xong, chúng tôi đóng file bằng hàm fclose().

Nếu chúng ta mở file "newfile.txt", nó sẽ trông như thế này:

John Doe
Jane Doe

Ghi đè file trong PHP

Khi chúng tôi mở một file có sẵn để ghi ở chế độ "w", tất cả các dữ liệu hiện có trong file sẽ bị xóa và chúng tôi bắt đầu với một file trống.

Trong ví dụ dưới đây, chúng tôi mở file "newfile.txt" đã chứa một số dữ liệu ở ví dụ trước và ghi một số dữ liệu mới vào đó:

<?php
    $myfile = fopen("newfile.txt", "w") or die("Unable to open file!");
    $txt = "Mickey Mouse\n";
    fwrite($myfile, $txt);
    $txt = "Minnie Mouse\n";
    fwrite($myfile, $txt);
    fclose($myfile);
?>

Nếu bây giờ chúng ta mở file "newfile.txt", dữ liệu ở ví dụ đầu tiên đã biến mất và chỉ có dữ liệu chúng ta vừa ghi:

Mickey Mouse
Minnie Mouse


Bài viết liên quan:

Hướng dẫn lập trình PHP toàn tập sẽ giúp bạn từng bước tìm hiểu và nắm vững ngôn ngữ lập trình PHP.

Hướng dẫn cách truy xuất, lọc, sắp xếp dữ liệu MySQL trong PHP sử dụng MySQLi và PDO.

MySQL prepared statements trong PHP rất hữu ích để chống lại các cuộc tấn công SQL Injection.