164
PHP (PHP: Hypertext Preprocessing) Người lập: Nguyễn Phú Quảng Bộ môn: Tin học Xây dựng

PHP (PHP: Hypertext Preprocessing)

  • Upload
    meira

  • View
    150

  • Download
    1

Embed Size (px)

DESCRIPTION

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. Làm quen với PHP PHP Căn bản Các tính năng cho ứng dụng Web base Làm việc với Form Các hàm làm việc với MySQL Làm việc với File Các hàm làm việc với hình ảnh - PowerPoint PPT Presentation

Citation preview

Page 1: PHP (PHP: Hypertext Preprocessing)

PHP (PHP: Hypertext Preprocessing)

Người lập: Nguyễn Phú QuảngBộ môn: Tin học Xây dựng

Page 2: PHP (PHP: Hypertext Preprocessing)

Nội dung trình bày

I. Làm quen với PHPII. PHP Căn bảnIII. Các tính năng cho ứng dụng Web base

I. Làm việc với FormII. Các hàm làm việc với MySQLIII. Làm việc với FileIV. Các hàm làm việc với hình ảnhV. Các hàm trên ngày thángVI. Các hàm trên dữ liệuVII. Cookies và QueryStringVIII. SessionIX. Gỡ lỗi

Page 3: PHP (PHP: Hypertext Preprocessing)

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

Page 4: PHP (PHP: Hypertext Preprocessing)

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)

Page 5: PHP (PHP: Hypertext Preprocessing)

I.1. PHP là gì? (2)

Page 6: PHP (PHP: Hypertext Preprocessing)

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

Page 7: PHP (PHP: Hypertext Preprocessing)

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

Page 8: PHP (PHP: Hypertext Preprocessing)

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

Page 9: PHP (PHP: Hypertext Preprocessing)

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ì)

Page 10: PHP (PHP: Hypertext Preprocessing)

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

Page 11: PHP (PHP: Hypertext Preprocessing)

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

Page 12: PHP (PHP: Hypertext Preprocessing)

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

Page 13: PHP (PHP: Hypertext Preprocessing)

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

Page 14: PHP (PHP: Hypertext Preprocessing)

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 /

Page 15: PHP (PHP: Hypertext Preprocessing)

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

Page 16: PHP (PHP: Hypertext Preprocessing)

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 language=“php”>

</script>

Page 17: PHP (PHP: Hypertext Preprocessing)

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>

Page 18: PHP (PHP: Hypertext Preprocessing)

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

Page 19: PHP (PHP: Hypertext Preprocessing)

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)

Page 20: PHP (PHP: Hypertext Preprocessing)

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

Page 21: PHP (PHP: Hypertext Preprocessing)

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ânTên biến không chứa các dấu và ký tự cách

Page 22: PHP (PHP: Hypertext Preprocessing)

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.?>

Page 23: PHP (PHP: Hypertext Preprocessing)

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>");?>

Page 24: PHP (PHP: Hypertext Preprocessing)

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

Page 25: PHP (PHP: Hypertext Preprocessing)

II.1.1.4. Phạm vi của biến (2)

Từ khóa global<?php$a = 1;$b = 2;function Sum() { //a, b trong & ngoai ham Sum global $a, $b; // la giong nhau $b = $a + $b;}Sum();echo $b;?>

Hoặc sử dụng cú pháp<?php$a = 1;$b = 2;function Sum() { $GLOBALS["b"] = $GLOBALS["a"] + $GLOBALS["b"];}Sum();echo $b;?>

Page 26: PHP (PHP: Hypertext Preprocessing)

II.1.1.4. Phạm vi của biến (3)

<?phpfunction Test (){ $a = 0; echo $a; $a++;}Test();

Test(); ?>

<?phpfunction Test (){ static $a = 0; echo $a; $a++;}Test();Test();?>

Page 27: PHP (PHP: Hypertext Preprocessing)

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);?>

Page 28: PHP (PHP: Hypertext Preprocessing)

