You are on page 1of 164

PHP (PHP: Hypertext Preprocessing)

Người lập: Nguyễn Phú Quảng


Bộ môn: Tin học Xây dựng
Nội dung trình bày

I. Làm quen với PHP


II. PHP Căn bản
III. Các tính năng cho ứng dụng Web base
I. Làm việc với Form
II. Các hàm làm việc với MySQL
III. Làm việc với File
IV. Các hàm làm việc với hình ảnh
V. Các hàm trên ngày tháng
VI. Các hàm trên dữ liệu
VII. Cookies và QueryString
VIII. Session
IX. Gỡ lỗi
I. Làm quen với PHP

I.1. PHP là gì?


I.2. Lịch sử phát triển của PHP
I.3. Lý do chọn PHP
I.4. Zend Engine
I.5. Cài đặt PHP
I.6. Chương trình PHP đầu tiên
I.7. Các IDE cho PHP
I.1. PHP là gì?
 PHP được phát triển từ ngôn ngữ kịch bản (script) với mục đích
xây dựng trang Web cá nhân (Personal Home Page). Sau đó đã
được phát triển thành một ngôn ngữ hoàn chỉnh và được ưa
chuộng trên toàn thế giới trong việc phát triển các ứng dụng Web
based
 Theo NetCraft:
– Tháng 11 năm 1999, hơn 1 triệu máy chủ
– Tháng 9 năm 2000, hơn 1.4 triệu máy
 PHP (PHP: Hypertext Perprocessor) là ngôn ngữ kịch bản lập trình
phía máy chủ (server-side) phổ biến nhất thế giới.
 PHP thường hoạt động theo thứ tự sau:
– Người dùng gửi yêu cầu lên máy chủ
– Máy chủ xử lý yêu cầu (Thông dịch mã PHP và chạy chương trình, mã
PHP có thể truy xuất CSDL, tạo hình ảnh, đọc ghi file, tương tác với
máy chủ khác...)
– Máy chủ gửi dữ liệu về cho người dùng (thường là dưới dạng HTML)
I.1. PHP là gì? (2)
I.2. Lịch sử phát triển của PHP

 Phiên bản đầu tiên của PHP được phát triển năm 1994,
bao gồm các macro cho trang Web cá nhân (Personal
Home Page)
 Sau đó, PHP được phát triển thêm một số chức năng mới
gọi là Form Interpreter (PHP/FI) và có được sự quan tâm
lớn từ phía cộng đồng
 Phiên bản tiếp theo, PHP3, được viết lại bởi một nhóm các
lập trình viên (Zeev Suraski, Andi Gutmans). PHP3 được
bổ sung thêm một số tính năng và các cú pháp ngôn ngữ
khác, đã trở thành ngôn ngữ kịch bản phía máy chủ được
ưa chuộng nhất
I.3. Lý do chọn PHP

 Khi sử dụng PHP, người dùng sẽ có được


tốc độ nhanh hơn nhiều so với các ngôn ngữ
kịch bản khác, bởi PHP là phần mềm mã
nguồn mở, được hỗ trợ bởi nhiều lập trình
viên giỏi, có số lượng người dùng đông đảo.
Ngoài ra PHP chạy được trên nhiều hệ điều
hành khác nhau
I.3. Lý do chọn PHP (2)
 Rút ngắn thời gian phát triển
– PHP cho phép bạn tách phần HTML code và phần script,
do đó có thể độc lập giữa công việc phát triển mã và thiết
kế. Điều này vừa giúp lập trình viên dễ dàng hơn vừa có
thể làm cho chương trình mềm dẻo hơn trong việc thay đổi
giao diện
 PHP là phần mềm mã nguồn mở
– PHP không chỉ là phần mềm mã nguồn mở mà còn thực sự
miễn phí (kể cả khi bạn sử dụng cho mục đích thương mại)
– Do là phần mềm mã nguồn mở, các lỗi (bug) của PHP
được công khai và nhanh chóng được sửa chữa bởi nhiều
chuyên gia
I.3. Lý do chọn PHP (3)

 Tốc độ
– Nhờ vào sức mạnh của Zend Engine, khi so sánh
PHP với ASP, có thể thấy PHP vượt hơn ở một số
test, vượt trội ở tốc độ biên dịch.
 Tính khả chuyển
– PHP được thiết kế để chạy trên nhiều nền tảng
khác nhau, có thể làm việc với nhiều phần mềm
máy chủ, cơ sở dữ liệu (ví dụ: bạn có thể phát
triển dự án trên UNIX, sau đó chuyển sang NT mà
không gặp phải bất cứ vấn đề gì)
I.4. Zend Engine

 Zend là scripting engine nằm bên trong PHP


 Zend Engine thực sự là sự cải tiến đáng kể.
Hầu hết các đoạn mã viết trên PHP3 đều có
thể chạy trên PHP4 với tốc độ tăng gấp 200
lần
I.5. Cài đặt PHP

 Bạn có thể tìm phiên bản mới nhất của PHP


tại địa chỉ http://www.php.net
 PHP là phần mềm mã nguồn mở, bạn có thể
download cả mã nguồn của PHP
 Bạn có thể tìm tài liệu tham khảo của PHP tại
địa chỉ http://www.php.net/manual
I.5. Cài đặt PHP (2)

Cài đặt PHP với IIS


– Control Panel/Add Remove Programs/Add Remove
Window Components
– Bật Internet Information Services
– Download PHP Installer (Windows Binaries) từ
http://www.php.net/downloads.php
– Cài đặt PHP (chọn server IIS)
Cài đặt Apache
– Download Apache tại http://httpd.apache.org/
– Cài đặt Apache
I.5. Cài đặt PHP (3)

 Download bản PHP zip package (Window Binaries)


 Giải nén vào thư mục C:\PHP
 Sửa file conf/httpd.conf, thêm vào nội dung sau
ScriptAlias /php/ "c:/php/"
AddType application/x-httpd-php .php
Action application/x-httpd-php "/php/php.exe"
 Hoặc (Copy php5ts.dll vào thư mục c:/windows/system32)
LoadModule php5_module "c:/php/sapi/php5apache2.dll"
AddType application/x-httpd-php .php
I.5. Cài đặt PHP (4)

 Thêm alias (vào trong httpd.conf)


Alias fake “realname”
Alias /pm/ "C:/PMNM/47PM1/47PM1/”
 Chú ý: fake phải bắt đầu bằng /
 nếu fake kết thúc bằng / thì realname cũng
phải kết thúc bằng /
I.6. Chương trình PHP đầu tiên

 Chương trình đầu tiên (bạn có thể soạn bằng bất


kỳ trình soạn thảo văn bản nào)
<?php
echo("Hello world");
?>
Lưu file dưới tên hello.php tại c:\inetpub\wwwroot\php
(IIS) hoặc trong thư mục ứng với Alias vừa tạo ra
Tại trình duyệt, nhập vào địa chỉ
http://localhost/php/hello.php
I.6. Chương trình PHP đầu tiên (2)

 Khối chương trình PHP

Tag style Start Tag End Tag


Chuẩn <?php ?>
Dạng rút gọn <? ?>
ASP <% %>
Script tags <script </script>
language=“ph
p”>
I.6. Chương trình PHP đầu tiên (3)

<html>
<head>
<title>Chuong trinh PHP dau tien</title>
</head>
<body>
<b>
<?php
// Day la chuong trinh PHP dau tien
echo("Hello world");
/* Comment the nay cung duoc */
# Ma the nay cung chang sao
?>
</b>
</body>
</html>
I.7. Các IDE cho PHP

Như đã biết, bạn có thể viết chương trình PHP


bằng bất cứ hệ soạn thảo văn bản nào. Tuy
nhiên, để có được các chức năng hỗ trợ như
AutoComplete, Debug... cần phải sử dụng các
IDE dành riêng cho PHP
– Macromedia DreamWaver
– Nusphere PHPED
– Zend Studio
II. PHP Căn bản

II.1. Biến, kiểu và hằng


II.2. Toán tử và biểu thức
II.3. Các câu lệnh điều khiển
II.4. Hàm
II.5. Lớp & đối tượng
II.6. Tham chiếu (reference)
II.1. Biến, kiểu và hằng

II.1.1. Biến
II.1.1.1. Tên biến
II.1.1.2. Tham chiếu
II.1.1.3. Biến động
II.1.1.4. Phạm vi (scope) của biến
II.1.2. Kiểu
II.1.3. Hằng
II.1.1.1. Tên biến

<?php
$var = "Bob";
$Var = "Joe";
echo "$var, $Var"; // outputs "Bob, Joe"

$4site = 'not yet'; // invalid; starts with a number


$_4site = 'not yet'; // valid; starts with an underscore
$täyte = 'mansikka'; // valid; 'ä' is (Extended) ASCII 228.
?>
Biến được ký hiệu bởi ký tự $
Tên biến phải được bắt đầu bởi 1 chữ cái hoặc ký tự gạch
chân
Tên biến không chứa các dấu và ký tự cách
II.1.1.2. Tham chiếu

Giống ngôn ngữ C, trong PHP bạn có thể sử dụng tham chiếu
<?php
$quang = "adfsdfasdfa";
echo("<p>$quang</p>");
$q = &$quang;
$q = "quangnp";
echo("<p>$quang</p>");
?>
<?php
$foo = 25;
$bar = &$foo; // This is a valid assignment.
$bar = &(24 * 7);// Invalid references an unnamed expression.
function test() {
return 25;
}
$bar = &test(); // Invalid.
?>
II.1.1.3. Biến động (Dynamic Variable)

Vì PHP là ngôn ngữ thông dịch nên bạn có thể sử dụng các biến
có tên chưa biết trước (tên biến thay đổi)
<?php
$a = "quang"; // gia tri cua bien a la 'quang'
$$a = "np"; // bien dong $quang co gia tri la 'np'
echo("$a<br>"); // In ra gia tri cua bien a
echo("$quang<br>"); // In ra gia tri cua bien quang
${"quang"} = 13432; // Gian truc tiep bien dong
echo("$quang<br>");
$c = "quang";
${$c} = 1000;
// Mot cach khac de truy cap den bien dong quang
echo("${$c}<br>");
?>
II.1.1.4. Phạm vi của biến
<?php
$a = 1;
include "b.inc";
?>
Phạm vi của biến [a] có tác dụng trong cả b.inc
<?php
$a = 1; // global scope
function Test() {
echo $a; // reference to local scope variable
}
Test();
?>
Biến [a] ở ngoài và trong hàm Test khác nhau
II.1.1.4. Phạm vi của biến (2)

