Bài 5: Tìm hiểu quy trình làm việc trên file trong PHP
Một trong những tác vụ đặc biệt của PHP đó là cho phép xử lý dữ liệu trực tiếp thông qua quá trình nhận và đọc nội dung trên 1 file dữ liệu. Điều này giúp cho PHP trở nên tinh tế và dễ tùy biến hơn khi xử lý 1 lượng dữ liệu có quy mô lớn. Việc thao tác mở, đọc, ghi, đóng file này cũng có ý nghĩa tuần tự như bạn đang làm việc trực tiếp trên 1 file dữ liệu thực thụ.
1- Đóng, mở 1 file trong PHP:
Để mở 1 file ta sử dụng cú pháp sau: fopen("Đường dẫn", thuộc tính).
Trong đó Đường dẫn chính là đường dẫn tới file cần mở.
Thuộc tính bao gồm các quyền hạn cho phép thao tác trên file đó như thế nào.
Các thuộc tính cơ bản :

Ví dụ:
<?php
$fp=fopen("test.txt",r)or exit("khong tim thay file can mo");
?>
Tương tự như thế, để đóng 1 file ta có cú pháp như sau: fclose(file vừa mở)
Ví dụ:
<?php
$fp=fopen("test.txt",r)or exit("khong tim thay file can mo");
fclose($fp);
?>
Việc mở và đóng này không có ý nghĩa là chúng đã được đọc. Muốn đọc được nội dung của file chúng ta lại tiếp tục với thao tác lấy dữ liệu từ file nữa.
2- Đọc và ghi file trong PHP.
a) Đọc 1 file trong PHP
PHP cho ta nhiều sự lựa chọn trong việc đọc 1 file. Có nhiều hình thức hỗ trợ nhưng hiện nay 2 hình thức phổ biến nhất vẫn là đọc file theo từng dòng và đọc file theo từng ký tự.
- Đọc file theo từng dòng:
Cú pháp : fgets(file vừa mở).
Ví dụ:
<?php
$fp=fopen("test.txt",r)or exit("khong tim thay file can mo");
echo fgets($fp);
fclose($fp);
?>
- Đọc file theo từng ký tự:
Cú pháp : fgetc(file vừa mở).
Ví dụ:
<?php
$fp=fopen("test.txt",r)or exit("khong tim thay file can mo");
echo fgetc($fp);
fclose($fp);
?>
Quy trình đọc sẽ diễn ra theo từng yêu cầu của cú pháp sử dụng. Nhưng sẽ có sự ràng buộc bởi việc kiểm tra đã đến cuối file chưa ?.
Ở đây chúng ta dùng cú pháp sau: feof(file vừa mở)
Ví dụ:
<?php
$fp=fopen("test.txt",r)or exit("khong tim thay file can mo");
while(!feof($fp))
{
echo fgets($fp);
}
fclose($fp);
?>
b) Ghi 1 file trong PHP
PHP cung cấp cho ta 1 cú pháp nhỏ để ghi dữ liệu vào 1file
Cú pháp cơ bản : fwrite("file vừa mở", "Nội dung cần ghi vào file")
Ví dụ:
<?php
$fp=fopen("test.txt",a)or exit("khong tim thay file can mo");
$news="Trung Tam Tin hoc Viet Chuyenn";
fwrite($fp,$news);
fclose($fp);
?>
Tổng kết:
Việc sử dụng file một cách thành thạo sẽ giúp bạn dễ dàng vận hành các ứng dụng mang quy mô vừa và nhỏ như: website nhiều ngôn ngữ, bộ đếm,…và cả những công nghệ web mới như XML một cách dễ dàng. Qua bài học này chúng ta cũng hiểu được nguyên lý hoạt động, trình tự xử lý 1 file dữ liệu khi chúng được triệu gọi trong tài liệu PHP.
Bài tập áp dụng:
Xây dựng bộ đếm cho website, mỗi khi khách truy cập thì sẽ tự động tăng lên 1 giá trị.
(
Bùi Quốc Huy)
56334Bạn vẫn chưa hiểu rõ vấn đề ?. Bạn vẫn còn nhiều điều thắc mắc ?. Bạn gặp lỗi khi thực hành mã lệnh trên ?. Hãy tham gia diễn đàn QHOnline.Info để nhận được sự giúp đỡ từ phía cộng đồng nhanh nhất. Đồng thời tải những tài liệu giá trị tại diễn đàn. Việc đăng ký là hoàn toàn miễn phí, hãy đăng ký ngay để chúng tôi giúp đỡ bạn nhé. Ghi rõ nguồn từ website QHOnline.Info - Khi bạn phát hành lại thông tin từ website này
Dương Văn Quỳnh (13:08 25/02/2010)
Bài tập đếm số người truy cập Website có ứng dụng thực tế . Xin vui lòng cho gợi ý để làm bài nayThank.
Reply
từ bảo cường (21:43 18/04/2010)
cảm ơn anh ,nó rất hữu ít.Reply
Nam (18:47 17/05/2010)
Đề nghị ban quản trị có lời giải sau mỗi bài tập để chúng tôi tiên theo dõi và thực hành, Xin chân thành cảm ơn!Reply
Tin (21:34 26/05/2010)
//file index.php<meta charset="utf-8">
<html>
<?php
include ("dem.php");
?>
số lượng truy cập hiện nay là <?php echo $soluong; ?>
</html>
//file dem.php
<meta charset="utf-8">
<?php
$bandau = file("log.txt");
$soluong = $bandau[0];
$soluong ;
$fp = fopen("log.txt");
fwrite ($fp, $soluong);
fclose ($fp);
?>
Reply
Vinh Nguyen (22:24 28/05/2010)
Bộ đếm:Tạo 1 file counter.log (bằng notepad). Cho giá trị bằng 1 chẳng hạng.
<?php
$fp = fopen("counter.log",r);
$str = fgets($fp);
fclose($fp);
$count = (int)$str;
$count ;
$fp = fopen("counter.log",w);
fwrite($fp,$count);
fclose($fp);
echo "luot truy cap:".$count;
?>
Đặt đoạn code đó vào trang index.php, nếu đưa lên host thì set thuôc tính cho file counter.log là 777.
Reply
tran quoc du (07:14 05/06/2010)
khi viết code mở file, thì ta co tao file bên ngoài ko, nhưng em làm ko lên được.thanhksReply
newbie (12:28 11/06/2010)
Sặc sao truy cập mấy chục lần mà nó vẫn là 1.<?php
$fp = fopen("counter.log",r);
$str = fgets($fp);
fclose($fp);
$count = (int)$str;
$count ;
$fp = fopen("counter.log",w);
fwrite($fp,$count);
fclose($fp);
echo "luot truy cap:".$count;
?>
Reply
phan quoc khanh (20:35 26/06/2010)
đây là đáp án của mình<?php
$dem=0 ;
$fp=fopen("text.txt","r ")or exit("khong tim thay file can mo");
while(!feof($fp))
{
echo fgetc($fp);
$dem ;
}
fwrite($fp,1);
fclose($fp);
echo "<br>so luong truy cap la:".$dem ;
?>
Reply
thuy tram (17:58 28/06/2010)
de so luot truy cap tang len thi phai cho bien count tang.<?php
$fp = fopen("counter.log",r);
$str = fgets($fp);
fclose($fp);
$count = (int)$str;
$count ; // thay vi $count;
$fp = fopen("counter.log",w);
fwrite($fp,$count);
fclose($fp);
echo "luot truy cap:".$count;
?>
Reply
Dương Văn Trăm (17:51 21/07/2010)
Cảm ơn! Trang web rất hay.Reply
Doan Manh Hieu (11:39 23/07/2010)
<?php// Chu y: Khi moi tao ra file count.txt, phai ghi gia tri ban dau vao file nay;
$fp=fopen("count.txt","r");
$tg=fgets($fp);// gan gia tri trong count.txt vao bien trung gian;
fclose($fp);
$tg ; // Tang bien trung gian len 1
$fp=fopen("count.txt","w "); // Xoa het noi dung trong file count.txt;
fwrite($fp,$tg); // Ghi bien trung gian vao count.txt;
fclose($fp);
echo "<br>So lan truy cap: ".$tg;
?>
Reply
Đinh Hoàng Kha (19:09 31/07/2010)
Đây là bài của em :)<?
$dem=fopen("count.txt",r);
$i= fgets($dem);
fclose($dem);
$a=$i 1;
$dem=fopen("count.txt",w);
fwrite($dem,$a);
echo "Số lượt truy cập: " .$a;
fclose($dem);
?>
Reply
vuonglq365 (16:17 09/08/2010)
Mình đã thử chạy OK rồi, cảm ơn các bạn đã tham khảo.<?php
//dau tien cac ban tao 1 file test.txt voi noi dung so "1"
$fp=fopen("test.txt",r);
$so=fgets($fp); // lay noi dung cua file test.txt
$so ; //tang noi dung ("1") len 1 don vi
$fp=fopen("test.txt",w);
fwrite($fp,$so);// ghi vao file test.txt voi noi dung moi do la so "2"
echo "So luong nguoi truy cap:".$so;
?>
qhonline.info muôn năm :)
Reply
cabb (12:09 19/08/2010)
đấy là mở file txt đơn thuần còn muốn hiển thị chi tiết trong từng dòng của file thì như thế nàoví dụ lọc ra: Emai, Tên, địa chỉ,
các thông tin này trên một dòng
Exp: file.txt
1. t@yahoo.com | Toi | Ha Noi
2. b@yahoo.com | Toi | Ha Nam
3. c@yahoo.com | Toi | Ha Tay
Reply
tamnv (23:19 18/09/2010)
Theo mình để hiển thị đc file trên của bạn cabb thì dùng fgetc($file). Khi đọc đến ký tự | thì phân nó ra.Reply
tamnv (16:03 19/09/2010)
Cho em hỏi 1 chút, làm sao để đọc cả ký tự xuống dòng trong phương thức fgetc();Reply
x-jinger (20:42 24/10/2010)
mấy cái bài của mấy anh kia xài ko đc nên mần thử google có cái này<?php $CountFile = "test.log";
$CF = fopen ($CountFile, "r");
$Hits = fread ($CF, filesize ($CountFile) );
fclose ($CF);
$Hits ;
$CF = fopen ($CountFile, "w");
fwrite ($CF, $Hits);
fclose ($CF);
echo ($Hits);
?>
Reply
duyminh (11:29 29/10/2010)
rất cám ơn tất cả các thành viên đã tạo ra trang web nàyReply
LONGNHAT (19:27 09/11/2010)
thanks.!Reply
HuuHoang Nguyen (06:47 23/02/2011)
Chào các ban. Mình viết chương trình này trong một file couter.php. Đã test OK trên Window7 và IE8.//counter.php
<?php
$numberguest;
$fp=fopen("log.txt",'a ') or exit(" Not open file log.txt");
if(fgets($fp)=="")
{
$numberguest = 0;
fwrite($fp,(string)$numberguest);
fclose($fp);
}
{
//Doc file de lay so nguoi da vao website
//echo " vao cai nay 1";
$fp=fopen("log.txt",'r') or exit(" Not open file log.txt");
$numberguest=(int)(fgets($fp));
$numberguest ;
fclose($fp);
$fp=fopen("log.txt",'w ') or exit(" Not open file log.txt");
echo "So nguoi da vieng tham: ".$numberguest;
fwrite($fp,(string)$numberguest);
fclose($fp);
}
?>
Reply
hoangvantuyen (20:32 27/03/2011)
Em test thử các đáp án mà không dc.em làm trên localhost.khi tải lại trang không thêm số lượt truy cập.Admin có thể trả lời các cau hỏi không.thanksReply
son (11:03 06/04/2011)
sao code khi chạy bộ đếm ko hoạt động nhỉcác pro kiểm tra lại đi nhé
Reply
dggd (18:14 12/04/2011)
sdfsdfsdReply
Do duc tam (09:47 22/04/2011)
Các anh cho em hỏi cái file test.txt là file có ở trong máy ahReply
hoang viet tu (19:35 24/04/2011)
lam sao biet khi nao khach truy cap web minh . ham nao de biet dieu nay va cach dung ra sao???Reply
Mai (14:49 21/12/2011)
Đây là bài tập đếm số lượt truy cập vào webpage đang xét. Cứ mỗi lần trang web được load được tính là 1 lượt truy cập. Mà mỗi lần trang web được load lên tức là chức năng này lại đuợc gọi.Ví dụ mình (1 khách) bấm F5 10 lần thì số luợt truy cập sẽ đuợc tăng lên thêm 10 lần.
Nên nếu nói: số khách truy cập thì có vẻ ko đuợc chính xác lắm, nó liên quan đến session.
>>Do duc tam (09:47 22/04/2011)
>>Các anh cho em hỏi cái file test.txt là file có ở >>trong máy ah
Theo như mình thấy thì tất cả các code mà các bạn liệt kê, cái file test.txt này chúng ta phải tạo truớc trong máy. Nội dung của nó đơn giản là số 0 hoặc là số 1.
shirokenshin (22:18 07/05/2011)
<?php//dau tien cac ban tao 1 file test.txt voi noi dung so "1"
$fp=fopen("test.txt",r);
$so=fgets($fp); // lay noi dung cua file test.txt
$so ; //tang noi dung ("1") len 1 don vi
$fp=fopen("test.txt",w);
fwrite($fp,$so);// ghi vao file test.txt voi noi dung moi do la so "2"
echo "So luong nguoi truy cap:".$so;
?>
Hi,mình xem wa cái này,thấy là khi tăng lên 1dv thì fai ghi tường minh là $so=$so 1(chứ để như cũ thì ko tăng)
Reply
Hoàng Long (15:05 08/06/2011)
<?$dem=fopen("count.txt",r);
$i= fgets($dem);
fclose($dem);
$a=$i 1;
$dem=fopen("count.txt",w);
fwrite($dem,$a);
echo "so luot truy cap: " .$a;
fclose($dem);
?>
Mình Thấy cái code này chạy cũng ổn :D
Reply
nguyen van tien (20:30 24/06/2011)
<?php$viewss = file("counterlog.txt");
$views = $viewss[0]; $views ;
$fp = fopen("counterlog.txt", "w");
fwrite($fp, $views);
fclose($fp);
print"luot truy cap cua ban la ".$views;
?>
Reply
tony (12:19 27/06/2011)
Chu y: Khi moi tao ra file log.txt, phai ghi gia tri ban dau vao file nay la 0;<?php
$fp = fopen("log.txt","r");
$tg = fgets($fp); // gan gia tri trong count.txt vao bien trung gian;
fclose($fp);
$tg ; // Tang bien trung gian len 1
$fp = fopen("log.txt","w"); // Xoa het noi dung trong file count.txt;
fwrite($fp,$tg); // Ghi bien trung gian vao count.txt;
fclose($fp);
echo "luot truy cap : ".$tg;
?>
Reply
tican92 (14:09 01/07/2011)
Đơn giản chỉ nên làm zậy thôi !!!, có gì sai mong chỉ giáo !!!<?php
$fi = fopen("log.txt",r);
$log = fgets($fi);
fclose($fi);
$log ;
$fi = fopen("log.txt",w);
fwrite($fi,$log);
fclose($fi);
echo $log;
?>
Reply
Nguyễn Công Toàn (16:14 11/07/2011)
Anh ơi anh không trình bày cach upload file hả a!Reply
Cao Hữu Tú (18:47 15/07/2011)
function insert_comment($comment){
$tg = mysql_real_escape_string($comment[news_author] );
$nd = mysql_real_escape_string($comment[c_comment] );
$sql = "INSERT INTO comments VALUES('$comment[news_id]','$tg','$nd',now())";
if(!mysql_query($sql,dbconnect()))
{
die ('Error '.mysql_errno());
}
}
các bạn xem giúp mình đoạn mã trên(chèn 1 row vào bảng Comments)
khi mình chạy thì chỉ có trường news_id,date có dữ liệu còn trường author,c_comment thì không.
Reply
cuong (16:31 24/07/2011)
fwrite có tuong đương với fputs ko banReply
N-T_Han (20:13 04/08/2011)
<?php$Count_my_page =("hitcounter.txt");
$Hit = file($Count_my_page);
$Hit[0] ;
$fp = fopen($Count_my_page,"w");
fputs($fp,"$Hit[0]");
fclose($fp);
echo "Số lần truy cập : ".$Hit[0]." lần ";
?>
Reply
Linh (10:34 06/08/2011)
cách đọc file như trên chỉ dùng để mở được cho file .txt , còn như file word hoặc pdf thì không đọc được ( hiển thị tòan là những kí tự vô nghĩa). Có ai biết chỉ giúp với .Thank!Reply
Phú (19:17 11/08/2011)
Use of undefined constant r - assumed 'r' in C:xampphtdocswebs estfile.php on line 2Reply
Thùy Phây (16:08 20/08/2011)
he he. đã làm đc:<?
$file=fopen("dem.txt",r); //file dem.txt ban đầu có giá trị là 0
$dem=fgets($file) 1;
echo "So Luot truy cap: ";
echo $dem;
fclose($file);
$file=fopen("dem.txt",w);
fwrite($file,$dem);
fclose($file);
?>
Reply
TriếtBùi (11:17 09/09/2011)
Mò hoài rồi cũng ra :DTạo file test.txt , có giá trị ban đầu là 0
Nội dung file Counter.php:
<?php
$file=fopen("test.txt",r);//mở file test.txt
$doc=fgets($file);//gán biến đọc
fclose($file);//đóng file
$filew=fopen("test.txt",w);//mở file cho phép ghi
$ghi=$doc 1;// 1 giá trị biến ghi
fwrite($filew,$ghi);//ghi vào file biến ghi
echo "Tồng số lượt truy cập:".$doc." lần";//hiển thị biến đọc
?>
Reply
PITMAP (13:57 15/09/2011)
Warning: fopen(test.txt) [function.fopen]: failed to open stream: No such file or directory in C:AppServwww estai5.php on line 1đã có file test.txt sẵn rồi mà cứ báo lỗi
ai fix dùm lỗi này với
Reply
Hoàng Tuấn (23:36 19/09/2011)
-Đầu tiên tạo 1 file test.txt với nội dung là số 1-Code:
<?php
$fb=fopen("test.txt",r) or exit("Khong ton tai file nay");
$fc=(int)fgets($fb);
echo "<br>So luong truy cap:".$fc;
$fc=$fc 1;
$fb=fopen("test.txt",w) or exit("Khong ton tai file nay");
fwrite($fb,$fc);
?>
Reply
Do Thanh Y (21:48 26/09/2011)
<?php$a=fopen("batdau.txt",r);
$b=fgets($a);
fclose($a);
$dem=(int)$b;
$b ;
$a=fopen("batdau.txt",w);
fclose($a);
echo "so lan truy cap ha $b" ;
?>
đây là code chạy OK trên localhost, mình mới vào học xin các bạn chỉ giáo thêm nhe
các bác ơi có ai giúp mình cách vào 1 tab trên web viết bằng php không chỉ mình với
Reply
Do Thanh Y (22:01 26/09/2011)
<?php$a=fopen("Batdau.txt",r);
$b=fgets($a);
fclose($a);
$dem=(int)$b;
$b ;
$a=fopen("Batdau.txt",w);
fwrite($a,$b);
fclose($a);
echo "so lan truy cap ha $b"
?>
Reply
dang_nguyenxx89 (02:21 30/09/2011)
<?php$f=fopen("D:php.txt",r)or exit("khong tim thay file can mo");
$b=fgets($f);
$c=(int)$b;
$c ;
echo "luot truy cap : ".$c;
fclose($f);
$g=fopen("D:php.txt",w)or exit("khong tim thay file can mo");
fwrite($g,$c);
fclose($g);
?>
Reply
manhthan91 (22:31 06/10/2011)
bài tập của mình<?php
$dem=fopen("text.txt","r");
$gan=fgets($dem);
fclose($dem);
$gan ;
$dem=fopen("text.txt","w");
fwrite($dem,$gan);
echo "số lượt truy cập của bạn là: ".$gan;
fclose($dem);
?>
Reply
phùng văn thủy (16:41 13/10/2011)
mình đang thắc mắc ko biết làm sao để ghi được ký tự xuống dòng vào file.mình đã thử "/n" rồi mà ko được.
ai biết chỉ cho mình với. hix
Reply
Kenny (10:49 16/10/2011)
Chào bạn.Bạn muốn xuống dòng trên file text. Thì phải dùng đúng cú pháp là: "
" thì mới xuống dòng được. "/n" nó không hiểu là đúng rồi.
Best,
trần văn khải (22:15 09/11/2011)
diễn đàn cơ thể cho em biết đuờng dẫn ở đây là gì khôngReply
Kenny (23:30 09/11/2011)
Chào bạn.Bạn có thể click vào đường dẫn "Diễn đàn" ở menu trên cùng của website. Hoặc có thể click trực tiếp vào đây: Diễn Đàn QHOnline
Chúc bạn học tập được nhiều kiến thức từ diến đàn.
Best,
Vũ Mạnh Huy (12:52 13/11/2011)
Bài này sao e làm mà nó không mở ra file nào vậy hả các thầy ?Reply
nhatnha (22:44 17/11/2011)
<?php$fp=fopen("dem.txt","r")or exit("khong tim thay file can mo");
$dem = fgets($fp);
echo "so lan truy cap la : ".$dem;
$dem++;
fclose($fp);
$fp=fopen("dem.txt","w")or exit("khong tim thay file can mo");
$news = $dem;
fwrite($fp,$news);
fclose($fp);
?>
Reply
Lê Mạnh Quân (10:42 25/11/2011)
<?php$fp = fopen("log.txt",r);
$str = fgets($fp);
fclose($fp);
$count = (int)$str;
$count ;
$fp = fopen("log.txt",w);
if(fopen("log.txt",w))
{
$count++;
}
fwrite($fp,$count);
fclose($fp);
echo "luot truy cap:".$count;
?>
mình giống bạn Vinh Nguyen nhưng thêm vào mỗi lần open file( tương đương 1 lần truy cập mình sẽ để biến count tăng thêm 1 giá trị)
Reply
Hồ Quang Thạnh (16:33 11/12/2011)
<html><head>
<title> Trang chu </title>
</head>
<body>
Welcome to my site !!!
<?php
$fp=fopen("index.php","r");
// Kiem tra nguoi dung truy cap trang chu index.php
if($fp){
// Kiem tra file counter.txt ghi nhan so luong nguoi truy cap
if(file_exists("counter.txt")){
$fp1=fopen("counter.txt","r");
}
else{
$fp1=fopen("counter.txt","w");
}
$count=(int)fgets($fp1);
$count++;
// ghi nhan so luong nguoi truy cap vao file counter.txt
$fp1=fopen("counter.txt","w");
fwrite($fp1,$count);
fclose($fp1);
}
else{
echo "Khong the truy cap duoc website";
}
fclose($fp);
echo "<br>" . "<b> So nguoi dang truy cap : $count</b>";
?>
</body>
</html>
Reply
Jonfamvn (18:59 15/12/2011)
Tạo bộ đếm mỗi khi khách truy cập sẽ tự động tăng lên 1 giá trị:<?php
$fp=fopen('counter.log',r);
$number++;
flose($fp);
$fp=fopen('counter.log',w);
fwrite($fp,$number);
echo "So luot truy cap la: $number";
fclose($fp);
?>
Reply
Duong Dung (11:10 20/12/2011)
Comment dễ hiểu đây các bạn ơi :)<?php
//tạo 1 file test.txt và nội dung là "1"
$fp=fopen("test.txt",r); // mở file test.txt để đọc
$so=fgets($fp); // Lấy nội dung của file test.txt . Gán biến $so cho nội dung này. $so = 1
$so++ ; // Tăng nội dung biến $so lên 1 đơn vị
$fp=fopen("test.txt",w); // Mở file test.txt để ghi .
fwrite($fp,$so);// ghi vào file test.txt với nội dung là "2" do $so = 2 . "w" nội dung file cũ xóa đi.
echo "Số lượng người truy cập : ".$so; // Hiển thị số người truy cập
?>
hồng quang (20:21 21/12/2011)
Mình làm theo bài ví dụ ở trên thì nó báo lỗi:Notice: Use of undefined constant r - assumed 'r' in D:xampphtdocsqhonline est.php on line 10
sucessful
Các bạn xem hộ mình xem lỗi gì với.