II.1.2. Kiểu

Các kiểu đơnII.1.2.1. boolean

II.1.2.2. integer

II.1.2.3. float

II.1.2.4. string

Các kiểu phứcII.1.2.5. array

II.1.2.6. object

Các kiểu đặc biệtII.1.2.7. resource

II.1.2.8. NULL

Page 29: PHP (PHP: Hypertext Preprocessing)

II.1.2. Kiểu (2)

<?php$bool = TRUE; // a boolean$str = "foo"; // a string$int = 12; // an integerecho gettype($bool); // prints out "boolean"echo gettype($str); // prints out "string“

// If this is an integer, increment it by fourif (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()

Page 30: PHP (PHP: Hypertext Preprocessing)

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 typeif ($show_separators) { echo "<hr>\n";}?>

Page 31: PHP (PHP: Hypertext Preprocessing)

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>");?>

Page 32: PHP (PHP: Hypertext Preprocessing)

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)?>

Page 33: PHP (PHP: Hypertext Preprocessing)

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

Page 34: PHP (PHP: Hypertext Preprocessing)

II.1.2.4. Kiểu String (2)

Kiểu dấu nháy đơn<?phpecho 'this is a simple string';

echo 'You can also have embedded newlines in strings this way as it isokay 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 newlineecho 'This will not expand: \n a newline';// Outputs: Variables do not $expand $eitherecho 'Variables do not $expand $either';?>

Page 35: PHP (PHP: Hypertext Preprocessing)

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

Page 36: PHP (PHP: Hypertext Preprocessing)

II.1.2.4. Kiểu String (4)

Kiểu Heredoc<?php$str = <<<EOAExample of string <br>spanning multiple lines<br>using heredoc syntax.<br>EOA;

echo($str);

$name = "quang";$d = date("d/m/y");$str = <<<EOQThis is a lecture of $name.<br>Ngay $d<br>EOQ;

echo($str);?>

Page 37: PHP (PHP: Hypertext Preprocessing)

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 varnamesecho "He drank some $beers";// won't work, 's' is a valid character for varnamesecho "He drank some ${beer}s"; // worksecho "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

Page 38: PHP (PHP: Hypertext Preprocessing)

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>";?>

Page 39: PHP (PHP: Hypertext Preprocessing)

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...

Page 40: PHP (PHP: Hypertext Preprocessing)

II.1.2.5. Kiểu Array (2)

Khai bá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);?>

Page 41: PHP (PHP: Hypertext Preprocessing)

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);?>

Page 42: PHP (PHP: Hypertext Preprocessing)

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();?>

Page 43: PHP (PHP: Hypertext Preprocessing)

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");?>

Page 44: PHP (PHP: Hypertext Preprocessing)

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

Page 45: PHP (PHP: Hypertext Preprocessing)

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ọcII.2.3. Toán tử gánII.2.4. Các toán tử trên bitII.2.5. Toán tử so sánhII.2.6. Toán tử điều khiển lỗiII.2.7. Toán tử thực thiII.2.8. Toán tử tăng, giảmII.2.9. Các toán tử logicII.2.10. Toán tử trên stringII.2.11. Toán tử trên mảng

Page 46: PHP (PHP: Hypertext Preprocessing)