Từ khóa global Hoặc sử dụng cú pháp


<?php <?php
$a = 1; $a = 1;
$b = 2; $b = 2;
function Sum() { function Sum() {
//a, b trong & ngoai ham Sum $GLOBALS["b"] =
global $a, $b; $GLOBALS["a"] +
// la giong nhau $GLOBALS["b"];
$b = $a + $b; }
} Sum();
Sum(); echo $b;
echo $b; ?>
?>
II.1.1.4. Phạm vi của biến (3)

<?php <?php
function Test () function Test ()
{ {
$a = 0; static $a = 0;
echo $a; echo $a;
$a++; $a++;
} }
Test(); Test();
Test(); Test();
?> ?>
II.1.1.4. Phạm vi của biến (4)

<?php
$foo = 25;
$bar = &$foo; // This is a valid assignment.

function test()
{
global $foo;
return $foo;
}
$bar = &test(); // Invalid.
echo($bar);
?>
II.1.2. Kiểu

 Các kiểu đơn


II.1.2.1. boolean
II.1.2.2. integer
II.1.2.3. float
II.1.2.4. string
 Các kiểu phức
II.1.2.5. array
II.1.2.6. object
 Các kiểu đặc biệt
II.1.2.7. resource
II.1.2.8. NULL
II.1.2. Kiểu (2)
<?php
$bool = TRUE; // a boolean
$str = "foo"; // a string
$int = 12; // an integer
echo gettype($bool); // prints out "boolean"
echo gettype($str); // prints out "string“

// If this is an integer, increment it by four


if (is_int($int)) {
$int += 4;
}
// If $bool is a string, print it out
// (does not print out anything)
if (is_string($bool)) {
echo "String: $bool";
}
?>
Bạn có thể ép kiểu bằng hàm settype()
II.1.2.1. Kiểu boolean
<?php
// == is an operator which test
// equality and returns a boolean
$q = (1==1);
echo("$q<br>");
$q = (1=="1");
echo("$q<br>");
// this is not necessary...
if ($show_separators == TRUE) {
echo "<hr>\n";
}
// ...because you can simply type
if ($show_separators) {
echo "<hr>\n";
}
?>
II.1.2.2. Kiểu integer
<?php
$a = 1234; # decimal number
$a = -123; # a negative number
$a = 0123; # octal number (equivalent to 83 decimal)
$a = 0x1A; # hexadecimal number (equivalent to 26
decimal)
?>

<?php
$a=10000000;
var_dump($a); echo("<br>");
$a=100000000;
var_dump($a); echo("<br>");
$a=1000000000;
var_dump($a); echo("<br>");
$a=10000000000;
var_dump($a); echo("<br>");
?>
II.1.2.3. Kiểu float
<?php
$a = 1.234;
$b = 1.2e3;
$c = 7E-10;
?>

<?php
$foo = 1 + "10.5"; // $foo is float (11.5)
$foo = 1 + "-1.3e3"; // $foo is float (-1299)
$foo = 1 + "bob-1.3e3"; // $foo is integer (1)
$foo = 1 + "bob3"; // $foo is integer (1)
$foo = 1 + "10 Small Pigs"; // $foo is integer (11)
$foo = 4 + "10.2 Little Piggies"; // $foo is float (14.2)
$foo = "10.0 pigs " + 1; // $foo is float (11)
$foo = "10.0 pigs " + 1.0; // $foo is float (11)
?>
II.1.2.4. Kiểu string
 String trong PHP là một chuỗi các ký tự 1 byte. PHP không hỗ
trợ Unicode, để làm việc với Unicode bạn phải sử dụng UTF8
với các hàm utf8_encode() – utf8_decode()
 String của PHP hỗ trợ chiều dài rất lớn (?)
 Trong PHP, string được xác định theo 3 cách
– Dấu nháy đơn (single quote)
– Dấu nháy kép (double quote)
– Heredoc
 Truyền biến trong string
– Truyền kiểu đơn giản
– Truyền kiểu phức
 Truy cập đến từng ký tự trong string
 Các toán tử trên string
II.1.2.4. Kiểu String (2)

Kiểu dấu nháy đơn


<?php
echo 'this is a simple string';
echo 'You can also have embedded newlines in
strings this way as it is
okay to do';
// Outputs: Arnold once said: "I'll be back"
echo 'Arnold once said: "I\'ll be back"';
// Outputs: You deleted C:\*.*?
echo 'You deleted C:\\*.*?';
// Outputs: You deleted C:\*.*?
echo 'You deleted C:\*.*?';
// Outputs: This will not expand: \n a newline
echo 'This will not expand: \n a newline';
// Outputs: Variables do not $expand $either
echo 'Variables do not $expand $either';
?>
II.1.2.4. Kiểu String (3)

 Kiểu dấu nháy kép: kiểu này giống với kiểu


dấu nháy đơn nhưng có nhiều hỗ trợ cho các
ký tự đặc biệt hơn
II.1.2.4. Kiểu String (4)

Kiểu Heredoc
<?php
$str = <<<EOA
Example of string <br>
spanning multiple lines<br>
using heredoc syntax.<br>
EOA;
echo($str);
$name = "quang";
$d = date("d/m/y");
$str = <<<EOQ
This is a lecture of $name.<br>
Ngay $d<br>
EOQ;
echo($str);
?>
II.1.2.4. Kiểu String (5)

Truyền biến kiểu đơn giản


<?php
$beer = 'Heineken';
echo "$beer's taste is great";
// works, "'" is an invalid character for varnames
echo "He drank some $beers";
// won't work, 's' is a valid character for varnames
echo "He drank some ${beer}s"; // works
echo "He drank some {$beer}s"; // works
?>

Truyền biến kiều phức (truyền biến kiểu mảng vào


string) – sẽ đề cập đến ở phần mảng
II.1.2.4. Kiểu String (6)

Truy cập đến từng ký tự của String


<?php
$str = "This is a test";
echo $str[0]; // Ky tu dau tien
echo $str{1}; // Ky tu thu 2
echo $str{strlen($str)-1}; // Ky tu cuoi cung
echo "<br>$str";
$str{strlen($str)-1} = "s"; // Sua ky tu cuoi cung
echo "<br>$str";
?>
Các toán tử trên string
<?php
$str1 = "quang";
$str2 = "np";
echo $str1 . $str2, "<br>";
echo $str1 + $str2, "<br>";
?>
II.1.2.5. Kiểu Array

 Kiểu Array của PHP thực sự là kiểu ánh xạ


(map) có thứ tự. Tức là kiểu dữ liệu gồm các
cặp khóa (key) và giá trị (value).
 Với kiểu mảng này, bạn có thể sử dụng như
một mảng thuần túy (vector), hay dùng cho
các kiểu dữ liệu collection, stack, queue,
tree...
II.1.2.5. Kiểu Array (2)
Khaibáo
<?php
$ar = array(3,4,5,6,3,2);
echo var_dump($ar), "<br>";
$ar = array(5=>10, 20, 30, "q"=>40);
echo var_dump($ar), "<br>";
$ar = array(5=>10, 6=>20, 7=>30, "q"=>40);
echo var_dump($ar), "<br>";
$ar = array("a"=>10, 20, 30, 40);
echo var_dump($ar), "<br>";
$ar = array("a"=>array(1,2,3,4,5), 20, 30, 40);
echo var_dump($ar);
?>
II.1.2.5. Kiểu Array (3)

Sử dụng array
<?php
$arr = array(5 => 1, 12 => 2);
$arr[] = 56; // This is the same as $arr[13] = 56;
// at this point of the script
$arr["x"] = 42; // This adds a new element to
// the array with key "x"
unset($arr[5]); // This removes the element from the array
unset($arr); // This deletes the whole array
?>
<?php
$handle = opendir(".");
var_dump($handle);
while($file=readdir($handle)) {
$files[] = $file;
}
var_dump($files);
?>
II.1.2.6. Kiểu Object

<?php
class Xeco {
var $sobanh;
function BaoNhieuBanh() {
echo($this->sobanh);
}
};

$xe = new Xeco();


$xe->sobanh = 4;
$xe->BaoNhieuBanh();
?>
II.1.3. Hằng

Định nghĩa hằng bằng cách sử dụng hàm define()


