Nội dung trình bày trong chương 5 Ngôn ngữ kịch bản PHP nâng cao thuộc bài giảng mã nguồn mở nhằm trình bày về Cookie, Session, Gửi mail, xử lý File, chuyển hướng website với .htaccess, bắt lỗi chương trình, hướng đối tượng trong PHP.
Trang 3a- Cookie là mẫu tin nhỏ, có cấu trúc, dạng text lưu ở máy client khi truy cập một website (nếu kịch bản trong trang đó có chức năng thiết lập cookie).Cookie được lưu ở thư mục :
C:\Documents and Settings\Administrator\Cookies
Ví dụ đây là một mẫu cookie khi viếng trang www.ibm.com
UnicaNIODID 4yZ3oOSlqrO-WrSL3kV ibm.com/
1600 1465922944 30475811 543399952 30113713
*
(tên tệp ndt@ibm[1]) ndt là PC name của client
Trang 4Cookie (tt)
b- Thiết lập cookie
Cú pháp: setcookie(name, value, expire[, path, domain]);
Trong PHP, câu lệnh setcookie phải đặt trước thẻ <html>
Ví dụ :
Trang CreateCookie.php
<?php
$expire=time()+60*60*24*30; // hết hạn sau 30 ngày
setcookie(“username", “NguyenMinhThanh", $expire);
echo "Cookie has been created!";
?>
Hàm time() trả về số giây đã trôi qua bắt đầu từ 01-Jan-1970
Một dạng thời gian dùng trong hệ điều hành Unix
Trang 5$_COOKIE[] là một biến mảng toàn cục
Hàm isset() kiểm tra một biến đã được khai báo, khởi gán chưa
Trang 8session_start(); $biến = $_SESSION [‘tên’ ];
Xóa giá trị đã thiết lập : unset($_SESSION[ ‘tên’ ]);
Hủy bỏ toàn bộ biến $_SESSION[] : session_destroy();
Session có rất nhiều ứng dụng, ví dụ như lưu trữ thông tin về giỏ hàng trong E-commerce
Trang 9Dựa trên các kỹ thuật:
-Chỗ nào cần đưa các giá trị php chỉ cần <php echo $biến ?>
- Biến toàn cục lưu tên trang hiện thời : $_SERVER[‘PHP_SELF’]
- Câu lệnh if else endif của PHP để điều khiển luồng HTML
Trang 10$user=$_REQUEST["ht"]; $pass=$_REQUEST["mk"]; // thay cho $_POST[]
?>
<?php if($user==""): ?> <!- - có thể dùng if(!isset($_REQUEST[‘ht’])) - ->
You are'nt login!
<form method = post action = <?php echo $_SERVER["PHP_SELF"]?> >
User Name: <input type= text name=ht>
Password:<input type= password name=mk>
<input type=submit value="Sign in“>
Trang 11Cú pháp: mail (to,subject,message,headers,parameters)
Ý nghĩa các tham số:
- to, subject, message : như ý nghĩa các text box khi soạn mail
- headers :tùy chọn, có thể sử dụng Bcc, Cc
- parameter: tùy chọn, các thông số về trình soạn, gởi mail
Trong phần message: sử dụng ký hiệu \n để xuống dòng.
Trang 12$subject = "Test mail";
$message = "Hello! This is a simple email message.";
$from = “ndt473@yahoo.com";
$headers = "From: $from";
@ mail($to,$subject,$message,$headers); // không cho warning!
echo "Mail Sent.";
?>
Lưu ý:
-người gởi phải có một đia chỉ mail Theo dõi các kỹ thuật chống spam của mỗi trình gởi, nhận mail của người nhận!
-Phối hợp với form để soạn thảo một trình gởi mail
-Có thể lập trình để gởi mail đến danh sách các địa chỉ đã lưu trong CSDL
Trang 131 Mở file
$file=fopen("welcome.txt","r") or exit("Unable to open file!");
Trang 143- Kiểm tra EOF
if (feof($file)) echo "End of file";
Trang 17echo "Upload: " $_FILES["file"]["name"] "<br />";
echo "Type: " $_FILES["file"]["type"] "<br />";
echo "Size: " ($_FILES["file"]["size"] / 1024) " Kb<br />";
echo "Temp file: " $_FILES["file"]["tmp_name"] "<br />";
if (file_exists("upload/" $_FILES["file"]["name"])) {echo $_FILES["file"]["name"] " already exists " }else {
move_uploaded_file($_FILES["file"]["tmp_name"], "upload/"
$_FILES["file"]["name"]);
echo "Stored in: " "upload/" $_FILES["file"]["name"];
}}
?>
Trang 19Dấu “#” này dùng để định nghĩa một đoạn comment trong httpd.conf, và htaccess.
Do vậy trước khi làm việc với htaccess, bạn nên backup cẩn thận dữ
liệu của mình, nếu có trục trặc xảy ra, việc khôi phục trở nên đơn giản.
Trang 20[R] : chỉ định server đổi hướng request sang một trang khác trong
trường hợp trình duyệt gởi yêu cầu duyệt một trang được sửa chữa
đường dẫn (rewrite) trước đó
Trang 21• Những kí tự đặc biệt
[NC] : Chỉ định server so khớp nhưng kí tự không phân biệt hoa thường
Ví dụ :
RewriteCond %{HTTP_REFERER} !^http://domain.com/.*$ [NC]
[PT]: có nghĩa là dùng kí tự để buộc "rewrite engine" ấn định bảng giá trị của uri trở thành giá trị của tên files
[OR] : các biểu thức được nối tiếp nhau bằng toán tử OR, trong đó biểu thức nào đúng, sẽ là quy tắc để lệnh Rewrite áp dụng
Ví dụ:
RewriteBase /
RewriteCond %{HTTP_USER_AGENT} ^Anarchie [OR]
RewriteCond %{HTTP_USER_AGENT} ^ASPSeek [OR]
RewriteCond %{HTTP_USER_AGENT} ^attach [OR]
RewriteRule ^.* - [F,L]
[NE] : Chỉ định server xử lí các gói tin trả về mà không dùng kí tự thoát
Trang 22[T=MIME-type] : Khai báo định dạng files của server
[] : chỉ định các kí tự đặt đặt trong [] sẽ được match Cụ thể [xyx] thì các request có mang theo các kí tự x, y hoặc z sẽ được match.
+ : chỉ định nội dung đừng trước dấu + phải xuất hiện ít nhất 1 lần [^] : Ngược lại với [], các kí tự được đặt theo dạng [xyz^] sẽ không được match.
[a-z] : Dấu ‘-‘ đặt giữa 2 kí tự bên trong cặp dấu [] sẽ match tất cả các kí tự nằm trong khoảng từ kí tự đầu đến kí tự cuối.
Trang 23a{n} : chỉ định chính xác n kí tự a được match Ví dụ a{3} thì 3 kí tự a
? : chuỗi có hoặc không
! : phủ định VD: “!string” sẽ match tất cả các kí tự, ngoại trừ string
- : Loại đi một chức năng, hoặc một rule đang thực thi nào đó.
* : Tất cả đều được
| : Hoặc
\ : Kí tự thoát
Trang 24Cơ bản về htaccess
• Những kí tự đặc biệt
-d : Kiểm tra thư mục có tồn tại hay không?
-f : Kiểm tra file có tồn tại hay không
-s : Kiểm tra giá trị của file có khác 0 hay không?
Mã chuyển hướng trang báo lỗi
- 401 - Authorization Required : Lỗi chưa được xác thực user và password
- 400 - Bad request : Lỗi truy cập không hợp lệ, do server không chấp nhận request, hoặc request thiếu một số yêu cầu nào đó.
- 403 - Forbidden : Lỗi truy cập vào trang bị cấm
- 500 - Internal Server Error : Lỗi do server
- 404 - Wrong page : Lỗi truy cập vào trang không tồn tại
- 301 - Moved Permanently: 302 - Moved Temporarily: Lỗi truy cập vào trang đã bị di chuyển.
Trang 251 Ngăn chặn hotlink
Nhiều người copy ảnh từ server của bạn và đưa lên trang web của họ Thêm vào htaccess đoạn mã dưới đây sẽ giúp bạn ngăn chặn ảnh hiển thị trên website khác:
Trang 26Các ví dụ trong htaccess
2 301 Redirect
Nếu ta chuyển domain, hoặc chỉ muốn chuyển một trang cũ về một trang mới
và không muốn lo lắng về các kết quả search từ google, sử dụng đoạn mã sau
Redirect 301 /d/file.html http://www.domain.com/r/file.html
3 Viết lại tên miền cũ sang tên mới
Sử dụng đoạn mã dưới đây để chuyển tất cả các link từ tên miền cũ sang tên miền mới:
#Chuyển hướng từ tên miền cũ sang tên mới
RewriteEngine On
RewriteRule ^(.*)$ http://www.domain.com/$1 [R=301,L]
Trang 27Nếu không muốn dùng các trang báo lỗi có sẵn của host, ta có thể tạo các trang báo lỗi riêng và cấu hình vào file htaccess như sau:
Trang 28Các ví dụ trong htaccess
6 Bảo vệ file
Đoạn mã dưới đây sẽ từ chối
khi người dùng truy cập vào
bất kỳ file nào và gửi về lỗi
7 Đặt mã cho thư mục và file
Đặt mã & quyền truy cập vào thư mục/file như sau:
# Đặt mã cho thư mụcresides
AuthType basicAuthName "Thư mục này đã được bảo vệ"AuthUserFile /home/path/.htpasswd
AuthGroupFile /dev/nullRequire valid-user
# Đặt mã cho file
<files secure.php="">
AuthType BasicAuthName "Prompt"
AuthUserFile /home/path/.htpasswdRequire valid-user
Trang 29RewriteRule ^category/(.+)$
http://www.domain.com/$1 [R=301,L]
11 Bỏ phần đuôi file ở URL
Không muốn hiện php ở url, hãy thêm
đoạn code sau:
RewriteRule ^(([^/]+/)*[^.]+)$ /$1.php [L]
Trang 30Các ví dụ trong htaccess
12 Thêm / vào cuối URL
Một vài bộ máy tìm kiếm (như Yahoo)tự động bỏ dấu / ở cuối url Website cũng
có thể được truy cập có hoặc không có dấu / ở sau cùng url Điều này không tốt với các bộ máy tìm kiếm (sẽ bị coi là duplicated content) Thêm đoạn mã dưới đây vào htaccess để giải quyết vấn đề đó:
#Thêm / vào cuối URL
Trang 31Để ngăn chặn truy cập vào tên file trong thư mục nào đó (ví dụ thư mục plugins của wordpress), thêm đoạn mã sau vào file htacess:
Options All -Indexes
Nếu muốn cho phép browse thư mục bạn chỉ cần đổi lại là:
Options All +Indexes
Trang 32Bắt lỗi chương trình
• Khi có vấn đề trong quá trình thực thi, PHP luôn cố gắng đưa ra các thông báo lỗi hữu ích để người dùng (lập trình viên) xác định được vấn đề.
Trang 33• Các cấu hình về thông báo lỗi nằm trong file php.ini
• Cấu hình trong php.ini
error_reporting = E_ALL & ~E_NOTICE
Trang 34echo “This is impossible<br>”;
exit();
}
If ($height_of_door > $height_of_house) {
trigger_error(“Impossible condition”,E_USER_ERROR); }
Trang 35“Lập trình hướng đối tượng là 1 phương pháp viết mã cho phép các lập trình
viên nhóm các action tượng tự nhau vào các class” Điều này giúp mã lệnh giữ vững được nguyên lý DRY “don’t repeat yourself” (không lặp lại chính nó) và dễ dàng để bảo trì
Một lợi ích to lớn của nguyên lý lập trình DRY là: nếu một phần thông tin nào đó được thay đổi trong chương trình, thì thông thường chỉ cần có duy nhất 1 thay đổi để cập nhật lại mã lệnh Một trong những ác mộng lớn nhất đối với các lập trình viên là bảo trì mã lệnh, nơi dữ liệu được khai báo đi khai báo lại nhiều lần,
họ phải tìm kiếm, làm việc trên các dữ liệu và chức năng trùng lặp
Trang 36Hướng đối tượng trong PHP
Hiểu Về Đối Tượng (Objects) Và Lớp (Class)
Nhiều lập trình viên có kinh nghiệm cho rằng hai khái niệm object và class có
thể thay thế cho nhau Tuy vậy, đây không phải là vấn đề đáng quan tâm,
mặc dù sự khác nhau giữa object và class có thể sẽ rất phức tạp khiến bạn
phải bù đầu để tìm hiểu khi mới tiếp xúc với chúng
Trang 37Hiểu Về Đối Tượng (Objects) Và Lớp (Class)
Một object sau đó, cũng giống như một ngôi nhà thực tế được xây dựng dựa trên bản thiết kế này Dữ liệu trong object ở đây có thể được xem như là gỗ, dây điện,
và bê tông để tạo nên ngôi nhà hoàn chỉnh: mà không hề có chi tiết cách tạo ra chúng trong bản thiết kế Tuy nhiên, khi kết hợp tất cả lại với nhau, nó sẽ trở
thành một ngôi nhà hoàn chỉnh đến từng chi tiết
Các Class xử lý cấu trúc dữ liệu và các action, đồng thời sử dụng các thông tin
đó để xây dựng các object Có thể có nhiều hơn một object được xây dựng từ
cùng một class tại cùng một thời điểm, mỗi object này đều là 1 cá thể độc lập và
không phụ thuộc lẫn nhau Trở lại vấn đề xây dựng, điều này cũng giống như một quần thể các lô nhà có thể được xây dựng trên cùng một bản thiết kế: 150 ngôi nhà khác nhau đều có hình dạng giống nhau, nhưng có các hộ gia đình và nội thất bên trong đều khác nhau
Trang 38Hướng đối tượng trong PHP
a- Đặc điểm OOP trong PHP 5.0 : không cho phép đa kế thừa
b- Khai báo class
Class tên_class{
// khai báo thuộc tính, bản chất là biến dùng trong class
// khai báo các phương thức, bản chất là các hàm Riêng hàm dựng // phải cùng tên với tên của class
// sử dụng từ khóa private hay public và protected để xác định chế // độ truy xuất
Trang 39echo "Su dung ham constractor<br>";
$hung= new hoso (“Nguyễn Minh Thành",“12/3/1985");
echo "Họ tên: " $hung->ho_ten “, Ngày sinh: " $hung->ngay_sinh ;
?>
Ví dụ đơn giản
Trang 40Phương Thức Magic Trong OOP
• Để giúp cho việc sử dụng các object trở nên thuận tiện hơn,
PHP đã cung cấp một số phương thức magic, chúng thường
được gọi khi có những action nhất định thường xuyên xảy ra trong các object Điều này cho phép lập trình viên thực thi một
số tác vụ hữu ích dễ dàng.
(hàm hủy)
Khi một object được khởi tạo, nó thường kèm theo nhu cầu
thiết lập một vài thứ ngoài lề Để xử lý điều này, PHP cung cấp phương thức magic construct(), phương thức này sẽ tự động được gọi ngay khi một object mới được khởi tạo.
• Để gọi một hàm khi object bị hủy, chúng ta có sẵn phương
thức magic destruct() Thông thường nó được sử dụng vào mục đích dọn dẹp một cái gì đó (ví dụ: đóng một kết nối cơ sở
dữ liệu).
Trang 42Phương Thức Magic Trong OOP
Trang 43• Convert qua một Chuỗi
Nếu muốn echo MyClass ra dưới dạng chuỗi, ta sẽ gặp lỗi Để tránh được lỗi này, cần sử dụng một phương thức magic khác được gọi là toString().
Trang 44Sự kế thừa trong hướng đối tượng
• Một Class có thể kế thừa các phương thức và thuộc tính của class khác, bằng cách sử dụng từ khóa extends
Trang 45Tại một class con, để thay đổi giá trị, tính năng của một thuộc tính hoặc phương thức đã có sẵn ở class cha, chỉ cần ghi đè (nạp chồng) lên nó bằng cách khởi tạo lại chính nó trong class con
Trang 46- Chế độ protected : Chế độ này sẽ được dùng để giới hạn truy cập tới các lớp được thừa kế và bản thân lớp định nghĩa thành viên đó.
Với PHP5 , tất cả các thành viên của một lớp đều phải được khai báo tính rõ ràng với các từ khoá tương ứng là public, protected và private.
Trang 47public $public = 'Public 1'; // truy xuất mọi nơi trang
private $private = 'Private 1'; // chỉ t.x được bên trong lớp
protected $protected = 'Protected 1'; // không cho kế thừa,private
public function printHello(){ // được truy xuất mọi thuộc
echo $this->public."<br>"; // bên trong lớp
echo $this->protected."<br>";
echo $this->private."<br>";
}
}
class MyClass2 extends MyClass{ // thừa kế từ lớp MyClass
protected $protected = 'Protected2';
function printHello(){ // chồng hàm
echo $this->public."<br>"; // thừa kế từ MyClass
echo $this->protected."<br>"; // lấy thuộc tính riêng
echo $this->private."<br>"; // không thừa kế từ MyClass
}
}
Xem tiếp trang sau về sử dụng các lớp MyClass và MyClass2
Trang 48$obj = new MyClass();
echo $obj->public; /
echo $obj->protected; // lỗi: $protected đã bị đặt ở chế độ bảo vệ
echo $obj->private; // lỗi: $private đã bị đặt ở chế độ riêng tư
$obj->printHello();
// Hoạt động bình thường, do các thuộc tính được triệu gọi bên trong một phương thức nằm trong lớp
$obj2 = new MyClass2();
echo $obj->public; // Chạy tốt
echo $obj2->private; // Chưa được định nghĩa
echo $obj2->protected; // Gây lỗi
$obj2->printHello(); // Hiển thị Public, Protected2, not Private
?>