II.2.1. Mức độ ưu tiên các toán tửAssociativity Operatorsleft ,left orleft xorleft andright printright = += -= *= /= .= %= &= |= ^= <<= >>= left ? :left ||left &&left |left ^left &non-associative == != === !==non-associative < <= > >=left << >>left + - .left * / %right ! ~ ++ -- (int) (float) (string) (array) (object) @right [non-associative new

Page 47: PHP (PHP: Hypertext Preprocessing)

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.

Page 48: PHP (PHP: Hypertext Preprocessing)

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";?>

Page 49: PHP (PHP: Hypertext Preprocessing)

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.

$a ^ $b XorBits that are set in $a or $b but not both are

set.

~ $a NotBits that are set in $a are not set, and vice versa.

$a << $bShift left

Shift the bits of $a $b steps to the left (each step means "multiply by two")

<?phpecho 12 ^ 9; // Outputs '5'echo "12"^"9"; // Outputs the Backspace character (ascii 8) // ('1' (ascii 49)) ^ ('9' (ascii 57)) = #8echo "hallo"^"hello"; // Outputs the ascii values #0 #4 #0 #0 #0 // 'a' ^ 'e' = #4?>

Page 50: PHP (PHP: Hypertext Preprocessing)

II.2.5. Toán tử so sánh

Example Name Result

$a == $b Equal TRUE if $a is equal to $b.

$a === $b IdenticalTRUE if $a is equal to $b, and they are of the same 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.

$a !== $b Not identicalTRUE if $a is not equal to $b, or they are not of the 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.

$a <= $bLess than or equal to

TRUE if $a is less than or equal to $b.

$a >= $bGreater than or equal to

TRUE if $a is greater than or equal to $b.

Page 51: PHP (PHP: Hypertext Preprocessing)

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");?>

Page 52: PHP (PHP: Hypertext Preprocessing)

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";

?>

Page 53: PHP (PHP: Hypertext Preprocessing)

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";?>

Page 54: PHP (PHP: Hypertext Preprocessing)

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.

Page 55: PHP (PHP: Hypertext Preprocessing)

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!“

?>

Page 56: PHP (PHP: Hypertext Preprocessing)

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);?>

Page 57: PHP (PHP: Hypertext Preprocessing)

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

Page 58: PHP (PHP: Hypertext Preprocessing)

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

<?phpif ($a > $b) { echo "a is bigger than b"; $b = $a;}

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";}?>

<?php if ($a == 5): ?>A is equal to 5<?php endif; ?>

Page 59: PHP (PHP: Hypertext Preprocessing)

II.3.2. Cấu trúc while / do...while

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

$i = 1;while ($i <= 10): print $i; $i++;endwhile;

$i = 0;do { print $i;} while ($i > 0);

?>

Page 60: PHP (PHP: Hypertext Preprocessing)

II.3.3. Cấu trúc for / for...each

<?phpecho "--------------------\n";for ($i = 1; $i <= 10; $i++) { print "$i\n";}

echo "--------------------\n";for ($i = 1; ; $i++) { if ($i > 10) break; print "$i\n";}

echo "--------------------\n";$i = 1;for (;;) { if ($i > 10)break; print "$i\n"; $i++;}

echo "--------------------\n";for ($i = 1; $i <= 10; print "$i\n", $i++);

echo "--------------------\n";for ($i = 1; $i<=20; $i++): print "$i\n";endfor?>

Page 61: PHP (PHP: Hypertext Preprocessing)

II.3.3. Cấu trúc for / for...each (2)

foreach (array_expression as $value) statementforeach (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"; }?>

Page 62: PHP (PHP: Hypertext Preprocessing)

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);}?>

Page 63: PHP (PHP: Hypertext Preprocessing)

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";}?>

Page 64: PHP (PHP: Hypertext Preprocessing)

II.3.5. Cấu trúc switch

<?phpif ($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;}?>

Page 65: PHP (PHP: Hypertext Preprocessing)

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

Page 66: PHP (PHP: Hypertext Preprocessing)

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

<?phpfunction foo ($arg_1, $arg_2, ..., $arg_n) { echo "Example function.\n"; return $retval;}?><?phpfunction 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ĩafoo();// Bây giờ thì có thể gọi bar()bar();?>

Page 67: PHP (PHP: Hypertext Preprocessing)

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<?phpfunction 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.?>

Page 68: PHP (PHP: Hypertext Preprocessing)

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 expectedecho makeyogurt ("raspberry");

function makeyogurt ($flavour, $type = "acidophilus") { return "Making a bowl of $type $flavour.\n";}// works as expected echo makeyogurt ("raspberry");

