Tài liệu hướng dẫn cách chèn file, xây dựng chức năng upload file từ client lên server, sử dụng session để tạo chức năng đăng nhập và đăng xuất, tạo các file cookie trên máy người dùng. Tại mỗi chức năng có ví dụ và hình ảnh minh họa cụ thể, rõ ràng nhằm giúp người học dễ dàng thực hành để hình thành kỹ năng.
Trang 11
PHP nâng cao
Trần Thị Bạch Huệ
2
Nội dung
Chèn file
Upload file
Cookies
Error
Exception
Chèn file
Chúng ta có thể chèn nội dung của một file php vào
một file php khác trước khi server thực thi nó bằng
cách dùng hàm include() hoặc require()
Hai hàm này giống nhau về chức năng chỉ khác ở
cách kiểm soát lỗi
– include() sinh lỗi nhưng script vẫn tiếp tục thực thi
– require() sinh lỗi thì script sẽ dừng việc thực thi
Hai hàm này được dùng để chèn các hàm, các
headers, footers hay các phần tử sẽ được dùng lại
trong nhiều trang
Hàm include()
Lấy tất cả nội dung trong file chỉ định chèn vào file hiện hành
Nếu có lỗi, hàm phát ra một warning nhưng script vẫn tiếp tục thực thi
Ví dụ 1:
vars.php
<?php $color = 'green';
$fruit = 'apple'; ?>
test.php
<?php echo "A $color $fruit"; // A include 'vars.php';
echo "A $color $fruit"; // A green apple ?>
Trang 25
Ví dụ 2:
<?php
function foo()
{
global $color;
include 'vars.php';
echo "A $color $fruit";
}
/* vars.php is in the scope of foo() so $fruit is NOT available out
side of this scope $color is because we declared it as global*/
foo(); // A green apple
echo "A $color $fruit"; // A green
?>
6
Ví dụ 3:
return.php
<?php
$var = 'PHP';
return $var;
?>
noreturn.php
<?php
$var = 'PHP';
?>
testreturns.php
<?php
$foo = include 'return.php';
echo $foo; // prints 'PHP'
$bar = include 'noreturn.php';
echo $bar; // prints 1
?>
Hàm require()
Hàm require() có chức năng tương tự như hàm
include() nhưng khác nhau ở cách kiểm soát lỗi
Khi gặp lỗi, hàm include() phát ra một warning
nhưng script vẫn tiếp tục thực thi trong khi hàm
require() phát ra một fatal error và dừng thực thi
script
Ví dụ 1:
<?php
include("wrongFile.php");
echo "Hello World!";
?>
Thông báo lỗi:
Warning: include(wrongFile.php) [function.include]:
failed to open stream:
No such file or directory in C:\home\website\test.php on line
5
Warning: include() [function.include]:
Failed opening 'wrongFile.php' for inclusion (include_path='.;C:\php5\pear')
in C:\home\website\test.php on line 5 Hello World!
Trang 39
không dừng việc thực thi của script
Ví dụ 2:
<?php
require("wrongFile.php");
echo "Hello World!";
?>
10
Thông báo lỗi:
Warning: require(wrongFile.php) [function.require]:
failed to open stream:
No such file or directory in C:\home\website\test.php on line
5
Fatal error: require() [function.require]:
Failed opening required 'wrongFile.php' (include_path='.;C:\php5\pear')
in C:\home\website\test.php on line 5
Lệnh echo không được thực thi do fatal error đã dừng việc thực thi của script
Upload file
Để có thể upload files từ client lên server, chúng ta
dùng mảng kết hợp toàn cục $_FILES
Mảng này chứa tất cả thông tin của file được upload
như tên file (name), loại file (type) hay kích cỡ file
(size),…
Chỉ số đầu tiên của mảng $_FILES là name của
input file trên form Chỉ số thứ hai có thể là “name”,
“type”, “size”, “tmp_name” hoặc “error”
– $_FILES["file"]["name"] – Tên file cần upload
– $_FILES["file"]["type"] – Loại file như “image/gif”
– $_FILES["file"]["size"] – Kích cỡ file cần upload được tính theo byte
– $_FILES["file"]["tmp_name"] – Tên file tạm thời của bản copy của file cần upload nằm trên server
– $_FILES["file"]["error"] – Mã lỗi do upload file
Mặc định các files được lưu trữ tạm thời trong thư mục tmp (temporary) trên server Chúng sẽ bị xóa khi trang web bị đóng Để lưu trữ các files này, chúng ta cần copy nó tới một nơi khác trên server
Trang 413
Ví dụ:
<html>
<body>
<form action="upload_file.php" method="post"
enctype="multipart/form-data">
File name <input type="file" name="file" id="file" />
<br />
<input type="submit" name="submit" value="Submit" />
</form>
</body>
</html>
14
Trang upload_file.php phía server
<?php
if ($_FILES["file"]["error"] > 0){
echo "Error: " $_FILES["file"]["error"] "<br />";
} else{
echo "Upload: " $_FILES["file"]["name"] "<br />";
echo "Type: " $_FILES["file"]["type"] "<br />";
echo "Size: " ($_FILES["file"]["size"] / 1024)."
Kb<br />";
echo "Stored in: " $_FILES["file"]["tmp_name"];
}
?>
Save file được upload:
– Tức là di chuyển các files từ thư mục tmp đến thư
mục khác
– Dùng hàm move_uploaded_file có cú pháp:
bool move_uploaded_file(string $filename, string
$destination)
filename: Tên file được upload (tên file cần copy)
destination: Nơi sẽ lưu trữ các file này (thư mục chuyển
đến)
Trang upload_file.php phía server có thể viết lại:
<?php
if ($_FILES["file"]["error"] > 0){
echo "Error: " $_FILES["file"]["error"] "<br />";
}else{
echo "Upload: " $_FILES["file"]["name"] "<br />";
echo "Type: " $_FILES["file"]["type"] "<br />";
echo "Size: " ($_FILES["file"]["size"] / 1024)." Kb<br />";
echo "Stored in: " $_FILES["file"]["tmp_name"];
move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" $_FILES["file"]["name"]);
echo "Stored in: " "upload/" $_FILES["file"]["name"];
}
?>
Trang 517
file_exists để kiểm tra liệu file sắp upload có
tồn tại hay không?
bool file_exists ( string $filename )
– filename: Đường dẫn tới file cần kiểm tra
(Tham khảo ví dụ trong help)
18
Session
Khi chúng ta mở một ứng dụng, thao tác trên nó rồi đóng lại Điều này giống như một Session Tuy nhiên, máy tính biết ta là ai
Vấn đề này trên Internet thì khác Web server không biết chúng ta là ai và những gì chúng ta làm do địa chỉ HTTP không nói lên điều đó
Session giải quyết điều này bằng cách cho phép chúng ta lưu trữ thông tin người dùng trên server cho lần sử dụng sau (như username, họ tên,…)
– Tuy nhiên, việc lưu trữ này là tạm thời và chúng sẽ bị xóa khi người dùng rời khỏi website
Session làm việc bằng cách tạo ra một id
(UID – User ID) duy nhất cho mỗi người
viếng thăm và lưu trữ thông tin người dùng
này dựa trên id vừa tạo
Thông tin được lưu trữ dùng chung cho tất
cả các trang trong một phiên làm việc
truyền qua URL
– Bắt đầu một session bằng hàm session_start()
bool session_start( )
– Hàm này tạo một session hoặc hồi phục lại session hiện hành dựa trên id của session được gởi trong yêu cầu GET hoặc POST, hoặc được gởi kèm trong cookies
Trang 621
Ví dụ 1:
<?php session_start(); ?>
<html>
<body>
…
</body>
</html>
Đoạn mã trên đăng ký một session người dùng với
server, cho phép lưu trữ thông tin người dùng và
gán một user id (UID) cho session đó
22
Lưu trữ thông tin người dùng vào session bằng cách sử dụng mảng kết hợp $_SESSION
Ví dụ 2: Trang page1.php có code như sau:
<body>
<?php session_start();
echo 'Welcome to page #1';
$_SESSION['favcolor'] = 'green'; //lưu trữ thông tin thứ 1
$_SESSION['animal'] = 'cat'; //lưu trữ thông tin thứ 2 echo '<br /><a href=“page2.php">page 2</a>';
?>
</body>
Code của page2.php:
<?php
session_start();
?>
<html>
<body>
<?php
echo $_SESSION['favcolor'];
echo $_SESSION['animal'];
?>
</body>
</html>
Output: greencat
Ví dụ 3:
– Tại trang page1.php tạo:
Form đăng nhập gồm username và nút Sign in
Nếu người dùng nhập username và nhấn nút Sign in thì thông báo “hello username”
Ngược lại thông báo “Bạn chưa đăng nhập”
– Tại trang page2.php:
Kiểm tra và thông báo xem user này đã đăng nhập chưa
Trang 725
<body>
<form action=“page1.php" method="post">
<input type="text" name="user"><br>
<input type="submit" value="Sign in">
</form>
<?php session_start();
if (isset($_POST['user'])){
$_SESSION['user']=$_POST['user'];
echo "Chào mừng ".$_POST['user'];
}else
echo 'Bạn chưa đăng nhập';
?>
</body>
26
Trang page2.php:
<body>
<?php session_start();
if (isset($_SESSION['user'])) echo "Đăng nhập rồi";
else echo "Chưa đăng nhập";
?>
</body>
– Xóa một vài dùng hàm:
void unset(mixed $var [, mixed $var [, mixed $ ]])
– Xóa tất cả:
bool session_destroy(void)
(Tham khảo ví dụ trong help)
Một số hàm liên quan đến session:
– Session_decode
– Session_encode
– Session_id
– Session_name
– Session_register
– Session_save_path
– Session_unregister
– Session_unset
(sinh viên tìm hiểu thêm)
Trang 829
Bài tập
Tại trang page2.php của ví dụ 3, viết mã đáp
ứng yêu cầu:
– Kiểm tra xem user có đăng nhập chưa?
– Nếu đăng nhập rồi thì hiển thị siêu liên kết Sign
out để người dùng thoát khỏi việc đăng nhập trên
– Nếu chưa đăng nhập thì thông báo
30
Cookie
Cookie là một tập tin nhỏ, được server ghi trên máy tính người dùng Mỗi lần máy tính
đó yêu cầu một trang với cùng trình duyệt web, nó cũng sẽ gởi cookie kèm theo
Chúng ta có thể tạo cookie bằng cách sử
dụng hàm setcookie() hoặc setrawcookie()
Chú ý: Hàm tạo cookie phải được đặt trước thẻ <html>
setcookie(name, value, expire, path, domain)
– Chú ý : Tham số value, expire, path, domain có
thể bỏ qua
– name: Tên của cookie
– value: Giá trị của cookie
expire: Thời gian cookie hết hiệu lực
– Bạn nên dùng hàm time() cộng với số giây mà cookie hết hiệu lực để làm giá trị truyền vào tham số này
– Ví dụ:
setcookie(“user”,”alex”,time()+60);//hết hiệu lực trong vòng 1 phút
setcookie(“user”,”alex”,time()+60*60*24*30);//hết hiệu lực trong vòng 30 ngày
– Nếu tham số này là 0 hoặc bị bỏ qua, cookie sẽ hết hiệu lực lúc kết thúc session (hay khi trình duyệt bị đóng)
Trang 9
33
path: Chỉ ra các thư mục trên server mà
cookie có thể sử dụng
– Ví dụ:
Nếu đặt dấu ‘/’, cookie có thể sử dụng trên toàn domain
Nếu đặt ‘/foo/’, cookie chỉ có thể sử dụng trong thư mục
foo và các thư mục con của foo trong domain
– Giá trị mặc định của tham số này là thư mục hiện
hành
34
– Ví dụ:
Để cookie có thể sử dụng trong tất cả các miền con của miền example.com, truyền giá trị ‘.example.com’ cho tham số domain
Nếu truyền ‘www.example.com’ cho tham số domain thì
chỉ có miền con www mới có thể sử dụng cookie
Truy lục giá trị cookie:
– Sử dụng mảng kết hợp $_COOKIE
– Ví dụ: Code của trang page3.php
<?php
$value = 'something from somewhere';
setcookie("TestCookie", $value);
setcookie("TestCookie", $value, time()+3600);//1 giờ hết hạn
setcookie("TestCookie", $value, time()+3600, "/test/",
".example.com");
?>
Code của trang page4.php cho thấy cách truy lục lại giá trị lưu trong cookie
<body>
<?php // In một giá trị cookie echo $_COOKIE["user"];
// In tất cả print_r($_COOKIE);
?>
</body>
Trang 1037
Xóa cookie
– Ví dụ:
<?php
setcookie(“user”, “”,time()+60);
?>
38
Bài tập
1 Kiểm chứng lại các ví dụ
đăng nhập (sign in)
– Tạo form đăng nhập gồm username và password
– Khi người dùng điền thông tin và nhấn nút Sign
in, hỏi người dùng có muốn lưu pass hay không?
Nếu đồng ý, lưu vào cookie và thông báo đã lưu rồi
Nếu không, thông báo “pass không được lưu”
Error và Exception
Hết