Phạm vi của hằng là toàn cục (global)
Chỉ có các dạng dữ liệu đơn giản (boolean, interger, float, string)
Nếu tên hằng chưa được định nghĩa, PHP giả thiết rằng bạn đang sử dụng
1 hằng chứa giá trị là 1 string (chính là tên của hằng đó)
Để xác định một hằng đã được định nghĩa hay chưa, bạn có thể sử dụng
hàm defined
<?php
define("CONSTANT", "Hello world.");
echo CONSTANT; // outputs "Hello world."
echo Constant; // outputs "Constant" and issues a notice.
echo defined("Constant");
echo defined("CONSTANT");
?>
II.1.3. Hằng (2)

 Các hằng được định nghĩa trước (các hằng này


thường được sử dụng để phục vụ quá trình debug
Tên hằng Mô tả

__LINE__ Thứ tự dòng hiện tại trong file

__FILE__ Đường dẫn đầy đủ của file hiện tại

__FUNCTION__ Tên hàm hiện tại

__CLASS__ Tên lớp hiện tại

__METHOD__ Tên phương thức hiện tại của lớp


II.2. Toán tử và biểu thức

II.2.1. Mức độ ưu tiên các toán tử


II.2.2. Toán tử số học
II.2.3. Toán tử gán
II.2.4. Các toán tử trên bit
II.2.5. Toán tử so sánh
II.2.6. Toán tử điều khiển lỗi
II.2.7. Toán tử thực thi
II.2.8. Toán tử tăng, giảm
II.2.9. Các toán tử logic
II.2.10. Toán tử trên string
II.2.11. Toán tử trên mảng
II.2.1. Mức độ ưu tiên các toán tử
Associativity Operators
left ,
left or
left xor
left and
right print
right = += -= *= /= .= %= &= |= ^= <<= >>=
left ? :
left ||
left &&
left |
left ^
left &
non-associative == != === !==
non-associative < <= > >=
left << >>
left + - .
left * / %
right ! ~ ++ -- (int) (float) (string) (array) (object) @
right [
non-associative new
II.2.2. Toán tử số học

Example Name Result


$a + $b Addition Sum of $a and $b.
$a - $b Subtraction Difference of $a and $b.
$a * $b Multiplication Product of $a and $b.
$a / $b Division Quotient of $a and $b.
$a % $b Modulus Remainder of $a divided by $b.
II.2.3. Toán tử gán
 Toán tử gán (=) cho phép bạn gán một biểu thức (vế
phải) cho 1 biến (vế trái)
 Toán tử gán trả về giá trị của biểu thức vế phải, do đó
có thể dùng nhiều phép gán liên tiếp nhau
 Ngoài ra, còn có các phép toán gọi là phép toán kết
hợp cho hầu hết các toán tử số học để thay đổi giá trị 1
biến theo phép toán số học đó (+=, -=, *=, /=, .= ...)
<?php
$a = 4; echo "$a\n";
$a = $b = $c = 10; echo "$a,$b,$c\n";
$a = ($b=4) + 5; echo "$a,$b\n";
$a .= "quang"; echo "$a\n";
$a = ($b+=10) + 2; echo "$a";
?>
II.2.4. Các toán tử trên bit

Example Name Result


$a & $b And Bits that are set in both $a and $b are set.
$a | $b Or Bits that are set in either $a or $b are set.
Bits that are set in $a or $b but not both are
$a ^ $b Xor
set.
Bits that are set in $a are not set, and vice
~ $a Not
versa.
Shift Shift the bits of $a $b steps to the left
$a << $b
left (each step means "multiply by two")
<?php
echo 12 ^ 9; // Outputs '5'
echo "12"^"9"; // Outputs the Backspace character (ascii 8)
// ('1' (ascii 49)) ^ ('9' (ascii 57)) = #8
echo "hallo"^"hello"; // Outputs the ascii values #0 #4 #0 #0 #0
// 'a' ^ 'e' = #4
?>
II.2.5. Toán tử so sánh

Example Name Result


$a == $b Equal TRUE if $a is equal to $b.
TRUE if $a is equal to $b, and they are of the same
$a === $b Identical
type. (PHP 4 only)
$a != $b Not equal TRUE if $a is not equal to $b.
$a <> $b Not equal TRUE if $a is not equal to $b.
TRUE if $a is not equal to $b, or they are not of the
$a !== $b Not identical
same type. (PHP 4 only)
$a < $b Less than TRUE if $a is strictly less than $b.
$a > $b Greater than TRUE if $a is strictly greater than $b.
Less than or equal
$a <= $b TRUE if $a is less than or equal to $b.
to
Greater than or
$a >= $b TRUE if $a is greater than or equal to $b.
equal to
II.2.6. Toán tử điều khiển lỗi
 Toán tử điều khiển lỗi (@) dùng để đặt trước các
hàm, biểu thức. Khi đó tất cả các thông báo lỗi trong
hàm, biểu thức đó bị bỏ qua

<?php
$b = @file("a adf a") or
die("Khong the mo file");
?>
II.2.7. Toán tử thực thi

 Toán tử thực thi (``) cho phép bạn gọi các lệnh
trên console, (các thông tin tin này có thể viết
ra output hoặc gán vào các biến)
<?php
$output = `dir c:\\`;
echo "$output";
?>
II.2.8. Toán tử tăng, giảm

<?php
$a = 5;
echo "Should be 5: " . $a++ . "<br />\n";
echo "Should be 6: " . $a . "<br />\n";
$a = 5;
echo "Should be 6: " . ++$a . "<br />\n";
echo "Should be 6: " . $a . "<br />\n";
$a = 5;
echo "Should be 5: " . $a-- . "<br />\n";
echo "Should be 4: " . $a . "<br />\n";
$a = 5;
echo "Should be 4: " . --$a . "<br />\n";
echo "Should be 4: " . $a . "<br />\n";
?>
II.2.9. Các toán tử logic

Example Name Result

$a and $b And TRUE if both $a and $b are TRUE.

$a or $b Or TRUE if either $a or $b is TRUE.

$a xor $b Xor TRUE if either $a or $b is TRUE, but not both.

! $a Not TRUE if $a is not TRUE.

$a && $b And TRUE if both $a and $b are TRUE.

$a || $b Or TRUE if either $a or $b is TRUE.


II.2.10. Toán tử trên string
 Có 2 toán tử trên string ( . và .=)

<?php
$a = "Hello ";
$b = $a . "World!"; // now $b contains "Hello World!"

$a = "Hello ";
$a .= "World!"; // now $a contains "Hello World!“
?>
II.2.11. Toán tử trên mảng

Đối với mảng, chỉ có toán tử +, toán tử này nối 2


mảng với nhau (các phần trùng khóa được lấy ở
toán hạng trái)
<?php
$a = array("a" => "apple", "b" => "banana");
$b = array("a" =>"pear",
"b" => "strawberry",
"c" => "cherry");
$c = $a + $b;
var_dump($c);
?>
II.3. Các cấu trúc điều khiển

II.3.1. Cấu trúc if, else, elseif, endif


II.3.2. Cấu trúc while / do...while
II.3.3. Cấu trúc for / for...each
II.3.4. Sử dụng break, continue trong các vòng
lặp
II.3.5. Cấu trúc switch
II.3.1. Cấu trúc if, else, elseif, endif
<?php <?php if ($a == 5): ?>
if ($a > $b) {
echo "a is bigger than b"; A is equal to 5
$b = $a; <?php endif; ?>
}
if ($a > $b) {
echo "a is bigger than b";
} else {
echo "a is NOT bigger than b";
}
if ($a > $b) {
echo "a is bigger than b";
} elseif ($a == $b) {
echo "a is equal to b";
} else {
echo "a is smaller than b";
}
?>
II.3.2. Cấu trúc while / do...while

<?php $i = 0;
$i = 1; do {
while ($i <= 10) {
print $i++; print $i;
} } while ($i > 0);

$i = 1; ?>
while ($i <= 10):
print $i;
$i++;
endwhile;
II.3.3. Cấu trúc for / for...each

<?php echo "--------------------\n";


echo "--------------------\n"; $i = 1;
for ($i = 1; $i <= 10; $i++) { for (;;) {
print "$i\n"; if ($i > 10)break;
} print "$i\n";
$i++;
echo "--------------------\n"; }
for ($i = 1; ; $i++) {
if ($i > 10) break; echo "--------------------\n";
for ($i = 1; $i <= 10;
print "$i\n"; print "$i\n", $i++);
}
echo "--------------------\n";
for ($i = 1; $i<=20; $i++):
print "$i\n";
endfor
?>
II.3.3. Cấu trúc for / for...each (2)
foreach (array_expression as $value) statement
foreach (array_expression as $key => $value) statement
<?php
$arr = array("one", "two", "three");
reset ($arr);
while (list(, $value) = each ($arr)) {
echo "Value: $value<br>\n";
}
foreach ($arr as $value) {
echo "Value: $value<br>\n";
}
foreach ($arr as $key => $value) {
echo "Key: $key; Value: $value<br>\n";
}
foreach (array(1, 2, 3, 4, 5) as $v) {
print "$v\n";
}
?>
II.3.4. Sử dụng break, continue trong
các vòng lặp

<?php
$arr = array ('one','two','three','four','stop','five');
while (list (, $val) = each ($arr)) {
if ($val == 'stop')
break; // Viết “break 1;” cũng được
echo "$val<br>\n";
}

while (list ($key, $value) = each ($arr)) {


if (!($key % 2)) // Bỏ qua số lẻ
continue;
do_something_odd ($value);
}
?>
II.3.4. Sử dụng break, continue trong
các vòng lặp (2)

$i = 0;
while ($i++ < 5) {
echo "Outer<br>\n";
while (1) {
echo "&nbsp;&nbsp;Middle<br>\n";
while (1) {
echo "&nbsp;&nbsp;Inner<br>\n";
continue 3;
}
echo "This never gets output.<br>\n";
}
echo "Neither does this.<br>\n";
}
?>
II.3.5. Cấu trúc switch
<?php
if ($i == 0) {
print "i equals 0";
} elseif ($i == 1) {
print "i equals 1";
} elseif ($i == 2) {
print "i equals 2";
}
switch ($i) {
case 0:
print "i equals 0";
break;
case 1:
print "i equals 1";
break;
case 2:
print "i equals 2";
break;
}
?>
II.4. Hàm

II.4.1. Hàm tự định nghĩa (user-defined)


II.4.2. Truyền tham số
II.4.3. Giá trị trả về
II.4.4. Biến hàm
II.4.1. Hàm tự định nghĩa (user-defined)

<?php
function foo ($arg_1, $arg_2, ..., $arg_n) {
echo "Example function.\n";
return $retval;
}
?>
<?php
function foo() {
function bar() {
echo "I don't exist until foo() is called.\n";
}
}
// Không thể gọi bar() vì nó chưa được đình nghĩa
foo();
// Bây giờ thì có thể gọi bar()
bar();
?>
II.4.2. Truyền tham số

PHP hỗ trợ truyền tham số vào hàm, truyền tham số dưới dạng
tham chiếu (reference), truyền tham số với giá trị mặc định
<?php
function takes_array($input) {
echo "$input[0] + $input[1] = ", $input[0]+$input[1];
}

function add_some_extra(&$string) {
$string .= 'and something extra.';
}
$str = 'This is a string, ';
add_some_extra($str);
echo $str;// outputs 'This is a string, and something extra.
?>
II.4.2. Truyền tham số (2)
function makecoffee ($type = "cappuccino") {
return "Making a cup of $type.\n";
}
echo makecoffee ();
echo makecoffee ("espresso");
function makeyogurt ($type = "acidophilus", $flavour) {
return "Making a bowl of $type $flavour.\n";
}

// won't work as expected


echo makeyogurt ("raspberry");
function makeyogurt ($flavour, $type = "acidophilus") {
return "Making a bowl of $type $flavour.\n";
}
// works as expected
echo makeyogurt ("raspberry");
II.4.2. Truyền tham số (3)

Bạn có thể truyền tham số với số lượng không xác định. Khi đó sẽ sử
dụng các hàm sau
func_num_args(): Số lượng tham số
func_get_args(): Lấy danh sách các tham số

<?php
function mwrite() {
$arg = func_get_args();
foreach($arg as $value) echo "$value\n";
}
mwrite("Khoa CNTT", "Truong DHXD", "Lop 46PM1");
?>
II.4.3. Giá trị trả về

Để trả về giá trị của hàm, sử dụng lệnh return. Có thể sử dụng bất
cứ kiểu nào trong giá trị trả về của hàm (kể cả mảng và đối tượng)
<?php
function square ($num) {
return $num * $num;
}
echo square (4); // outputs '16'.
function small_numbers() {
return array (0, 1, 2);
}
list ($zero, $one, $two) = small_numbers();
function &returns_reference() {
return $someref;
}
$newref =& returns_reference();
?>
II.4.4. Biến hàm
Bạn có thể sử dụng các biến hàm (tức là bạn có thể gọi hàm dưới dạng
ten_bien() ).
Biến hàm thường được sử dụng cho các hàm callback
<?php
function foo() {
echo "In foo()<br>\n";
}
function bar($arg = '') {
echo "In bar(); argument was '$arg'.<br>\n";
}
// This is a wrapper function around echo
function echoit($string) {
echo $string;
}
$func = 'foo';
$func(); // This calls foo()
$func = 'bar';
$func('test'); // This calls bar()
$func = 'echoit';
$func('test'); // This calls echoit()
?>
II.4.4. Biến hàm (2)

<?php
class Foo {
function Var() {
$name = 'Bar';
$this->$name(); // This calls the Bar() method
}
function Bar() {
echo "This is Bar";
}
}

$foo = new Foo();


$funcname = "Var";
$foo->$funcname(); // This calls $foo->Var()
?>
II.5. Lớp & đối tượng

II.5.1. Serializing đối tượng – đối tượng trong session


II.5.2. Tham chiếu bên trong constructor
II.5.3. So sánh đối tượng trong PHP4
II.5.4. So sánh đối tượng trong PHP5
II.5.1. Serializing đối tượng – đối
tượng trong session

Hàm serialize() dùng để lưu trữ đối tượng, hàm trả về một chuỗi các byte để lưu
thông tin của đối tượng
Hàm unserialize() dùng để khôi phục đối tượng được lưu giữ bởi hàm serialize()
<?php
class AClass {
var $a;
function AClass() {
}
};
$ob1 = new AClass();
$ob1->a = 10;
$ob1->b = 100;
$ob1->c = "Nguyen Phu Quang";

$luu = serialize($ob1);
echo "$luu\n";
$ob2 = unserialize($luu);
var_dump($ob2);
?>
II.5.2. Tham chiếu bên trong constructor

<?php
class AClass {
var $m_name;
function AClass($name) { $a = new AClass("a");
global $global_ref; $b =& new AClass("b");
$global_ref[] = &$this; $a->setName("quang1");
$this->setName($name); $global_ref[0]->echoName();
} $b->setName("quang2");
function setName($name) {
$global_ref[1]->echoName();
$this->m_name = $name;
} ?>
function echoName() {
echo "$this->m_name\n";
}
};
II.5.3. So sánh đối tượng trong PHP4
Trong PHP4, phép so sánh các đối tượng thực hiện theo quy tắc đơn giản
sau: Hai đối tượng là bằng nhau nếu chúng có các thuộc tính bằng nhau và
cùng thuộc 1 lớp. Quy tắc so sánh này cùng được áp dụng với phép ===

<?php $a = new AClass();


class AClass { $b = new BClass();
var $m_flag; $a->m_flag = true;
}; $b->turnOn();
$c = new BClass();
class BClass extends AClass { $c->turnOn();
function turnOn() {
$this->m_flag = true;
} var_dump($b==$c);
}; var_dump($a==$b);
?>
II.5.3. So sánh đối tượng trong PHP4
<?php
class AClass {
var $set;

function addFlag($key, $value) {


$this->set[$key] = $value;
}
function removeFlag($key) {
unset($this->set[$key]);
}
};
$a = $b = new AClass();
$a->addFlag("quang", 1);
$a->addFlag("quang2", 2);
$b->addFlag("quang", 1);
$b->addFlag("quang2", 2);
var_dump($a==$b);
$b->removeFlag("quang");
var_dump($a==$b);
?>
II.5.4. So sánh đối tượng trong PHP5

 So sánh đối tượng trong PHP5 có một số


thay đổi so với PHP4
 Đối với phép so sánh ==, hai đối tượng bằng
nhau nếu có chung các thuộc tính và cùng
thuộc 1 lớp
 Đối với phép so sánh ===, hai đối tượng
được gọi là bằng nhau nếu chúng cùng tham
chiếu đến 1 phiên bản của 1 lớp
II.6. Tham chiếu (reference)

II.6.1. Các trường hợp sử dụng tham chiếu


II.6.2. Các trường hợp ko sử dụng tham chiếu
II.6.3. Truyền tham chiếu
II.6.4. Trả về tham chiếu
II.6.5. Unset tham chiếu
II.6.1. Các trường hợp sử dụng tham
chiếu

 Tham chiếu cho phép bạn sử dụng 1 biến với nhiều tên khác nhau
 Đối với đối tượng, nên sử dụng phép gán tham chiếu khi dùng toán tử new để tránh phép
gán tạo ra thêm 1 phiên bản của đối tượng
 Để thay đổi giá trị của tham số truyền vào trong hàm, bạn có thể sử dụng tham chiếu
 <?php
$a = &$b;
$b = 100;
var_dump($a);
class AClass {};
$c = new AClass();
$d =& new AClass();
function increment(&$num) {
$num++;
}
$a = 10;
increment($a);
var_dump($a);
?>
II.6.2. Các trường hợp ko sử dụng
tham chiếu

 Tham chiếu gần giống con trỏ nhưng bản chất không phải là
con trỏ
 Trong trường hợp tại ví dụ dưới đây, $var trong hàm foo đầu
tiên được tham chiếu đến biến $var (global). Tuy nhiên sau đó
$var lại được tham chiếu điến biến $quang (global)
 <?php
function foo(&$var)
{
$var =& $GLOBALS["quang"];
var_dump($var);
}
$quang = "Nguyen Phu Quang";
$var = 100;
foo($var);
var_dump($var);
?>
II.6.3. Truyền tham chiếu
 Bạn có thể truyền các dạng tham chiếu sau:
– Biến foo($a)
– Lệnh new foo(new AClass());
– Tham chiếu trả về từ hàm
<?php
function foo(&$num) {
$num++;
}
function &bar() {
global $a;
return $a;
}
$a=10;
foo($a); var_dump($a);
foo(bar()); var_dump($a);
foo($a = 5); var_dump($a);
foo(5);
?>
II.6.4. Trả về tham chiếu
 Hàm có thể trả về tham chiếu, khi đó bạn đặt toán tử tham chiếu
đứng trước tên hàm
 Nếu hàm trả về tham chiếu, để nhân được tham chiếu bạn phải
dùng toán tử gán với tham chiếu đến hàm (xem ví dụ)
 <?php
function &bar() {
global $a;
return $a;
}
$a = 10;
$c = bar();
$c++;
var_dump($a);
var_dump($c);
$b =& bar();
$b++;
var_dump($a);
var_dump($b);
?>
II.6.5. Unset tham chiếu
 Bạn có thể sử dụng lệnh unset() để loại bỏ một biến khỏi bộ
nhớ
 Nếu unset được sử dụng với 1 biến tham chiếu, PHP sẽ kiểm
tra xem còn biến nào cùng tham chiếu đến vùng nhớ hay
không rồi mới loại bỏ biến khỏi bộ nhớ
 <?php
$a = &$b;
$b = 100;
unset($a);
var_dump($a);
var_dump($b);
unset($b);
var_dump($a);
var_dump($b);
?>
III. Làm việc với Form

III.1. Các biến SuperGlobal


III.2. Biến $_SERVER
III.3. Lấy thông tin từ form
III.4. Kết hợp mã HTML và PHP trong 1 trang
III.5. Sử dụng Hidden field để lưu trạng thái
III.6. Redirect
III.7. Form Upload file
III.1. Các biến SuperGlobal
 Các biến global là các biến được khai báo ở mức ngoài cùng của PHP được sử
dụng chung cho mọi module
 Các biến SuperGlobal là các biến (mảng) được PHP tạo ra để lưu các thông tin cần
thiết

Array Description
$_COOKIE Contains keys and values set as browser cookies
$_ENV Contains keys and values set by the script's shell context
$_FILES Contains information about uploaded files
$_GET Contains keys and values submitted to the script using the HTTP get method
$_POST Contains keys and values submitted to the script using the HTTP post
method
$_REQUEST A combined array containing values from the $_GET, $_POST, and $_COOKIES
superglobal arrays
$_SERVER Variables made available by the server
$GLOBALS Contains all global variables associated with the current script
III.2. Biến $_SERVER
Variable Contains Example
$_SERVER['PHP_SELF'] The current script. /phpbook/source/listing10.1.php
Suitable for use in
links and form element
action arguments.
$_SERVER['HTTP_USER_AGENT'] The name and version Mozilla/4.6 –(X11; I;Linux2.2. 6-
of the client. 15apmac ppc)
$_SERVER['REMOTE_ADDR'] The IP address of the 158.152.55.35
client.
$_SERVER['REQUEST_METHOD'] Whether the request POST
was GET or POST.
$_SERVER['QUERY_STRING'] For GET requests, the name=matt&address=unknown
encoded data sent
appended to the URL.
$_SERVER['REQUEST_URL'] The full address of the /phpbook/source/listing10.1.php?
request, including name=matt
query string.
$_SERVER['HTTP_REFERER'] The address of the http://p24.corrosive
page from which the
request was made.
III.2. Biến $_SERVER (2)

Đoạn lệnh sau liệt kê tất cả các thông tin của biến
$_SERVER

<?php
foreach ($_SERVER as $key=>$value) {
echo "[$key]=$value\n";
}
?>
III.3. Lấy thông tin từ form

III.3.1. Lấy thông tin từ form bằng các mảng


superglobal
III.3.2. Import thông tin của form vào các biến
global
III.3.3. Lấy thông tin của form bằng mảng do
người dùng định nghĩa
III.3.1. Lấy thông tin từ form bằng các
mảng superglobal

Dữ liệu từ form được submit lên server thông qua các phương thức: get,
post
Để lấy được thông tin từ form, bạn có thể sử dụng các mảng superglobal
tương ứng $_POST[tên_control], $_GET[tên_control],
$_REQUEST[tên_control] (REQUEST có thể sử dụng cho cả POST và GET)
<?php
var_dump($_POST["Submit"]);
var_dump($_GET["Submit"]);
var_dump($_REQUEST["Submit"]);
if ($_POST["Submit"]=="Submit") {
echo $_POST["UserInput1"];
}
?>
<FORM method="POST" name="myForm">
<INPUT TYPE="TEXT" name="UserInput1">
<INPUT TYPE="SUBMIT" value="Submit" name="Submit"></FORM>
III.3.2. Import thông tin của form vào
các biến global
Để thuận tiện cho người lập trình, PHP cung cấp hàm
import_request_variables() cho phép đưa các tham số GET, POST và
COOKIE vào thành các biến global
Cú pháp
bool import_request_variables(string types, [string prefix])
types: Chỉ ra loại thông tin nào được import, có thể kết hợp giữa các giá trị
g, p, c (get, post, cookie)
prefix: tiền tố cho tên biến
<?php
import_request_variables("gpc", "ui_");
echo "$ui_Submit\n";
if ($ui_Submit=="Submit") {
echo "$ui_UserInput1\n";
}
?>
<FORM method="POST" name="myForm"><INPUT TYPE="TEXT"
name="UserInput1">
<INPUT TYPE="SUBMIT" value="Submit" name="Submit"></FORM>
III.3.3. Lấy thông tin của form bằng
mảng do người dùng định nghĩa

 Những cách lấy thông tin từ form đã nêu trên cho


phép chúng ta làm việc tốt với các control đơn
(có 1 giá trị)
 Đối với các control có nhiều giá trị như select hay
checkbox, nảy sinh vấn đề là làm sao nhận được
tất cả các control được lựa chọn
 Để giải quyết vấn đề này, đặt tên các control với
kết thúc là dấu ngoặc vuông [], khi đó dữ liệu
truyền từ form đến server sẽ là mảng
III.3.3. Lấy thông tin của form bằng
mảng do người dùng định nghĩa

<?php
var_dump($_REQUEST["product"]);
?>
<FORM method="POST" name="AForm">
<INPUT TYPE="CHECKBOX" name="product[]“
value="Sony Ericson">Sony Ericson<br>
<INPUT TYPE="CHECKBOX" name="product[]“
value="Motorola">Motorola<br>
<INPUT TYPE="CHECKBOX" name="product[]“
value="Samsung">Samsung<br>
<INPUT TYPE="CHECKBOX" name="product[]“
value="Hang tau">Hang tau<br>
<INPUT TYPE="SUBMIT" name="Submit“
value="Submit"><br>
</FORM>
III.4. Kết hợp mã HTML và PHP trong 1
trang

 Đối với các trang PHP nhỏ, bạn thường muốn kết
hợp form gửi thông tin với các đoạn script PHP
xử lý thông tin. Điều này có thể dễ dàng thực
hiện bằng cách để các kết hợp các cấu trúc điều
khiển rẽ nhánh với các đoạn mã HTML.
 Để đặt đoạn mã HTML vào trong cấu trúc rẽ
nhánh, sử dụng kết hợp các khối lệnh PHP (xem
ví dụ)
III.4. Kết hợp mã HTML và PHP trong 1
trang (2)
<?php
if ( is_array($_REQUEST["product"]) &&
!array_search("Motorola", $_REQUEST["product"] )) {
?>
<h1>Cam on ban da su dung san pham Motorola</h1>
<?php
} else {
?>
<FORM method="POST" name="AForm">
<INPUT TYPE="CHECKBOX" name="product[]“
value="Sony Ericson">Sony Ericson<br>
<INPUT TYPE="CHECKBOX" name="product[]“
value="Motorola">Motorola<br>
<INPUT TYPE="CHECKBOX" name="product[]“
value="Samsung">Samsung<br>
<INPUT TYPE="CHECKBOX" name="product[]“
value="Hang tau">Hang tau<br>
<INPUT TYPE="SUBMIT" name="Submit" value="Submit"><br>
</FORM>
<?php
}
?>
III.5. Sử dụng Hidden field để lưu trạng
thái

Để lưu thông tin chung của các form giữa các lần submit (ví dụ: Số lần
submit), cách đơn giản nhất là sử dụng trường ẩn (hidden field) trong form

<?php
$g_nSubmit = $_REQUEST["nSubmit"];
if ($g_nSubmit==null) $g_nSubmit=0; else $g_nSubmit++;
if ($g_nSubmit>3) echo "Submit gi ma nhieu the?<br>";
echo "$g_nSubmit<br>";
?>
<FORM method="POST" name="AForm">
<input type="hidden" name="nSubmit" value="<?echo
$g_nSubmit;?>">
<INPUT TYPE="SUBMIT" name="Submit" value="Submit"><br>
</FORM>
III.6. Redirect
 Rõ ràng là việc hardcode HTML cùng với sử dụng nhiều khối
PHP xen lẫn HTML là không tốt. Một cách đơn giản và hiệu
quả hơn là sử dụng Redirect để dẫn hướng người dùng đến
các trang thích hợp (ví dụ: Trang đăng nhập nếu người dùng
chưa đăng nhập, trang chúc mừng nếu người dùng đăng nhập
thành công)
 Để làm được việc này, trước hết ta tìm hiểu cơ chế làm việc
giữa PHP script và client. Đầu tiên, để giao tiếp với client, PHP
tự động gửi các thông tin header cho client. Tuy nhiên, bạn vẫn
có thể tự gửi header.
 Để dẫn hướng client đến trang khác, bạn chỉ cần đơn giản đổi
header bằng hàm header(). Để sử dụng hàm header() bạn phải
đảm bảo rằng cho có dữ liệu nào đã được gửi cho client (sử
dụng hàm header_sent() để kiểm tra)
III.6. Redirect (2)

<?php
$g_nSubmit = $_REQUEST["nSubmit"];
if ($g_nSubmit==null) $g_nSubmit=0; else $g_nSubmit++;
if ($g_nSubmit>5) {
header("Location:ham.html");
exit;
} else
if ($g_nSubmit>3) echo "Submit gi ma nhieu the?<br>";
echo "$g_nSubmit<br>";
?>
<FORM method="POST" name="AForm">
<input type="hidden" name="nSubmit" value="<?
=$g_nSubmit;?>">
<input type=“submit" name="Submit" value="Submit"><br>
</FORM>
III.7. Form Upload file

Người dùng có thể gửi các file (upload) lên server là một chức năng không thể
thiếu đối với các ứng dụng Web-based
Để form có thể upload file, bạn phải xác định form enctype:
ENCTYPE="multipart/form-data”
Với PHP, bạn có thể xác định kích thước lớn nhất của file upload bằng cách
đặt thêm 1 hidden field có tên MAX_FILE_SIZE trước control file

<form enctype="multipart/form-data"
action="<?=$_SERVER['PHP_SELF']?>" method="post">
<p>
<input type="hidden" name="MAX_FILE_SIZE" value="102400"/>
<input type="file" name="fupload" /><br/>
<input type="submit" value="upload!" />
</p>
</form>
III.7. Form Upload file (2)

 Mảng $_FILE

Element Contains Example


$ FILES['fupload']['name'] Name of uploaded file test.gif

$_FILES['fupload']['tmp_name'] Path to temporary file /tmp/phprDfZvN

$_FILES['fupload']['size'] Size (in bytes) of uploaded 6835


file
$_FILES['fupload']['error'] An error code UPLOAD_ERR_FOR
corresponding to a PHP M_SIZE
constant
$_FILES['fupload']['type'] MIME type of uploaded file image/gif
(where given by client)
Valu
Constant Name e Explanation
UPLOAD_ERR_OK 0 No problem

UPLOAD_ERR_INI_SIZE 1 File size exceeds php.ini limit set in


upload_max_filesize
UPLOAD_ERR_FORM_SIZE 2 File size exceeds limit set in hidden
element named MAX_FILE_SIZE

UPLOAD_ERR_PARTIAL 3 File only partially uploaded

UPLOAD_ERR_NO_FILE 4 File was not uploaded


III.7. Form Upload file (3)
 <?php
if ($_REQUEST["submit"]=="upload!") {
echo $_FILES["fupload"]["error"], "\n";
echo $_FILES["fupload"]["size"], "\n";
echo $_FILES["fupload"]["name"], "\n";
echo $_FILES["fupload"]["tmp_name"], "\n";
if ($_FILES["fupload"]["error"]==0) {
$source = $_FILES["fupload"]["tmp_name"];
$dest = $_FILES["fupload"]["name"];
move_uploaded_file($source, $dest);
}
}
?>
<form enctype="multipart/form-data" method="post">
<p>
<input type="hidden" name="MAX_FILE_SIZE" value="102400" />
<input type="file" name="fupload" /><br/>
<input type="submit" value="upload!" name="submit" />
</p>
</form>
IV. Làm việc với file

IV.1. Sử dụng include()


IV.2. Sử dụng include_once() và include_path
cho các dự án lớn
IV.3. Kiểm tra file
IV.4. Đọc, ghi file
IV.5. Làm việc với thư mục
IV.1. Sử dụng include()
 Lệnh include() cho phép bạn phối hợp giữa các file trong một
PHP project, ko giống như cú pháp #include của ngôn ngữ C,
lệnh này không chèn mã lệnh vào file mà thực thi file php giống
như cú pháp gọi hàm
 include() sử dụng để chia sẻ các hàm dùng chung, các đoạn
mã chung trong một project có nhiều file
 Nếu không tìm thấy file, include() thông báo warning nhưng
không dừng chương trình
 PHP cung cấp 1 lệnh tương tự include() là require(), lệnh này
có sự khác biệt là sẽ dừng ngay chương trình khi không tìm
thấy file
IV.1. Sử dụng include() (2)
 <!--File1.php->
<?php
echo "This is from file 1\n";
?>
 <!--File2.php ->
<?php
echo "This is from file 2\n";
include("file1.php");
include("file3.php");
echo "This is from file 2\n";
?>
IV.1. Sử dụng include() (3)
 Vì include() thực hiện lời gọi đến file php, do đó bạn có thể trả
về giá trị từ file PHP được include
 <!--File11.php-->
<?php
return 4 + 4;
?>
 <!--File12.php-->
<?php
echo "This is from file 12\n";
$retVal = include("file11.php");
echo "Return value from file 11: \$retVal=
$retVal\n";
echo "This is from file 12\n";
?>
IV.1. Sử dụng include() (4)
 Bạn có thể đặt lệnh include bên trong 1 cấu trúc điều kiện hoặc
cấu trúc lặp, khi đó tùy theo điều kiện của cấu trúc mà include()
có được thực hiện hay không, 1 hay nhiều lần
 <!--File22.php-->
<?php
if ($j==null) $j=10; else $j++;
return $i+$j;
?>
 <!--File21.php-->
<?php
for ($i=0; $i<10; $i++) {
echo include("File22.php"), "\n";
}
?>
IV.2. Sử dụng include_once() và
include_path cho các dự án lớn

 include_once() giống như include(), tuy nhiên có điểm khác biệt là


chỉ include 1 lần, lần sau nếu gặp lại file này thì ko include nữa
 include_once() sử dụng cho các hàm thư viện dùng chung để
tránh trường hợp khi nhiều file cùng include đến 1 file, sau đó các
file này lại include lẫn nhau (so sánh với #ifdefine trong file header
của ngôn ngữ C)
 include_once() phân biệt chữ hoa, chữ thường
 <?php
include_once("a.php"); // this will include a.php
include_once("A.php"); // this will include a.php
again on Windows!
?>
IV.2. Sử dụng include_once() và
include_path cho các dự án lớn (2)

 Trong quá trình làm việc, bạn hẳn có nhiều hàm được
dùng chung giữa nhiều file trong 1 project, giữa nhiều
project. Để sử dụng các hàm này, bạn có thể áp dụng
các cách sau:
– include file theo đường dẫn tuyệt đối: Cách này dở vì khi cài
đặt trên máy khác sẽ không tìm thấy file được include
– include file theo đường dẫn tương đối: Cách này tốt hơn,
nhưng mỗi khi đổi vị trí của file được include thì phải sửa lại
tại tất cả các file thực hiện lời gọi include
– Cách tốt nhất là sử dụng include_path (thiết lập trong file
PHP.INI) đối với những file thư viện dùng chung được sử
dụng nhiều (giống như đối với ngôn ngữ C)
IV.2. Sử dụng include_once() và
include_path cho các dự án lớn (3)

 Để thiết lập include_path, bạn có những cách sau:


– thay đổi include_path trong PHP.INI
– dùng lệnh set_include_path()
 <?php
var_dump(get_include_path());
set_include_path('/inc'); // Works as of PHP 4.3.0
var_dump(get_include_path());
restore_include_path();
var_dump(get_include_path());
?>
– dùng lệnh ini_set()
 <?php
var_dump(ini_get("include_path"));
ini_set("include_path", "/inc"); // Works in all PHP versions
var_dump(ini_get("include_path"));
ini_restore("include_path");
var_dump(ini_get("include_path"));
?>
IV.3. Kiểm tra file
 file_exist(), is_file(), is_dir(), is_readable(), is_writeable(), is_executable(), filesize(), fileatime()
 <?php
function outputFileTestInfo( $file ) {
if ( ! file_exists( $file ) ) {
print "$file does not exist<br/>";
return;
}
print "$file is ".(is_file( $file )?"":"not ")."a file<br/>\n";
print "$file is ".(is_dir( $file )?"":"not ")."a directory<br/>\n";
print "$file is ".(is_readable( $file )?"":"not ")."readable<br/>\n";
print "$file is ".(is_writable( $file )?"":"not ")."writable<br/>\n";
print "$file is ".( filesize($file))." bytes<br/>\n";
print "$file was accessed on "
.date( "D d M Y g:i A", fileatime( $file ) )."<br/>\n";
print "$file was modified on "
.date( "D d M Y g:i A", filemtime( $file ) )."<br/>\n";
print "$file was changed on"
.date( "D d M Y g:i A", filectime( $file ) )."<br/>\n";
}
outputFileTestInfo("c:\\windows\\system32\\cmd.exe");
?>
IV.4. Đọc, ghi file
 fopen($filename, $mode);

fwrite($handle, $string);
fread($handle, $length);
fgets($handle);

sprintf($format);
fscanf($handle, $format);

fseek($handle, $offset);
fclose($handle);

file_get_contents($filename);
IV.4. Đọc, ghi file (2)
<?php
$var1 = 10;
$var2 = "This is a String";
$var3 = true;
$f = fopen("test.txt", "wt");
fwrite($f, "$var1 $var2 $var3\n");
fwrite($f, "$var1\n$var2\n$var3\n");
fclose($f);

echo "Read line by line......\n";


$f = fopen("test.txt", "rt");
while (!feof($f)) {
$line = fgets($f); echo "Read all file by fread......\n";
echo "$line"; $f = fopen("test.txt", "rb");
} $myfile = fread($f, filesize("test.txt"));
fclose($f);
echo $myfile;
fclose($f);

echo "Read all file......\n";


$myfile = file_get_contents("test.txt");
echo($myfile);
?>
IV.4. Đọc, ghi file (3)
 <?php
$var1=10;
$var2=100;
$var3=100.3434;
$var4="Test string";
$f=fopen("test.txt", "wt");
fwrite($f, sprintf("%d %10.3f %10.3lf\n\r", $var1, $var2, $var3));
fwrite($f, sprintf("%s", $var4));
fclose($f);
$f=fopen("test.txt", "rt");
if (list($v1, $v2, $v3, $v4) = fscanf($f, "%d %f %lf\n\r%s")) {
var_dump($v1);
var_dump($v2);
var_dump($v3);
var_dump($v4);
}
$v4 = fgets($f);
var_dump($v4);
fclose($f);
?>
IV.4. Đọc, ghi file (4)
 <?php
class AClass {
};
$ob1 =& new AClass();
$ob1->a = 10;
$ob1->b = 100.023;
$ob1->c = "Test String";
var_dump($ob1);
$f = fopen("test.txt", "wb");
fwrite($f, serialize($ob1));
fclose($f);
$f = fopen("test.txt", "rb");
$ob2 = unserialize(fgets($f));
fclose($f);
var_dump($ob2);
?>
IV.5. Làm việc với thư mục

 mkdir(), rmdir(), opendir(), readdir(), closedir()


 <?php
$dir=opendir("c:\\windows");
while ($file=readdir($dir)) {
echo "$file\n";
}
closedir($dir);
?>
V. PHP & CSDL

V.1. Sử dụng PHP để kết nối với CSDL


V.2. PEAR DB
V.3. Các chức năng nâng cao với PEAR DB
V.1. Sử dụng PHP để kết nối với
CSDL

 Có 2 cách kết nối PHP với CSDL


– Sử dụng các hàm riêng cho từng loại CSDL
 Ưu điểm: Tốc độ cao do được thiết kế cho từng CSDL cụ
thể. Tận dụng được ưu điểm của từng loại CSDL
 Nhược điểm: Không có tính khả chuyển giữa các CSDL
– Sử dụng các hàm độc lập CSDL (thư viện PEAR
DB)
 Ưu điểm: Có thể sử dụng trên nhiều CSDL khác nhau
 Nhược điểm: Chậm hơn phương pháp trên, không tận
dụng được ưu điểm của từng CSDL.
V.1. Sử dụng PHP để kết nối với CSDL
(2)

 Cài đặt thư viện PEAR


– Yêu cầu: PHP phiên bản 5.0
– Cài đặt PHP
– Chạy go-pear.bat
– Theo các hướng dẫn trong chương trình (các tham số chỉ cần đặt mặc
định)
 Nếu không cài đặt PEAR, mà copy từ máy khác, phải thêm vào
C:/Windows/PHP.INI 2 dòng như ở dưới
 Cấu hình Zend Studio để làm việc với PEAR DB
– Thêm vào file $Zend_dir/bin/php5/php.ini 2 dòng
 include_path=".;C:/php/pear"
 extension_dir="c:/php/ext"
– Copy file libMySQL.dll vào $Windows/$System (nếu bạn sử dụng IIS)
Các bước cài đă ̣t kiểu mì ăn liền
 Cài IIS, cài Mysql 5.0, cài PHP
 Copy $\Mysql\bin\libMysql.dll đến
c:\windows\system32
 Copy PHP.rar đè lên thư mục c:/PHP
 Sửa nội dung c:\windows\system32\PHP.INI, thêm
vào các dòng sau (để ở cuối file)
include_path=".;C:/php/pear"
extension_dir=" c:/php/ext"
extension=php_mysql.dll
 Sau đó, có thể chạy được trên local host (trên Zend
thì phải config thêm, tốt nhất là đừng config)
V.2. PEAR DB
<?php
require("DB.php");
$dsn = "mysql://root:root@localhost/dhxd";
$db = DB::connect($dsn);
if (DB::isError($db)) die($db->getMessage());
$table = $db->query("SELECT * FROM SV");
if (DB::isError($table)) die($table->getMessage());
echo "<table border='1'>";
while ($row = $table->fetchRow()) {
echo "<tr>
<td>$row[0]</td>
<td>$row[1]</td>
<td>$row[2]</td>
<td>$row[3]</td>
</tr>";
}
echo "</table>";
?>
V.2. PEAR DB (2)

V.2.1. Data source name


V.2.2. Kết nối với cơ sở dữ liệu
V.2.3. Kiểm tra lỗi
V.2.4. Thực thi query
V.2.5. Lấy kết quả từ query
V.2.6. Giải phóng bộ nhớ
V.2.1. Data source name
 dsn=Data Source Name Type Database
 type://username:password@protocol+host Mysql MySQL
spec/database
Pgsql PostgreSQL
 Ví dụ:
– mysql:///webdb mysql://localhost/webdb Ibase InterBase
mysql://bondview@localhost/webdb Msql Mini SQL
mysql://bondview@tcp+localhost/webdb
mysql://bondview:007@localhost/webdb Mssql Microsoft SQL Server
oci8 Oracle 7/8/8i
Odbc ODBC
Sybase SyBase
Ifx Informix
Fbsql FrontBase
V.2.2. Kết nối với cơ sở dữ liệu

 Khi đã có DSN, bạn có thể kết nối bằng hàm


DB::connect với cú pháp sau:
– $db = DB::connect(DSN [, options ]);
– options có thể là 1 giá trị Boolean hoặc 1 mảng
 $db = DB::connect($dsn, array('debug' => 1,
'optimize' => 'portability'));
V.2.3. Kiểm tra lỗi
 Các phương thức của DB trả về DB_ERROR nếu có lỗi trong
quá trình thực hiện
 Bạn có thể kiểm tra 1 kết quả trả về có phải là lỗi không bằng
hàm DB::isError();
 Nếu DB::isError() trả về true, kết quả trả về của bạn là lỗi, có
thể xem thông báo lỗi bằng phương thức $tenbien-
>getMessage()
 $db = DB::connect($datasource);
if (DB::isError($db)) {
die($db->getMessage( ));
}
V.2.4. Thực thi query
 Để thực thi query, sử dụng phương thức query() của Database
Object (đối tượng trả về khi bạn kết nối thành công với CSDL
bằng hàm DB::connect() );
 $db = DB::connect($datasource);
$result = $db->query(sql);
 Cũng tương tự như DB::connect(), bạn có thể kiểm tra lỗi bằng
DB::isError()
 if (DB::iserror($result)) {
die($result->getMessage());
}
V.2.5. Lấy kết quả từ query
 $row = $result->fetchRow([ mode ]);
 Hàm fetchRow() trả về mảng các giá trị trên dòng hoặc
DB_ERROR (nếu có lỗi)
 <?php
$db = DB::connect($datasource);
$result = $db->query(sql);
while ($row = $result->fetchRow( )) {
if (DB::isError($row)) {
die($row->getMessage( ));
}
// do something with the row
}
?>
V.2.5. Lấy kết quả từ query (2)

 $row = $result->fetchRow([ mode ]);


 mode:
– DB_FETCHMODE_ORDERED: Các cột được liệt
kê trên $row theo thứ tự 0,1,2...
– DB_FETCHMODE_ASSOC : Các cột được liệt kê
với khóa là tên của các cột
– DB_FETCHMODE_OBJECT: Các cột được liệt
kê thành các trường của đối tượng
V.2.5. Lấy kết quả từ query (3)

<?php
require("DB.php");
$db = DB::connect("mysql://root:root@localhost/dhxd");
$table = $db->query("select * from sv");
$row = $table->fetchRow();
var_dump($row);
$row = $table->fetchRow(DB_FETCHMODE_ASSOC);
var_dump($row);
$row = $table->fetchRow(DB_FETCHMODE_OBJECT);
var_dump($row);
echo "Hoten: {$row->hodem} {$row->ten}, Ngay sinh:
{$row->ngaysinh}";
?>
V.2.6. Giải phóng bộ nhớ
 <?php
require("DB.php");
$db = DB::connect("mysql://root:root@localhost/dhxd");
$table = $db->query("select * from sv");
$row = $table->fetchRow();
unset($row);
$table->free();
$db->disconnect();
?>
V.3. Các chức năng nâng cao với
PEAR DB

V.3.1. Query template


V.3.2. Prepare/Execute
V.3.3. Các hàm tiện ích
V.3.4. Các thông tin trả về từ query()
V.3.5. Metadata
V.3.1. Query template
 Để xây dựng các query, nếu dùng phép nối xâu kí tự rất dễ gây
nhầm lẫn do không nhìn thấy tổng thể của câu lệnh SQL (nhất là với
các trường hợp có sử dụng dấu nháy)
 Trong trường hợp này, PHP cung cấp 1 công cụ hoạt động cho
phép truyền tham số trong câu lệnh SQL giống như lệnh printf,
trong đó sử dụng các ký hiệu
– ?: Cho số hoặc string (dấu nháy sẽ được bổ sung khi cần thiết)
– |: Cho số hoặc string (không sử dụng dấu nháy)
– &: Tên file (dùng cho các trường BLOB)
 <?php
require("DB.php");
$db = DB::connect("mysql://root:root@localhost/dhxd");
$row = array("Nguyen Van", "A");
$db->query("INSERT INTO sv (hodem, ten) VALUES(?,?)", $row);
?>
V.3.2. Prepare/Execute
 Khi bạn thực hiện nhiều câu lệnh giống nhau, cách tốt nhất là dịch câu lệnh SQL trước khi
thực hiện bằng phương thức prepare()
 Sau khi dịch SQL, bạn có thể thực hiện câu lệnh SQL bằng cách dùng 2 lệnh sau:
– $response = $db->execute(compiled, values); (values: mảng 1 chiều các giá trị)
– $responses = $db->executeMultiple(compiled, values); (values: mảng 2 chiều các dòng, mỗi dòng là
1 mảng 1 chiều các giá trị)
 <?php
require("DB.php");
$db = DB::connect("mysql://root:root@localhost/dhxd");
$complied = $db->prepare("INSERT INTO sv (hodem, ten)
VALUES(?,?)");
$rows=array( array("Nguyen Van", "A"),
array("Nguyen Van", "B"),
array("Nguyen Van", "C"),
array("Nguyen Van", "D") );
foreach ($rows as $row) {
$db->execute($complied, $row);
}
$db->executeMultiple($complied, $rows);
?>
V.3.3. Các hàm tiện ích
Ngoài các hàm chung, PEAR DB còn cung cấp các hàm cho phép thực hiện
nhanh 1 số chức năng hay được sử dụng: getOne(), getRow(), getCol(),
getAssoc(), getAll()
<?php
require("DB.php");
$db = DB::connect("mysql://root:root@localhost/dhxd");
$result = $db->getRow("SELECT * FROM sv");
var_dump($result);
$result = $db->getOne("SELECT count(*) FROM sv");
var_dump($result);
$result = $db->getCol("SELECT * FROM sv", "ten");
var_dump($result);
$result = $db->getAssoc("SELECT * FROM sv");
var_dump($result);
$result = $db->getAll("SELECT * FROM sv");
var_dump($result);
?>
V.3.4. Các thông tin trả về từ query()

Bạn có thể lấy thông tin về các dòng, cột kết quả trả về từ câu lệnh SQL qua
các hàm numRows(), numCols(), tableInfo(), affectedRows()
<?php
require("DB.php");
$db = DB::connect("mysql://root:root@localhost/dhxd");
$table = $db->query("SELECT * FROM sv");
var_dump($table->numRows());
var_dump($table->numCols());
var_dump($table->tableInfo());
$result = $db->query(
"INSERT INTO sv (hodem, ten) VALUES (?,?)",
array("Nguyen Phu", "Quang"));
var_dump($result);
var_dump($db->affectedRows());
?>
V.3.5. Metadata

Hàm getListOf() sử dụng để lấy thông tin về users, databases, tables, views,
functions (phụ thuộc vào sự hỗ trợ của CSDL mà bạn đang sử dụng)
<?php
require_once("DB.php");
$db = DB::connect("mysql://root:root@localhost/dhxd");
$result = $db->getListOf("users");
var_dump($result);
$result = $db->getListOf("databases");
var_dump($result);
$result = $db->getListOf("tables");
var_dump($result);
?>
V.3.6. Transaction

Nhiều cơ sở dữ liệu hỗ trợ Transaction safe, để sử dụng


transaction safe trong PHP, bạn sử dụng các lệnh commit(),
rollback()

Để có thể rollback(), bạn phải thiết lập autocommit là false

<?php
require_once("DB.php");
$db = DB::connect("mysql://root:root@localhost/dhxd");
$db->autocommit = false;
$result = $db->query("DELETE FROM sv;");
$db->rollback();
$db->autocommit = true;
?>
VI. Tổ chức ứng dụng PHP

VI.2. Hệ thống template


VI.3. Quản lý output
VI.4. Quản lý lỗi
VI.5. Tối ưu hóa
VI.2. Hệ thống template

 Trang Web có giao diện dễ thay đổi là 1 tiêu chí rất


quan trọng
 Nếu kết hợp mã HTML và PHP không tốt thì rất khó cho
người thiết kế giao diện và người lập trình làm việc với
nhau  khả năng thay đổi giao diện khó khăn
 Một phương pháp hiệu quả là sử dụng các file template
(.HTML – được thiết kế từ các chương trình: DW,
FrontPage...). Các file template này thường không chứa
mã PHP mà chỉ có các thông tin dưới dạng quy ước
(thường là các tên gọi, giá trị được đặt theo 1 quy ước
nhất định, các giá trị này sẽ được thay thế khi chạy
chương trình bằng PHP)
VI.2. Hệ thống template (2)
<?php
$templatePath = "./templates/";
function MakeWebPageFromTemplate($templateName, $params)
{
global $templatePath;
$templateName = $templatePath . $templateName;
if ($f = fopen($templateName, "rt")) {
$templateContent = fread($f, filesize($templateName));
fclose($f);
}
$templateContent = str_replace(
"\"./", "\"" . $templatePath, $templateContent);
foreach ($params as $paramName=>$paramVal) {
$templateContent = str_replace(
$paramName, $paramVal, $templateContent);
}
return $templateContent;
}
?>
VI.3. Quản lý output
 Thường thì các hàm ghi thông tin ra browser. Tuy nhiên có nhiều trường hợp chúng
ta không muốn như vậy.
 Bạn có thể sử dụng vùng đệm ra (output buffer) để các lệnh ghi thông tin ghi dữ liệu
lên đó
 Các hàm với output buffer: ob_start(), ob_get_length(), ob_get_contents(),
ob_flush(), ob_end_flush(); ob_end_clean()
 <?php
ob_start();
phpinfo();
$phpinfo = ob_get_contents();
ob_end_clean();
if (strpos($phpinfo, "module_pdf") === FALSE) {
echo "You do not have PDF support in your PHP, sorry.";
} else {
echo "Congratulations, you have PDF support!";
}
?>
VI.4. Quản lý lỗi

VI.4.1. Thông báo lỗi


VI.4.2. Giấu lỗi
VI.4.3. Phát sinh lỗi
VI.4.4. Hàm xử lý lỗi
VI.4.5. Log lỗi
VI.4.1. Thông báo lỗi

 Thông thường, khi có lỗi, thông báo lỗi được in ra


output
 Có 3 mức độ thông báo: notices, warnings, errors
 Mặc định của PHP là các thông báo warning, error
sẽ được in ra browser, bạn có thể thay đổi trong
PHP.INI hoặc trong thời gian chạy bằng hàm
error_reporting() (các tham số E_ERROR |
E_PARSE | E_CORE_ERROR |
E_COMPILE_ERROR | E_USER_ERROR)
VI.4.1. Thông báo lỗi (2)

Value Meaning
E_ERROR Runtime errors
E_WARNING Runtime warnings
E_PARSE Compile-time parse errors
E_NOTICE Runtime notices
E_CORE_ERROR Errors generated internally by PHP
E_CORE_WARNING Warnings generated internally by PHP
E_COMPILE_ERROR Errors generated internally by the Zend scripting engine
E_COMPILE_WARNING Warnings generated internally by the Zend scripting engine
E_USER_ERROR Runtime errors generated by a call to trigger_error( )
E_USER_WARNING Runtime warnings generated by a call to trigger_error( )
E_USER_NOTICE Runtime warnings generated by a call to trigger_error( )
E_ALL All of the above options
VI.4.2. Giấu lỗi
 Sử dụng toán tử @ để ngăn không cho output lỗi ra browser
 Thiết lập track_errors trong php.ini để bắt được các thông báo lỗi qua biến
$php_errormsg
 Để ngăn không cho tất cả các thông báo lỗi trên browser, sử dụng hàm
error_reporting(0)
 <?php
ini_set("track_errors", "1");
$value = 2/0;
$value = @(2/0);
echo "$php_errormsg";
ini_restore("track_errors");
?>
 <?php
error_reporting(0);
ini_set("track_errors", "1");
$value = 2/0;
echo "$php_errormsg";
ini_restore("track_errors");
?>
VI.4.3. Phát sinh lỗi
 Bạn có thể làm phát sinh lỗi người dùng bằng hàm
trigger_error
 trigger_error(message [, type]);
 type: E_USER_ERROR, E_USER_WARNING,
E_USER_NOTICE (default)
 <?php
function divider($a, $b) {
if($b == 0) {
trigger_error('$b cannot be 0', _USER_ERROR);
}
return($a / $b);
}
?>
VI.4.4. Hàm xử lý lỗi
 Giấu tất cả các lỗi không phải là một phương án hay, để quản
lý lỗi tốt hơn, bạn nên dùng hàm xử lý lỗi (error handler)
 Error handler được thiết lập bằng hàm set_error_handler(),
khôi phục lại bằng hàm restore_error_handler()
 <?php
function my_handler($error, $errorstring,
$filename, $line, $symbol)
{
echo "$error|$errorstring|$filename|$line\n";
}
set_error_handler('my_handler');
echo 4/0;
$f = file("linhtinh");
?>
VI.4.5. Log lỗi
VI.5. Tối ưu hóa
VII. Hình ảnh

VII.1. Yêu cầu phần mềm


VII.2. Tạo và vẽ ảnh
VII.3. Vẽ Text
VII.4. Co dãn ảnh
VII.1. Yêu cầu phần mềm

 Với PHP bạn có thể sử dụng các hàm graphic để vẽ


ra các hình ảnh và lưu trữ dưới dạng file (GIF, PNG,
JPG)
 Để thực hiện được chức năng này, bạn cần phải cài
đặt bộ thư viện GD (http://www.boutell.com/gd/ )
 Để biết thư viện GD đã được cài đặt hay chưa, có
thể sử dụng hàm phpinfo() hoặc hàm gd_info()
 Đối với bộ PHP full (v5.0) có đầy đủ thư viện PEAR
đi kèm, để chạy GD bạn chỉ việc thiết lập trong file
php.ini: extension=php_gd2.dll
VII.2. Tạo và vẽ ảnh
 <!-- file: caro.php -->
<?php
$im = imagecreate(30, 30);
$red = imagecolorallocate($im, 0xff, 0x00, 0x00);
$blue = imagecolorallocate($im, 0x00,0x00,0xff);
$black = imagecolorallocate($im, 0x00, 0x00, 0x00);
imagefilledrectangle($im, 0, 0, 29, 29, $black);
imagefilledrectangle($im, 0,0,15,15,$red);
imagefilledrectangle($im, 15,15,29,29,$blue);
imagejpeg($im);
?>
<!-- file: 1.html -->
<html>
Day la caro <img src="caro.php"/>
</html>
 <?php
$im = imagecreate(30, 30);
$red = imagecolorallocate($im, 0xff, 0x00, 0x00);
$blue = imagecolorallocate($im, 0x00,0x00,0xff);
$black = imagecolorallocate($im, 0x00, 0x00, 0x00);
imagefilledrectangle($im, 0, 0, 29, 29, $black);
imagefilledrectangle($im, 0,0,15,15,$red);
imagefilledrectangle($im, 15,15,29,29,$blue);
imagejpeg($im, "c:/test.jpg", 100);
?>
<html>
Day cung la caro: <img src = "c:/test.jpg"/>
</html>
VII.2. Tạo và vẽ ảnh (2)
 Các hàm thường sử dụng
– resource imagecreate ( int x_size, int y_size ): Tạo ảnh
với kích thước x_size * y_size, ảnh ko phải truecolor
– imagecolorallocate ( resource image, int red, int green, int
blue ): Sử dụng để định nghĩa 1 màu sẽ xuất hiện trong
ảnh. Đối với ảnh sử dụng palette, lần gọi đầu tiên sẽ cho
màu là màu nền của ảnh
– resource imagecreatetruecolor ( int x_size, int y_size ):
Tạo ảnh truecolor
– bool imagejpeg ( resource image [, string filename [, int
quality]] )
– bool imagepng ( resource image [, string filename] )
– bool imagegif ( resource image [, string filename] )
VII.2. Tạo và vẽ ảnh (3)
 ImageSetPixel(image, x, y, color);
 ImageLine(image, start_x, start_ y, end_x, end_ y, color);
 ImageDashedLine(image, start_x, start_ y, end_x, end_ y,
color);
 ImageRectangle(image, tlx, tly, brx, bry, color);
 ImageFilledRectangle(image, tlx, tly, brx, bry, color);
 ImagePolygon(image, points, number, color);
 ImageFilledPolygon(image, points, number, color);
 ImageArc(image, center_x, center_ y, width, height, start, end,
color);
 ImageFill(image, x, y, color);
 ImageFillToBorder(image, x, y, border_color, color);
VII.3. Vẽ Text
 <?php
$im = imagecreate(100,100);
$white = imagecolorallocate($im, 0xff, 0xff, 0xff);
$red = imagecolorallocate($im, 0xff, 0x00, 0x00);
imagestring($im, 1, 0, 0, "HUCE", $red);
imagestring($im, 2, 0, 10, "HUCE", $red);
imagestring($im, 3, 0, 20, "HUCE", $red);
imagestring($im, 4, 0, 30, "HUCE", $red);
imagestring($im, 5, 0, 45, "HUCE", $red);
imagestringup($im, 5, 50, 99, "University", $red);
imagegif($im);
?>
VII.3. Vẽ Text (2)

<?php
$im = imagecreate(100,100);
$white = imagecolorallocate($im, 0xff, 0xff, 0xff);
$red = imagecolorallocate($im, 0xff, 0x00, 0x00);
$blue = imagecolorallocate($im, 0x00, 0x00, 0xff);
imagettftext($im, 8, 30, 10, 100, $red,
"Times", "HUCE - 46pm1");
imagettftext($im, 10, -30, 10, 10,$blue,
"Arialni","HUCE- 46pm1");
imagegif($im);
?>
VII.4. Co dãn ảnh

<?php
$im = imagecreate(100,100);
$white = imagecolorallocate($im, 0xff, 0xff, 0xff);
$red = imagecolorallocate($im, 0xff, 0x00, 0x00);
$blue = imagecolorallocate($im, 0x00, 0x00, 0xff);
imagettftext($im, 8, 30, 10, 100, $red, "Times", "HUCE - 46pm1");
imagettftext($im, 10, -30, 10, 10, $blue, "Arialni", "HUCE - 46pm1");
$im2 = imagecreate(200, 200);
//imagecopyresized($im2, $im, 0, 0, 0, 0, 200, 200, 100, 100);
imagecopyresampled($im2, $im, 0, 0, 0, 0, 200, 200, 100, 100);
imagegif($im2);
?>
VII.5. Màu sắc

VII.5.1. True color & color index


VII.5.3. Kênh alpha
VII.5.1. True color & color index
 Ảnh của bạn được tạo bởi các hàm imagecreate() – tạo ảnh sử
dụng colorindex trên palette và imagecreatetruecolor () – tạo
ảnh truecolor (24bit/pixel)
 Từ GD2.0 trở lên, ta có thể làm việc với kênh alpha (xem phần
sau)
 Để lấy màu của điểm ảnh
– $color = ImageColorAt(image, x, y);
– $values = ImageColorsForIndex(image, index);
 Với ảnh truecolor, cấu trúc màu gồm: 7bit alpha, 8bit Red, 8bit
Green, 8bit Blue (từ trái qua phải). Có thể sử dụng công thức
sau
– $a = ($col & 0x7F000000) >> 24;
$r = ($col & 0x00FF0000) >> 16;
$g = ($col & 0x0000FF00) >> 8;
$b = ($col & 0x000000FF);
VII.5.2. Kênh alpha
 Kênh alpha trong GD chỉ gồm 7bit (giá trị từ 0 đến 127)
 Để sử dụng kênh alpha sử dụng các hàm
– ImageColorResolveAlpha()
– ImageAlphaBlending()
 <?php
$im = ImageCreateTrueColor(150,150);
$white = ImageColorAllocate($im,255,255,255);
ImageAlphaBlending($im, true);
ImageFilledRectangle($im,0,0,150,150,$white);
$red = ImageColorResolveAlpha($im,255,50,0,63);
ImageFilledEllipse($im,75,75,80,50,$red);
$gray = ImageColorResolveAlpha($im,70,70,70,63);
ImageAlphaBlending($im, true);
ImageFilledRectangle($im,60,60,120,120,$gray);
header('Content-Type: image/png');
ImagePNG($im);
?>
IX. XML

IX.1. Tạo văn bản XML


IX.2. Đọc XML
IX.1. Tạo văn bản XML

 Cách đơn giản nhất để tạo văn bản XML là


đặt lại header của trang PHP
– header('Content-Type: text/xml');
 Sau đó đưa thông tin ra browser bằng các
hàm echo, print... như bình thường
IX.2. Đọc XML
 <?php
function start_element($inParser, $inName, &$inAttributes)
{
var_dump($inName);
var_dump($inAttributes);
}
function end_element($inParser, $inName) {
var_dump($inName);
}
$xml = xml_parser_create();
xml_set_element_handler($xml, "start_element",
"end_element");
xml_parse($xml, "<xml><row name='row1'
atr='attribute1'/></xml>");
?>
VIII. PDF

VIII.1. Document & Page


VIII.2. Text
VIII.3. Images & Graphics
VIII.4. Nagivations
VIII.5. Các chức năng khác

You might also like