Page 69: PHP (PHP: Hypertext Preprocessing)

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 saufunc_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");?>

Page 70: PHP (PHP: Hypertext Preprocessing)

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();?>

Page 71: PHP (PHP: Hypertext Preprocessing)

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()?>

Page 72: PHP (PHP: Hypertext Preprocessing)

II.4.4. Biến hàm (2)

<?phpclass 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()?>

Page 73: PHP (PHP: Hypertext Preprocessing)

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

Page 74: PHP (PHP: Hypertext Preprocessing)

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ượngHàm unserialize() dùng để khôi phục đối tượng được lưu giữ bởi hàm serialize()<?phpclass 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);?>

Page 75: PHP (PHP: Hypertext Preprocessing)

II.5.2. Tham chiếu bên trong constructor

<?phpclass AClass { var $m_name; function AClass($name) { global $global_ref; $global_ref[] = &$this; $this->setName($name); } function setName($name) { $this->m_name = $name; } function echoName() { echo "$this->m_name\n"; }};

$a = new AClass("a");$b =& new AClass("b");$a->setName("quang1");$global_ref[0]->echoName();$b->setName("quang2");$global_ref[1]->echoName();?>

Page 76: PHP (PHP: Hypertext Preprocessing)

II.5.3. So sánh đối tượng trong PHP4

<?phpclass AClass { var $m_flag;};

class BClass extends AClass { function turnOn() { $this->m_flag = true; }};

$a = new AClass();$b = new BClass();$a->m_flag = true;$b->turnOn();$c = new BClass();$c->turnOn();

var_dump($b==$c);var_dump($a==$b);?>

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 ===

Page 77: PHP (PHP: Hypertext Preprocessing)

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);?>

Page 78: PHP (PHP: Hypertext Preprocessing)

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

Page 79: PHP (PHP: Hypertext Preprocessing)

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

Page 80: PHP (PHP: Hypertext Preprocessing)

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);?>

Page 81: PHP (PHP: Hypertext Preprocessing)

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)

<?phpfunction foo(&$var){ $var =& $GLOBALS["quang"]; var_dump($var);}$quang = "Nguyen Phu Quang";$var = 100;foo($var);var_dump($var);?>

Page 82: PHP (PHP: Hypertext Preprocessing)

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

<?phpfunction 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);

?>

Page 83: PHP (PHP: Hypertext Preprocessing)

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ụ)

<?phpfunction &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);?>

Page 84: PHP (PHP: Hypertext Preprocessing)

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);?>

Page 85: PHP (PHP: Hypertext Preprocessing)

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

Page 86: PHP (PHP: Hypertext Preprocessing)

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

Page 87: PHP (PHP: Hypertext Preprocessing)

III.2. Biến $_SERVER

Variable Contains Example

$_SERVER['PHP_SELF'] The current script. Suitable for use in links and form element action arguments.

/phpbook/source/listing10.1.php

$_SERVER['HTTP_USER_AGENT'] The name and version of the client.

Mozilla/4.6 –(X11; I;Linux2.2. 6-15apmac ppc)

$_SERVER['REMOTE_ADDR'] The IP address of the client.

158.152.55.35

$_SERVER['REQUEST_METHOD'] Whether the request was GET or POST.

POST

$_SERVER['QUERY_STRING'] For GET requests, the encoded data sent appended to the URL.

name=matt&address=unknown

$_SERVER['REQUEST_URL'] The full address of the request, including query string.

/phpbook/source/listing10.1.php? name=matt

$_SERVER['HTTP_REFERER'] The address of the page from which the request was made.

http://p24.corrosive

Page 88: PHP (PHP: Hypertext Preprocessing)

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

<?phpforeach ($_SERVER as $key=>$value) { echo "[$key]=$value\n";}?>

Page 89: PHP (PHP: Hypertext Preprocessing)

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

Page 90: PHP (PHP: Hypertext Preprocessing)

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>

Page 91: PHP (PHP: Hypertext Preprocessing)

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 globalCú phápbool 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

<?phpimport_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>

Page 92: PHP (PHP: Hypertext Preprocessing)

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

Page 93: PHP (PHP: Hypertext Preprocessing)

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>

Page 94: PHP (PHP: Hypertext Preprocessing)

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ụ)

Page 95: PHP (PHP: Hypertext Preprocessing)

III.4. Kết hợp mã HTML và PHP trong 1 trang (2)

<?phpif ( 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}?>

Page 96: PHP (PHP: Hypertext Preprocessing)

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>

Page 97: PHP (PHP: Hypertext Preprocessing)

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)

Page 98: PHP (PHP: Hypertext Preprocessing)

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;} elseif ($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>

Page 99: PHP (PHP: Hypertext Preprocessing)

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>

Page 100: PHP (PHP: Hypertext Preprocessing)

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 file

6835

$_FILES['fupload']['error'] An error code corresponding to a PHP constant

UPLOAD_ERR_FORM_SIZE

$_FILES['fupload']['type'] MIME type of uploaded file (where given by client)

image/gif

Page 101: PHP (PHP: Hypertext Preprocessing)

Constant NameValu

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

Page 102: PHP (PHP: Hypertext Preprocessing)

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>

Page 103: PHP (PHP: Hypertext Preprocessing)

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

Page 104: PHP (PHP: Hypertext Preprocessing)

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

Page 105: PHP (PHP: Hypertext Preprocessing)

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

<!--File1.php-><?phpecho "This is from file 1\n";?>

<!--File2.php -><?phpecho "This is from file 2\n";include("file1.php");include("file3.php");echo "This is from file 2\n";?>

Page 106: PHP (PHP: Hypertext Preprocessing)

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--><?phpecho "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";?>

Page 107: PHP (PHP: Hypertext Preprocessing)

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--><?phpfor ($i=0; $i<10; $i++) { echo include("File22.php"), "\n";}?>

Page 108: PHP (PHP: Hypertext Preprocessing)

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.phpinclude_once("A.php"); // this will include a.php again on Windows!?>

Page 109: PHP (PHP: Hypertext Preprocessing)

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)

Page 110: PHP (PHP: Hypertext Preprocessing)

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()

<?phpvar_dump(get_include_path());set_include_path('/inc'); // Works as of PHP 4.3.0var_dump(get_include_path());restore_include_path();var_dump(get_include_path());?>

– dùng lệnh ini_set() <?phpvar_dump(ini_get("include_path"));ini_set("include_path", "/inc"); // Works in all PHP versionsvar_dump(ini_get("include_path"));ini_restore("include_path");var_dump(ini_get("include_path"));?>

Page 111: PHP (PHP: Hypertext Preprocessing)

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");?>

Page 112: PHP (PHP: Hypertext Preprocessing)

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);

Page 113: PHP (PHP: Hypertext Preprocessing)

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 "$line";}fclose($f);

echo "Read all file by fread......\n";$f = fopen("test.txt", "rb");$myfile = fread($f, filesize("test.txt"));echo $myfile;fclose($f);

echo "Read all file......\n";$myfile = file_get_contents("test.txt");echo($myfile);?>

Page 114: PHP (PHP: Hypertext Preprocessing)

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);?>

Page 115: PHP (PHP: Hypertext Preprocessing)

IV.4. Đọc, ghi file (4)

<?phpclass 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);

?>

Page 116: PHP (PHP: Hypertext Preprocessing)

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);?>

Page 117: PHP (PHP: Hypertext Preprocessing)

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

Page 118: PHP (PHP: Hypertext Preprocessing)

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.

Page 119: PHP (PHP: Hypertext Preprocessing)

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)

Page 120: PHP (PHP: Hypertext Preprocessing)

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)

Page 121: PHP (PHP: Hypertext Preprocessing)

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>";?>

Page 122: PHP (PHP: Hypertext Preprocessing)

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ớ

Page 123: PHP (PHP: Hypertext Preprocessing)

V.2.1. Data source name

dsn=Data Source Name type://

username:password@protocol+hostspec/database

Ví dụ:– mysql:///webdb mysql://localhost/webdb

mysql://bondview@localhost/webdb mysql://bondview@tcp+localhost/webdb mysql://bondview:007@localhost/webdb

Type Database

Mysql MySQL

Pgsql PostgreSQL

Ibase InterBase

Msql Mini SQL

Mssql Microsoft SQL Server

oci8 Oracle 7/8/8i

Odbc ODBC

Sybase SyBase

Ifx Informix

Fbsql FrontBase

Page 124: PHP (PHP: Hypertext Preprocessing)

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'));

Page 125: PHP (PHP: Hypertext Preprocessing)

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( ));}

Page 126: PHP (PHP: Hypertext Preprocessing)

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());}

Page 127: PHP (PHP: Hypertext Preprocessing)

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}?>

Page 128: PHP (PHP: Hypertext Preprocessing)

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

Page 129: PHP (PHP: Hypertext Preprocessing)

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}";?>

Page 130: PHP (PHP: Hypertext Preprocessing)

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();?>

Page 131: PHP (PHP: Hypertext Preprocessing)

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

Page 132: PHP (PHP: Hypertext Preprocessing)

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);?>

Page 133: PHP (PHP: Hypertext Preprocessing)

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);?>

Page 134: PHP (PHP: Hypertext Preprocessing)

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);?>

Page 135: PHP (PHP: Hypertext Preprocessing)

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());?>

Page 136: PHP (PHP: Hypertext Preprocessing)

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);?>

Page 137: PHP (PHP: Hypertext Preprocessing)

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;?>

Page 138: PHP (PHP: Hypertext Preprocessing)

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

Page 139: PHP (PHP: Hypertext Preprocessing)

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)

Page 140: PHP (PHP: Hypertext Preprocessing)

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;}?>

Page 141: PHP (PHP: Hypertext Preprocessing)

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()

<?phpob_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!";}?>

Page 142: PHP (PHP: Hypertext Preprocessing)

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

Page 143: PHP (PHP: Hypertext Preprocessing)

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)

Page 144: PHP (PHP: Hypertext Preprocessing)

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

Page 145: PHP (PHP: Hypertext Preprocessing)

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");?>

Page 146: PHP (PHP: Hypertext Preprocessing)

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);}?>

Page 147: PHP (PHP: Hypertext Preprocessing)

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");?>

Page 148: PHP (PHP: Hypertext Preprocessing)

VI.4.5. Log lỗi

Page 149: PHP (PHP: Hypertext Preprocessing)

VI.5. Tối ưu hóa

Page 150: PHP (PHP: Hypertext Preprocessing)

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

Page 151: PHP (PHP: Hypertext Preprocessing)

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

Page 152: PHP (PHP: Hypertext Preprocessing)

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>

Page 153: PHP (PHP: Hypertext Preprocessing)

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] )

Page 154: PHP (PHP: Hypertext Preprocessing)

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);

Page 155: PHP (PHP: Hypertext Preprocessing)

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);?>

Page 156: PHP (PHP: Hypertext Preprocessing)

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);?>

Page 157: PHP (PHP: Hypertext Preprocessing)

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);?>

Page 158: PHP (PHP: Hypertext Preprocessing)

VII.5. Màu sắc

VII.5.1. True color & color index

VII.5.3. Kênh alpha

Page 159: PHP (PHP: Hypertext Preprocessing)

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);

Page 160: PHP (PHP: Hypertext Preprocessing)

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);?>

Page 161: PHP (PHP: Hypertext Preprocessing)

IX. XML

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

IX.2. Đọc XML

Page 162: PHP (PHP: Hypertext Preprocessing)

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

Page 163: PHP (PHP: Hypertext Preprocessing)

IX.2. Đọc XML

<?phpfunction 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>");?>

Page 164: PHP (PHP: Hypertext Preprocessing)

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