You are on page 1of 32

Lịch sử phát triển các ứng dụng trên Web server.

ASP, JSP và PHP

Lịch sử phát triển các ứng dụng trên Web server. ASP, JSP và PHP
Vài năm trước đây, con đường thực sự duy nhất để vận chuyển các dữ liệu động tới trang Web là
kỹ thuật CGI (Common Gateway Interface). Các chương trình CGI cung cấp một sự liên hệ đơn
giản để tạo các ứng dụng Web cho phép tiếp nhận các dữ liệu nhập vào, các yêu cầu truy vấn cơ
sở dữ liệu từ phía người dùng và trả một vài kết quả về cho trình duyệt. Các chương trình CGI có
thể được viết trên một vài ngôn ngữ, trong đó phổ biến nhất là Perl. Web server sử dụng CGI
như là một cổng truy cập chặn giữa yêu cầu của người dùng và dữ liệu được yêu cầu. Nó sẽ được
nạp vào bộ nhớ như một chương trình bình thường. Thông thường các web server sẽ chuyển các
yêu cầu và triệu gọi chương trình CGI. Sau khi chương trình kết thúc, web server sẽ đọc dữ liệu
trả về từ chương trình và gửi nó đến trình duyệt.
Nhược điểm lớn nhất của kỹ thuật CGI là nó hoạt động kém hiệu quả. Mỗi khi web server nhận
một yêu cầu, một tuyến trình mới được tạo ra. Mỗi tuyến trình lại chứa trong nó các đoạn mã
lệnh, dữ liệu… và không được chia sẻ lẫn nhau, do đó gây ra lãng phí bộ nhớ. Để khắc phục
nhược điểm này, Microsoft và Netscape đã hợp tác và đưa ra một cải tiến đáng kể là chuyển
chúng về dạng các file thư viện liên kết động (DLL ), cho phép chia sẻ mã lệnh giữa các tuyến
trình. Đây chính là các kỹ thuật ISAPI và NSAPI.
Đen đủi thay, các kỹ thuật dựa trên DLL không phải là đã hoàn thiện. Chúng vẫn còn một số vấn
đề:
- Khi các thư viện nền tảng được gọi, nếu muốn thoát các ứng dụng này, ta phải tắt chương trình
triệu gọi (Web server) và khởi động lại máy tính.
- Các thư viện cần được đặt trong các tuyến trình bảo vệ, tức là chúng cần phải được cảnh giác
về cách sử dụng các biến chung hoặc các biến tĩnh.
- Nếu chương trình triệu gọi gây ra lỗi truy cập, nó có thể dẫn đến tình trạng server bị treo tắc tử.
- Và cuối cùng: khi đã được dịch ra các file DLL, công việc gỡ lỗi cũng như bảo trì mã lệnh trở
nên vất vả hơn bao giờ hết.

Kỹ thuật Web mới nhất của Microsoft, kết hợp HTML, các đoạn Script, các thành phần xử lý
phía server trong cùng một file, được gọi là ASP (Active Server Pages), với phiên bản mới nhất
hiện nay là ASP.Net. ASP được triệu gọi bởi một thư viện liên kết động gắn với các Web server
của Microsoft. Về bản chất, ta có thể coi ASP như là một ngôn ngữ thông dịch vậy. Một trang
ASP có thể sử dụng HTML, JScript và VBScript. Qua các đoạn mã nhúng này, ASP có thể truy
cập đến các thành phần phía server. Các thành phần này có thể được viết trên bất kỳ ngôn ngữ
nào hỗ trợ các thành phần COM của Microsoft. Và đây chính là sức mạnh của ASP: Nó có thể
làm được bất kỳ cái gì mà máy chủ có thể làm được với các thành phần COM. Sau khi được thi
hành, ASP sẽ sản sinh ra một trang Web có khuôn dạng HTML và trả nó về cho Web server.

Một bất lợi lớn đối với ASP là nó chỉ có thể hoạt động trên các họ Web server của Microsoft
(bao gồm PWS trên Win9x hay IIS trên WinNT/2000/XP). Các nhà phát triển đang hướng đến
những môi trường khác như Unix/Linux (hiện đã có bản Chili! ASP chạy trên các môi trường
này), nhưng kết quả thì còn phải đợi thêm một thời gian nữa

Trước khi đi vào tìm hiểu lịch sử của PHP, có lẽ chúng ta cũng phải nhắc đến một tên tuổi khác
là Java Server Pages. hay JSP. Giống như ASP, trang JSP cho phép chứa HTML, các đoạn mã
Java và các thành phần Java Bean và chúng sẽ thực hiện các công việc để sản sinh ra một trang
Web để gửi về Client. Bất lợi chính của loại này là phải đi kèm với "máy ảo Java", vốn không
được coi là nhanh về mặt tốc độ.
Lịch sử PHP
PHP - viết tắt của PHP Hypertext Preprocessor - một định nghĩa đệ quy khó hiểu!
Vào khoảng năm 1994, Rasmus Lerdorf đưa một số đoạn Perl Script vào trang Web để theo dõi
xem ai đang đọc tài liệu của ông ta. Dần dần, người ta bắt đầu thích các đoạn Script này và sau
đó đã xuất bản một gói công cụ có tên là "Personal Home Pages" (nghĩa đầu tiên của PHP). Ông
ta đã viết một cơ chế nhúng và kết hợp với một số công cụ khác để phân tích đầu vào từ các mẫu
biểu HTML: FI, Form Interpreter hay Phiên dịch mẫu biểu, được tạo ra theo cách đó và được đặt
tên là PHP/FI hay PHP2. Nó được hoàn thành vào khoảng giữa năm 1995.

Sau đó, người ta bắt đầu sử dụng các công cụ này để xây dựng những thứ rắc rối hơn, và đội ngũ
phát triển đã thay đổi từ một người duy nhất thành một nhóm các nhà phát triển nòng cốt trong
dự án, và nó đã được tổ chức hoá. Đó là sự bắt đầu của PHP3. Đội ngũ các nhà phát triển
(Rasmus Lerdorf, Andi Gutmans, Zeev Suraski, Stig Bakken, Shane Caraveo và Jim Winstead)
đã cải tiến và mở rộng bộ máy nhúng và bổ sung thêm một số hàm API đơn giản cho phép các
lập trình viên khác tự do bổ sung nhiều tính năng vào ngôn ngữ bằng cách viết các module cho
nó. Cấu trúc của ngôn ngữ đã được tinh chế, được kết cấu thân thiện hơn đối với những người
đến từ các ngôn ngữ hướng đối tượng hay các ngôn ngữ hướng thủ tục. Nếu bạn đã biết một vài
ngôn ngữ lập trình khác thì khi đến với PHP, bạn sẽ không cảm thấy khó khăn.
Phiên bản mới nhất cho đến thời điểm này là PHP 5.0.1. Các bạn có thể tham khảo chi tiết tại
trang web http://www.php.net.

Chương trình PHP đầu tiên: Hello, World

Bắt đầu với Hello, world


I. Khởi đầu

Nếu các bạn đã từng học lập trình, chắc các bạn cũng biết được "Hello, world" là cái gì, còn nếu
bạn nào chưa biết, thì tôi sẽ giải thích ngay đây:

"Hello, world" là một chương trình dành cho những người mới bắt đầu học một ngôn ngữ lập
trình nào đó. Chương trình này đơn giản chỉ viết duy nhất một dòng chữ "Hello, world" ra màn
hình. Các bạn có thể bỏ qua nó nếu đã biết từ trước, còn nếu bạn nào chưa học, thì chúng ta bắt
tay vào viết chương trình này bằng PHP nhé.

Hãy mở NotePad ra, gõ vào nội dung sau:

Code:
<HTML>
<BODY>
<?php
echo ("hello, world");
?>
</BODY>
</HTML>

OK, Save lại với cái tên test.php. Copy nó vào thư mục gốc (Root Directory) mặc định của Web
server. Khởi động Web server Apache lên (nó sẽ hiển thị một cửa sổ đen ngòm, bạn cứ để đó,
đừng tắt nó đi, vì nếu tắt đi thì tức là bạn đã tắt chương trình Web server Apache đi rồi đấy).

Bây giờ mở trình duyệt ra, tại ô địa chỉ, gõ nội dung sau: "http://127.0.0.1/test.php" (nhớ bỏ hai
dấu ngoặc kép đi nhé)

Nó sẽ hiển thị ra cửa sổ trình duyệt với duy nhất dòng chữ hello, world

Chắc bạn thất vọng lắm hả? Vâng, nó chỉ có mỗi dòng chữ "hello, world" trên màn hình trình
duyệt, mà bạn có thể làm nó đơn giản hơn rất nhiều, chẳng cần đến cái PHP kia. OK. Đừng thất
vọng vội.

Chương trình này hoạt động như thế nào? Trước tiên chúng ta hãy tìm hiểu cách thức hoạt động
của hệ trình duyệt (Web Client) và máy chủ cung cấp dịch vụ Web (Web server ) đã nhé:

Bước 1: Trình duyệt gửi một yêu cầu HTTP đến máy chủ, yêu cầu một file nào đó

Bước 2: Máy chủ sẽ chuyển yêu cầu này đến chương trình xử lý tương ứng, chính là chương
trình Web server.

Bước 3: Web server phân tích chuỗi yêu cầu nhận được, kiểm tra xem trình duyệt ở máy khách
yêu cầu gì. Nếu đó là các file bình thường (không phải là các file chứa các đoạn mã script thực
thi phía máy chủ), nó sẽ tìm kiếm file đó và trả về cho trình duyệt ở máy khách. Còn nếu đó là
các file chứa các đoạn mã script thực thi phía máy chủ (các chương trình CGI, hay các file thư
viện liên kết động ISAPI, hoặc các file *.asp hay *.php), nó sẽ triệu gọi chương trình thực thi các
đoạn mã này. Chương trình này sẽ chịu trách nhiệm chạy các đoạn mã, trả chúng về cho Web
server dưới khuôn dạng của HTML. Sau đó, Web server mới trả kết quả lấy được cho trình
duyệt.

Như vậy, chương trình của bạn phải được thực thi trên máy chủ, sau đó mới được trả về cho trình
duyêt. Và đây chính là cái gọi là "Trang Web động". Không như các trang web tĩnh, trang web
động cho phép bạn có sự tương tác với máy chủ thông qua các đoạn script thực thi phía server.
Nhờ có sự tương tác này, bạn có thể truy xuất cơ sở dữ liệu, lấy thông tin người sử dụng, điều
khiển các hoạt động khác...

OK. Bây giờ chắc bạn đã có được chút ít kiến thức với các hệ thống điều khiển Web Client -
Server rồi. Đến lượt chúng ta bắt đầu phân tích chương trình đầu tiên kia.

II. Phân tích chương trình

Quay trở về đoạn mã trên:

Code:
<HTML>
<BODY>
<?php
echo ("hello, world");
?>
</BODY>
</HTML>

Điều đầu tiên các bạn cần phải biết, đó là các đoạn mã thực thi PHP luôn luôn được đặt trong thẻ
<?php .... ?>. Chương trình xử lý phía máy chủ sẽ chỉ thực thi các đoạn mã nằm trong thẻ này.
Tất cả các đoạn mã khác nằm ngoài thẻ trên đều không được xử lý trực tiếp trên server mà được
đưa về trình duyệt.

<?php
// Đoạn mã PHP đặt ở đây
?>

Điều thứ 2 bạn cần biết là chương trình của bạn phải được đặt trong các file *.php. Nếu bạn đặt
nó vào file khác, thì đừng mong nó chạy nhé, vì nguyên tắc của chương trình Web server là chỉ
triệu gọi các chương trình xử lý tương ứng với các file có đuôi xác định trước.

Điều thứ 3 bạn cần biết là trong file *.php của bạn, ngoài các đoạn script PHP, bạn có thể đặt bất
kỳ cái gì theo khuôn dạng HTML, kể cả các đoạn JavaScript chạy trên máy khách. Tức là ngoại
trừ các đoạn script PHP ra thì nó không khác gì một file HTML thông thường

Điều thứ 4 các bạn cần biết, là chúng ta có thể đặt nhiều đoạn mã xử lý PHP khác nhau trong
cùng một file PHP. Các đoạn mã PHP này sẽ được thực thi lần lượt từ đầu file xuống dưới. Hãy
xem ví dụ sau:

Code:
<HTML>
<BODY>
<?php
echo ("hello, world");
?>
<BR>
Xin chao tat ca cac ban, day la chuong trinh PHP dau tien cua toi
<?php
echo ("<p align=right> CMXQ </p>")
?>
</BODY>
</HTML>

Khởi đầu, chương trình xử lý phía Web server sẽ phân tích file PHP này, trả về đoạn mã

<HTML>
<BODY>

Tiếp theo, khi thấy đoạn mã thứ nhất, nó sẽ thực thi và trả về dòng "hello, world" (Dòng này do
hàm echo() của PHP thực hiện). Sau đó, nó tiếp tục trả về các dòng
<BR>
Xin chao tat ca cac ban, day la chuong trinh PHP dau tien cua toi

Đến khi gặp đoạn PHP thứ 2, nó sẽ thực thực thi đoạn mã thứ 2 này (gọi hàm echo()) và trả về
kết quả:

"<p align=right> CMXQ </p>"

Hết đoạn mã thứ 2. Nó sẽ gửi tiếp phần còn lại của file về cho Web server. Sau đó, Web server
chính thức trả toàn bộ kết quả về cho trình duyệt.

Điều quan trọng cuối cùng: Kết thúc mỗi câu lệnh của PHP đều là một dấu chấm phẩy (";"),
ngoại trừ một vài trường hợp (các bạn sẽ được biết sau này)

Bây giờ tôi xin giải thích cách sử dụng hàm duy nhất trong bài này: echo()

Hàm echo được sử dụng để trả về nội dung của các biến, hằng, chuỗi... cho trình duyệt. Ở ví dụ
trên, hàm echo trả về chuỗi "hello, world" và chuỗi "<p align=right> Le Nguyen Sinh </p>". Các
thẻ HTML trong chuỗi sẽ được giữ nguyên khi nó được đưa về trình duyệt, và nó sẽ được xử lý
như các thẻ HTML khác.

III. Một số lưu ý

Dấu chú thích:

Các đoạn chú thích rất hữu dụng trong các chương trình của bạn (chẳng hạn muốn chú thích câu
lệnh này làm gì, đoạn chương trình này làm gì...). Khi phân tích mã PHP, các đoạn chú thích sẽ
bị bỏ qua, nhưng một lập trình viên thì không bao giờ bỏ qua chúng

Chúng ta có thể sử dụng một số dấu chú thích sau trong PHP:

// dòng văn bản chú thích (chỉ áp dụng trên một dòng)
/* Đoạn văn bản chú thích */ (nằm trong cặp /* và */

Lưu ý rằng các dấu chú thích này chỉ có hiệu lực trong các đoạn mã nhúng PHP thôi đấy nhé

Ví dụ

<?php
echo("Tôi là một oan hồn vô danh"); // Hiển thị lời giới thiệu lên màn hình

echo (" Sơ yếu lý lịch");


/* Hiển thị bản sơ yếu lý lịch
Copyright © by CMXQ
*/
echo ("Tên đầy đủ: XXXXXXX");
echo ("Ngày sinh: XXXX");
?>

Ký tự giải phóng

Hãy chú ý đến dòng chữ sau:


My name's "CMXQ"

Để in nó ra màn hình, chắc các bạn sẽ làm như sau:

<?php
echo("My name's ""CMXQ"");
?>

Rất tiếc là bạn đã nhầm. PHP có quy định một số ký tự đặc biệt (Dấu ngoặc kép (") là một trong
các ký tự đó). Một vài phiên bản của web server khi gặp lỗi này đã không thực hiện nữa, và
thông báo lỗi đến người dùng. Còn trong một vài phiên bản khác, nó sẽ tự động chèn một dấu
sượt chéo (/) trước ký tự gây lỗi này. Một dấu gạch chéo (\) trước ký tự gây lỗi khiến cho nó
được đối xử như là một ký tự thông thường, không phải là ký tự đặc biệt. Ký tự này (\) được gọi
là ký tự giải phóng (Escaping character).

Đoạn mã đúng như sau:

<?php
echo ("My name's: \"CMXQ\"");
?>

Dưới đây là một số các ký tự đặc biệt mà có thể được chỉ rõ với ký tự giải phóng gạch chéo

Ký tự nối tiếp Nghĩa


\' Dấu móc lửng (')
\" Dấu móc kép (")
\\ Dấu gạch chéo (\)
\$ Dấu $
\n Ký tự tạo dòng mới
\r Ký tự về đầu dòng
\t Ký tự Tab

Hãy xem ví dụ dưới đây (yêu cầu bạn tự tìm hiểu và phân tích mã nguồn)

<?php
$name="Tiến Tùng";
echo("Giá trị của biến \$name là $name);
?>
OK. Đến bây giờ, bạn đã biết một chút về PHP rồi đấy. Hãy viết vài chương trình PHP, sử dụng
hàm echo đi đã nhé . Nhớ chú ý cách thức xử lý các kết quả trả về. Hẹn gặp lại các bạn trong bài
sau.
Chúc các bạn thành công

Hằng và biến trong PHP


1. Hằng và biến
Nếu các bạn chưa từng học lập trình, chắc các bạn đang còn xa lạ với hằng và biến. OK, No Star
where
- Giống như trong toán học, một hằng số xác định một giá trị duy nhất thông qua tên của hằng
số, trong Tin học cũng vậy. Môt hằng số xác định một giá trị duy nhất trong toàn bộ chương
trình. Người ta có thể sử dụng giá trị này thông qua tên của hằng số đó trong chương trình
- Tương tự đối với biến. Một biến trong lập trình được sử dụng để lưu trữ một giá trị nào đó
thông qua tên biến. Sở dĩ người ta gọi nó là biến, vì không như hằng số (giữ nguyên giá trị trong
toàn bộ quá trình chạy chương trình), người ta có thể thay đổi giá trị của biến số thông qua các
phép gán.

Để tạo điều kiện dễ dàng trong quá trình phân tích dữ liệu, PHP quy định bất kỳ từ nào có dấu $
ở trước đều là tên của biến. Ví dụ:
$ten xác định một biến có tên là ten
$custome_name: xác định một biến có tên là $custome_name

Bạn cần biết rằng tên biến là một chuỗi các ký tự chỉ bao gồm các chữ số, chữ cái (a..z) và dấu
gạch dưới ( _ ). Và PHP quy định phân biệt các biến chữ hoa và chữ thường là khác nhau.
CHẳng hạn $ab và $Ab là 2 biến hoàn toàn khác nhau. Một điểm cần lưu ý khác là không được
đặt tên biến bắt đầu bằng các chữ số (0.. 9)

Do quy định các chuỗi ký tự có chứa dấu $ ở trước là một tên biến, nên PHP tự động khởi gán
giá trị của các biến này là rỗng (đối với kiểu dữ liệu văn bản) hoặc 0 đối với kiểu dữ liệu số. Bạn
sẽ được biết đến các kiểu dữ liệu sau này.

Để gán giá trị cho các biến, bạn sử dụng câu lệnh gán như sau:
$tên_biến = giá trị cần gán;

Ví dụ:
$nam_sinh=1980;
$ho_ten="CMXQ";

Các bạn chú ý đến 2 ví dụ tôi nhập dữ liệu: một cái thì nằm trong cặp dấu ngoặc kép chỉ thị biến
đó chứa dữ liệu theo kiểu xâu, còn một cái thì không nằm trong cặp dấu ngoặc kép chỉ thị biến
đó chứa dữ liệu kiểu số. Bạn sẽ biết chi tiết hơn ở ngay sau đây:

2. Các kiểu dữ liệu trong PHP

PHP có 3 kiểu dữ liệu cơ bản: Integer, double và string. Ngoài ra còn một số kiểu dữ liệu khác,
đượ xây dựng dựa trên các kiểu dữ liệu cơ bản trên, như mảng, object, mà chúng ta sẽ đề cập đến
sau. Tất cả các biến đều được chỉ định kiểu dữ liệu, và như chúng ta đã nói ở trên, giá trị của
chúng có thể bị thay đổi trong quá trình sử dụng.

Kiểu giá trị Integer sử dụng 4 byte của bộ nhớ. Đây là kiểu giá trị nguyên (không phải là số thực)
và có giá trị nằm trong khoảng từ -2 tỷ đến 2 tỷ. Kiểu dữ liệu double là kiểu dữ liệu số thực, cho
phép chứa các số thưc. Kiểu String được sử dụng để chứa các dữ liệu như là các ký tự văn bản,
ký tự đặc biệt và các chữ số. Dữ liệu kiểu string được đặt trong cặp dấu ngoặc kép ("") chỉ định
một xâu (hay còn gọi là chuỗi ký tự).

Ví dụ:
2: Kiểu integer;
2.0: kiểu double
"2": Kiểu xâu
"2 gio": Kiểu xâu

3.Định nghĩa hằng

Hàm define() được sử dụng để tạo một hằng số:


Hàm này có cấu trúc sau:
define ("tên_hằng","giá trị của hằng");
Ví dụ:
define ("COMPANY","NS Co.Ltd");// Định nghĩa hằng COMPANY với giá trị là "NS Co Ltd"
define ("diem_so",4.5);// định nghĩa hằng diem_so với giá trị là 4.5 (hic... thi lại );

Sau khi một hằng số được tạo ra, ta có thể sử dụng chúng thay cho giá trị của chúng:
echo ("Tên công ty: ".COMPANY);
Điều này tương đương với echo ("Tên công ty: NS Co Ltd");

4. Một số hằng xây dựng sẵn (built in constant)

PHP có chứa một số hằng được xây dựng sẵn. TRUE và FALSE là 2 hằng đã được dựng sẵn với
chỉ định true (1) và false (=0 hoặc một xâu rỗng)

Hằng số PHP_VERSION chỉ định phiên bản của bộ phân tích PHP mà bạn đang dùng hiện tại.
Hằng PHP_OS chỉ định hệ điều hành server mà trình phân tích PHP đang chạy.

echo (PHP_OS); // in ra màn hình "Linux" (ví dụ)

_FILE_and_LINE_ trả về tên của đoạn script (đoạn mã nhúng) đang được phân tích tại dòng
hiện thời trong đoạn mã script.

PHP còn cung cấp một số hàm để thông báo lỗi như E_ERROR, E_WARNING, E_PARSE và
E_NOTICE.

Ngoài ra, PHP còn cung cấp một số biến cung cấp thông tin về môi trường PHP đang sử dụng.
Để xem các thông tin này,bạn có thể dùng hàm phpinfo() như sau:
<HTML>
<!-- phpinfo.php-->
<BODY>
<?php
phpinfo();
?>
</BODY>
</HTML
5. Lừa kiểu và ép kiểu dữ liệu

Như chúng ta đã biết, tất cả các biến PHP đều có kiểu dữ liệu riêng. Kiểu dữ liệu của biến sẽ
được tự động xác định bởi giá trị đặt vào biến

$a=1 // $a là kiểu integer


$a=1.2 // Bây giờ, nó là kiểu double
$a="1" // Và bây giờ nó là kiểu string

a) Chuyển kiểu chuỗi và lừa kiểu dữ liệu

Nếu bạn làm các thao tác tính toán số trên một chuỗi, PHP sẽ tính toán chuỗi như là một số. Điều
này được biết đến với cái tên gọi là "chuyển kiểu chuối (String conversion), mặc dù giá trị chuỗi
của nó có thể không cần phải thay đổi. Trong đoạn ví dụ sau, biến $str được xác định là một
chuỗi:
$str="756300 không có";
Nếu chúng ta cố cộng thêm một giá trị nguyên là 3 vào biến $str, biến $str sẽ tự động tính với số
nguyên 756300:
$x=4+$str;//$x =756304

Nhưng bản thân giá trị của biến $str không thay đổi

echo ($str); // In ra màn hình chuỗi "756300 không có"

Chuyển kiểu chuỗi phải tuân theo 2 nguyên tắc sau:


- Chỉ những chuỗi bắt đầ là một xâu các chữ số. Nếu chuỗi bắt đầu bằng một giá trị số hợp lệ,
chuỗi này sẽ được xác định như giá trị của nó, trong trường hợp khác, nó sẽ trả về 0. VD: chuỗi
"35 tuổi" sẽ được ước lượng là 35, nhưng chuỗi "tuổi 35" sẽ chỉ xác định giá trị 0.

- Một chuỗi sẽ chỉ được xác định như là một giá trị kiểu double nếu giá trị kiểu double được
miêu tả bao gồm toàn bộ chuỗi. Chuỗi "3.4", "-4.2" sẽ được ước lượng như giá trị thực 3.4 và
-4.2. Nếu một ký tự không phải là ký tự kiểu số thực được đưa vào chuỗi, giá trị của chuỗi đó sẽ
được ước lượng như là một số nguyên. Chuỗi "3.4 dollar" sẽ thành số nguyên 3.

Trong việc cộng với chuỗi chuyển kiểu, PHP sẽ thực hiện "lừa kiểu" giữa 2 kiểu số. Nếu bạn
thực hiện một phép toán số học giữa kiểu thực và kiểu nguyên, giá trị sẽ là số thực
$a=1 //$ a là một số nguyên
$b= 1.0 //$b là số thực
$c=$a+$b //$c là kiểu số thực , = 2.0
$d = $c+"6th" //$d là kiểu số thực = 8.0

Ép kiểu dữ liệu

Ép kiểu dữ liệu cho phép bạn thay đổi kiểu dữ liệu của biến

$a=11.2// $a là kiểu thực


$a=(int)$a// Bây giờ, $ a là kiểu nguyên, giá trị = 11
$a= (double) $a// Bây giờ $a lại trở về kiểu thực = 11.0
$b= (string)$a// $b là giá trị kiểu chuỗi ="11"

Ngoài ra, chúng ta còn được phép ép kiểu (array) và (object)

(integer) tương đương với (int); (fload) và (real) tương đương với (double)

6. Một số hàm tiện ích khác

PHP có một số hàm hỗ trợ làm việc với các biến

- Hàm gettype($ten_bien) xác định kiểu của biến. Nó sẽ trả về một trong các giá trị: "integer",
"double", "string", "array", "object", "class", "unknown type" (Chúng ta sẽ tìm hiểu kỹ hơn vể
mảng (array) và kiểu đối tượng (object) ở các bài sau.
Ví dụ:
echo(gettype($name));

- Hàm settype($ten_bien,"kieu_du_lieu") sẽ đặt kiểu dữ liệu cho biến $ten_bien. Kiểu dữ liệu
được viết dưới dạng một chuỗi, và có thể có một trong các kiểu sau: "integer", "double", "string",
"array", "object". Nếu kiểu dữ liệu không được đặt, giá trị false sẽ được trả về, còn nếu thành
công, nó sẽ trả về giá trị true.

VD:
$a=7.5; //$a là kiểu thực
settype($a,"integer"); // bây giờ nó là một số nguyên có giá trị 7

- Hàm isset($ten_bien) được sử dụng để xác định xem biến $ten_bien đã đặt một giá trị nào đó
hay chưa. Nếu biến đó đã có giá trị, hàm trả về true. Trong truờng hợp ngược lại, hàm trả về giá
trị false;
- Hàm unset($ten_bien) được sử dụng để huỷ bỏ biến $ten_bien, giải phóng bộ nhớ bị chiếm
dụng của biến đó

Các câu lệnh gán và rẽ nhánh trong PHP


OK, bây giờ chúng ta chuẩn bị làm việc với các câu lệnh "xương sống" của một ngôn ngữ lập
trình.
Nếu bạn nào đã từng học qua một ngôn ngữ lập trình nào đó, thì các bạn có thể đọc lướt qua
phần này. Còn nếu bây giờ bạn mới bắt đầu tiếp xúc với một ngôn ngữ lập trình thì... hãy chuẩn
bị tinh thần đi

Các câu lệnh trong ngôn ngữ lập trình

Để lập trình giải một bài toán nào đó, chúng ta phải sử dụng các câu lệnh sau:
1. Lệnh gán: được sử dụng để đặt một giá trị vào một biến nào đó.
2. Lệnh rẽ nhánh: Được sử dụng để xác định xem chương trình sẽ thực hiện công việc gì trong
điều kiện ra sao
3. Lệnh lặp: Cho phép chương trình của bạn tự động lặp lại các thao tác nào đó
Quá trình xây dựng các bước để thực hiện một bài toán nào đó, gọi là quá trình xây dựng thuật
giải.

Ví dụ: Hãy tưởng tượng bạn đang ... nhậu

Bước 0: chưa có ai say rượu


Bước 1: Kêu chủ quán cho một chai "cuốc lủi" (tạm thời là lệnh gán)
Bước 2: Khi còn chưa hết chai thì nhày sang bước 3:
Bước 3: Mỗi thằng một chén, trăm phần trăm
Bước 4: Nếu thằng nào xỉn, thì loại nó ra khỏi trận chiến (lệnh rẽ nhánh)
Bước 5: Nếu tất cả đều xỉn: tàn cuộc (lệnh rẽ nhánh), còn nếu không thì tiếp tục
Bước 6: Nếu hết một chai thì nhảy về bước 1 (Lệnh lặp)

OK, đến giờ thì chắc bạn đã hiểu qua một chút. Bây giờ chúng ta sẽ ứng dụng chúng vào PHP.
Phần về các câu lệnh cơ bản trong PHP được chia làm 2 bài là Các câu lệnh rẽ nhánh và các câu
lệnh lặp. Bài này tập trung vào việc xử lý câu lệnh gán và rẽ nhánh.

1. Lệnh gán

Lệnh này đã được học ở bài trước:


Cú pháp:
$ten_bien = gia_tri;
Ví dụ:

$ngay_sinh="1/4/1980";
$que_quan="Thanh Hoa";
$luong=300000;

2. Các câu lệnh rẽ nhánh


Trong PHP có 2 dạng rẽ nhánh: rẽ hai nhánh (if) và rẽ nhiều nhánh.

Lệnh rẽ nhánh là một trong những câu lệnh quan trọng nhất của tất cả các ngôn ngữ lập trình. Nó
cho phép bạn thực thi một đoạn mã khi mà điều kiện chỉ định là đúng.

Trong PHP, lệnh rẽ nhánh có dạng sau:


if (điều kiện)
{
công việc cần làm
}
Ví dụ:
if ($name="Sinh")
{
echo ("Good morning, my boss");
}
Nếu khối câu lệnh cần làm chỉ bao gồm duy nhất một dòng lệnh, ta có thể bỏ cặp dấu {} :

if ($name="Sinh")
echo ("Good morning, my boss");
Nhưng nếu nhiều hơn một dòng lệnh, ta phải đưa chúng vào cặp dấu ngoặc {}:

if ($name=="Sinh")
{
echo ("Good morning, my boss");
echo ("Have a romantic day!");
}

Đoạn lệnh trên sẽ kiểm tra nếu điều kiện biến $name = "Sinh" thì nó sẽ hiển thị lời chào. Còn
nếu không thì nó không làm gì cả!

Điều kiện đặt vào có thể là đúng, có thể là sai, có thể là tổng hợp của nhiều điều kiện. Hãy xem
ví dụ sau:

if ("false" )
echo ("Khong co gi ca");

if (($name=="sinh") && ($pass=="test"))


echo ($name. "đã nhập đúng password");

Đoạn lệnh trên có thể viết tương đương với:

if ($name=="sinh")
{
if ($pass=="test")
echo ($name. "đã nhập đúng password");
}

Như bạn thấy ở trên, trong một câu lệnh, chúng ta có thể chèn nhiều đoạn lệnh khác, người ta gọi
đó là cấu trúc khối, tức là trong một khối lệnh, có thể có chứa nhiều khối lệnh con khác. Nếu bạn
phải đọc mã nguồn của người khác, hi vọng bạn không bị hoa mắt vì hàng chục khối lệnh chen
chúc vào nhau như vậy.
Chúng ta có thể sử dụng các toán tử &&, || hay xor để kết nối các điều kiện với nhau như bạn
thấy ở trên

Câu lệnh rẽ nhánh đầy đủ:

Nếu điều kiện kiểm tra trả về false (sai), PHP cho phép chúng ta chỉ định thực thi một khối mã
lệnh khác bằng từ khoá else
Ví dụ:
if (($name=="sinh") && ($pass=="test"))
{
echo ("Good day, ".$name);
}
else
{
echo {"Sai mat khau!")
}

Chú ý đến một ngoại lệ sau: Trước từ khoá else không bao giờ có dấu chấm phẩy (.

Lệnh rẽ nhiều nhánh:

Với câu lệnh if, PHP cho phép chúng ta rẽ nhiều nhánh thông qua từ khoá elseif:

if (dieu_kien1)
{
doan_lenh_1;
}
elseif (dieu_kien_2)
{
doan_lenh_2
}
elseif (dieu_kien_3)
} // bao nhiêu từ khoá elseif cũng được
else
{
doan_lenh_n
}

Ví dụ:

if ($thu==2)
{
echo ("Chao co, van, su, ly");
}
elseif ($thu==3)
{
echo (" Hoa, Sinh, Dia, GDCD");
}
elseif ($thu==4)
{
echo ("KTCN, Van, Toan, Tieng Anh");
}
elseif ($thu==5)
{
echo (" Hoa, Toan, Van, Tin");
}
elseif ($thu==6)
{
echo ("Toan, Van, Anh, Sinh hoat");
}
else
{
echo ("Duoc di choi");
}

Trong ví dụ trên, chúng ta đã lặp đi lặp lại thao tác kiểm tra giá trị của biến $thu, mặc dù nó
không thay đổi qua các dòng. Để khắc phục sự dài dòng này, PHP cho phép ta sử dụng câu lệnh
switch. Câu lệnh này sẽ được sử dụng để kiểm tra khi muốn xem xét qua nhiều giá trị của một
biến:

switch ($bien){
Case gia_tri 1:
doan_lenh_1;
break;
Case gia_tri 2:
doan_lenh_2;
break;
Case gia_tri n:
doan_lenh_n;
break;
default:
doan_lenh_khac;
}

Ví dụ:

switch ($thu){
case 2:
echo ("Chao co, van, su, ly");
break;
case 3:
echo (" Hoa, Sinh, Dia, GDCD");
break;
case 4:
echo ("KTCN, Van, Toan, Tieng Anh");
break;
case 5:
echo (" Hoa, Toan, Van, Tin");
break;
case 6:
echo ("Toan, Van, Anh, Sinh hoat");
break;
default:
echo ("Duoc di choi");
}

Câu lệnh switch sẽ ước lượng giá trị của biến $thu, và so sánh nó với giá trị của mệnh đề case.
Khi một giá trị hợp lệ được tìm thấy, nó sẽ thực hiện câu lệnh tương ứng với giá trị đó. Còn nếu
không, nó sẽ tự động thực hiện câu lệnh trong mệnh đề default. Hãy chú ý rằng mệnh đề defaul
là tuỳ chọn (bạn có thể có nó hoặc không cần nó)

Chú ý: Sau mỗi mệnh đề trong câu lệnh switch, cần phải sử dụng câu lệnh break. Nếu không thì
chương trình sẽ ... thực thi tất tần tật các đoạn mã lệnh nằm trong câu lệnh switch.
Lệnh điều khiển vòng lặp

Điều khiển vòng lặp, tức là bạn điều khiển chương trình của bạn tự động thực hiện một đoạn mã lệnh nào
đó lặp đi lặp lại nhiều lần (lặp một số lượng lần nào đó, hoặc lặp cho đến khi thoả mãn một điều kiện nào
đó).

PHP cung cấp cho chúng ta hai kiểu vòng lặp: vòng lặp while (lặp kiểm tra điều kiện, cho đến khi điều
kiện được thoả mãn) và vòng lặp for (xác định số lần lặp lại)

a) Vòng lặp while

Vòng lặp while là một dạng vòng lặp đơn giản nhất, cấu trúc của nó gần giống như lệnh if:

while (điều kiện)


{
//Khoi cau lenh can lap
}

Vòng lặp while sẽ ước lượng một biểu thức giá trị kiểu boolean (đúng hoặc sai).Nếu giá trị của biểu thức
là false, đoạn mã trong cặp dấu ngoặc (đoạn mã cần lặp) sẽ được bỏ qua và nhảy đến đoạn mã sau vòng
lặp. Nếu giá trị của nó là true, đoạn mã trong cặp dấu ngoặc sẽ được thực thi. Khi bắt gặp dấu ngoặc ôm
("}") , điều kiện kiểm tra sẽ được tính toán lại, và nếu giá trị vẫn là true, đoạn mã trong ngoặc lại tiếp tục
được thực thi. Chú ý rằng điều kiện lặp chỉ được tính toán tại thời điểm bắt đầu lặp. Vì vậy, dù điều kiện
lặp có bị thay đổi trong quá trình thực thi đoạn lệnh trong cặp dấu {} thì đoạn lệnh đó vẫn được tiếp tục
thực hiện cho đến hết. Muốn dừng lại ở một vị trí xác định nào đó trong khối câu lệnh, chúng ta sử dụng
lệnh break:
Ví dụ1: Tính tổng từ 1 đến 5:

<?php
$i=0;
$tong=0;
while ($i<=5)
{
$tong=$tong+$i;
$i+=1;
}
?>

Ví dụ 2: Đoạn mã sau sẽ hiển thị trên trình duyệt 3 ô textbox (Với điều kiện bạn phải save nó dưới một
file *.php :

<HTML>
<TABLE>
<BODY>
<?php
$i=1;
while ($i<=3)
{
?>
<TR><TD> <INPUT type="text"> </TD></TR>
<?php
$i+=1;
}
?>
</table>
</body>
</html>

b. Vòng lặp do...while

Vòng lặp này giống như vòng lặp while, nhưng thay vì kiểm tra điều kiện vào lúc đầu của đoạn lệnh cần
lặp, thì nó lại kiểm tra giá trị điều kiện vào cuối vòng lặp. Điều này có nghĩa là nó luôn luôn thực hiện
đoạn lệnh cần lặp ít nhất một lần.

Cấu trúc của nó như sau:

do
{ Đoạn (khối) câu lệnh cần lặp
} while (điều kiện);

Ví dụ:
<HTML>
<TABLE>
<BODY>
<?php
$i=1;
do
{
?>
<TR><TD> <INPUT type="text"> </TD></TR>
<?php
$i+=1;
}while ($i<=3);
?>
</table>
</body>
</html>

Để xác định lại sự khác nhau của 2 câu lệnh trên, đơn giản bạn chỉ việc thay điều kiện $i<=3 thành $i<1,
bạn sẽ thấy hai kết quả khác nhau liền . Phần này dành cho bạn tự ngồi nghĩ. OK???

Quên mất, lúc nãy tôi đề cập đến lệnh break, nhưng chưa cho ví dụ, bây giờ chúng ta hãy xem xét ví dụ
sau:

Các bạn biết rằng giai thừa là một con số lớn kinh khủng, và chương trình của chúng ta sẽ tính toán n giai
thừa, với số n được gửi đến theo địa chỉ url: http://dia_chi_trang_web_cua_ban/giaithua.php?n=xx (ở đó
x là một số do người dùng tự nhập)

Do giai thừa là một con số cực kỳ lớn, nên chúng ta chỉ cho phép người dùng tính đến tối đa là 8 giai thừa
chẳng hạn. Nếu họ nhập lớn hơn 8 thì sao? Hãy xem đây:

<HTML>
<?php
// Ghi lai voi ten file la giaithua.php
$giaithua=1;
$i=1;
while ( $i<=$n)
{
$giaithua*=$i;
$i+=1;
if ($i>8 )
{
echo ("Chi tinh den 8! <BR>");
break;
}
}
echo ("Ket qua la: ".$giaithua);
?>
</HTML>

Đoạn mã trên chỉ cho phép tính đến 8 giai thừa, nếu người dùng nhập một con số lớn hơn 8 thì máy sẽ
hiển thị 8 giai thừa, còn nếu nhỏ hơn thì vẫn chạy tốt.

c) Vòng lặp for.

Vòng lặp for, với ý nghĩa đầu tiên là lặp với số lần định trước, có cấu trúc như sau:

for ( $biến = giá_trị_đầu; $biến < (hay <=) giá_trị_kết_thúc; tăng_biến_đếm)


{
// Khối câu lệnh
}

Biểu thức $biến=giá_trị_đầu, đảm bảo biến được gán một giá trị khởi đầu (1)
Biểu thức $biến< (hay <=) giá_trị_kết_thúc, sẽ xác định xem biến đã đạt đến giá trị kết thúc (tức là điều
kiện lặp không còn đúng nữa) chưa (2)
Biểu thức tính toán tăng_biến_đếm đảm bảo để sau một số lần lặp nào đó thì biểu thức xác định điều kiện
(2) sẽ dẫn đến kết quả sai (để thoát khỏi vòng lặp).

Ví dụ:
for ( $i = 1; $i <10; ++$i)
{
echo ("Giá trị của biến \$i là: ".$i);
}

Một biến dạng khác của vòng lặp for, gần giống như lệnh rẽ nhánh if và while:

for (bieu_thuc_1; bieu_thuc_2; bieu_thuc_3):


// Khối câu lệnh
endfor;

Ví dụ:

<?php
for ($i=1; $i<=10;++$i)
?>
<TR><TD> <INPUT type="text"> </TD></TR>
<?php
endfor
?>

OK, Như vậy các bạn đã học qua các lệnh cơ bản nhất của php, và cũng là các lệnh cơ bản của tất cả các
ngôn ngữ lập trình (gán, rẽ nhánh và lặp). Sau này nếu phải triển khai trên các ngôn ngữ lập trình khác,
cách viết các lệnh này có thể khác nhau, nhưng bản chất của chúng thì mãi mãi không bao giờ thay đổi.

Mảng ( Arrray) toàn tập

Là một danh sách các phần tử có cùng kiểu dữ liệu.Mảng có thể là mảng một chiều hay nhiều
chiều. Mảng có 2 thành phần là chỉ mục (key) và giá trị. Chỉ mục có thể là số nguyên hoặc là
chuỗi . Bạn có thể khởi tạo mảng bằng các cách như sau:
$arr[key] = value;
$arr[] = value;
$arr= array($key1 =>value1,$key2=>value2);
$arr = array(value1, value2);
Như đã giới thiệu thì mảng có thể dùng số nguyên hoặc chuỗi để làm chỉ mục , ta tạm thời phân
loại ra nhu sau:

1.Mảng một chiều có chỉ mục: là mảng được quản lý bằng cách sử dụng chỉ số dưới kiểu
integer để biểu thị vị trí của giá trị yêu cầu.Cú pháp: $name[index1];
Ví dụ: một mảng một chiều có thể được tạo ra như sau:
$meat[0]="chicken";

$meat[1]="steak";

$meat[2]="turkey";

Nếu bạn thực thi dòng lệnh sau: print $meat[1]; thì trên trình duyệt sẽ hiển thị dòng sau: steak.

Bạn cũng có thể sử dụng hàm array( ) của PHP để tạo ra một mảng.Ví dụ:

$meat=array("chicken","steak","turkey");

Lưu ý : Khác với các ngôn ngữ lập trình khác ( nhu Pascal chẳng hạn) , phần tử đầu tiên của
mảng có chỉ mục là 0 , không phải 1 . Nhưng khi khai báo mảng , chỉ mục khởi đầu không nhất
thiết là 0 .
ví dụ bạn tạo mảng thế này
$meat = array("chicken","steak","tukey");
Để lấy phần tử đầu tiên bạn sẽ gọi
echo $meat[0];
Nhưng nếu khia báo thế này
$arr[5] = 1;
thì chỉ mục tiếp theo là 6.

$arr[] = 3; // key là 6 nhá.

Nhớ kỹ đều này nhá , lúc đầu tớ cũng bị PHP lừa về chuyện này đấy ( do trước đây chỉ học
Pascal).

2.Mảng một chiều kết hợp: rất thuận lợi khi dùng để ánh xạ một mảng sử dụng các từ hơn là sử
dụng các số ( integer), nó giúp ta giảm bớt thời gian và các mã yêu cầu để hiển thị một giá trị cụ
thể.
Ví dụ: bạn muốn ghi lại tất cả các thức ăn và các cặp rượu ngon trong việc ăn nhậu của mình.

$annhau["ruou"] = "Minh Mạng Tửu";

$annhau["khaivi"] = "Lạc rang";

$annhau["Trangmieng"] = "Chuối";

Một cách khác là bạn có thể sử dụng hàm array( ) của PHP để tạo ra một mảng loại này, ví dụ
như sau:

$annhau = array( "ruou" => "Minh Mạng Tửu", "khaivi" => "Lạc Rang", "trangmieng" =>
"Chuối");

Khi truy xuất phần tử mảng :


echo $annhau["ruou"];

Sẽ xuất ra : Minh Mạng Tửu

3.Mảng nhiều chiều có chỉ mục: chức năng của nó cũng giống như mảng một chiều có chỉ mục,
ngoại trừ việc nó có thêm một mảng chỉ mục được dùng để chỉ định một phần tử. Cú pháp:
$name[index1] [index2]..[indexN];

Một mảng hai chiều có chỉ mục được tạo ra như sau:

$position = $chess_board[5][4];

4.Mảng đa chiều kết hợp: khá hữu ích trong PHP. Giả sử bạn muốn ghi lại các cặp rượu-thức
ăn, không chỉ loại rượu, mà cả nhà sản xuất. Bạn có thể thực hiện như sau:

$pairings["Martinelli"] ["zinfandel"] = "Broiled Veal Chops";

$pairings["Beringer"] ["merlot"] = "Baked Ham";


$pairings["Jarvis"] ["sauvignon"] = "Prime Rib";

--------------

Hết phần khái niệm , tiếp theo là giới thiệu các hàm để truy xuất mảng
Để truy xuất hay nhập giá trị cho 1 phần tử mảng cụ thể , bạn có thể gọi trực tiếp chúng như sau:
$arr = $mang[1];
hoặc
$arr = $dothi["x"];

Cú pháp là tên mảng[chỉ mục]

Tips : Để xóa 1 phần tử ra khỏi mảng , ta dùng unset()


Ví dụ
$arr = array(1,2,3,4);
unset($arr[2]);
// $arr bay giờ là array(1,2,4);

Để điếm các phần tử của mảng , dùng hàm count()


$arr = array(1,2,3,4);
$so = count($arr); // đố bạn bằng bao nhiu ?

Để duyệt qua hết tất cả các phần tử của mảng (truy xuất hoặc nhập giá trị) ta dùng các cách sau:
Cách thứ nhất , dùng vòng lập for
Nếu biết trước số phần tử của mảng ta có thể dùng vòng lặp for để duyệt qua các phần tử mảng:
Code:
<?php
$giatri = array(1,2,3,4,5,6,7,8,9,10);
for ($i = 0; $i < 10 ; $i ++)
echo $giatri[$i]."<br>";
?>
Chạy đoạn mã trên PHP sẽ xuất ra từ 1 đến 10 .

Để nhập giá trị vào thì cũng thế nhá


Ví dụ
Code:
<?php

for ($i = 0; $i < 10 ; $i ++)


echo $giatri[$i] = $i +1 ;
?>
Cách thứ 2 : Dùng Foreach
Cú pháp :
Quote
foreach (array_expression as $value)
statement
foreach (array_expression as $key => $value)
statement
Ví dụ
Code:
<?php
$giatri = array(1,2,3,4,5,6,7,8,9,10);
foreach ($giatri as $value)
echo $value."<br>";
?>

Với foreach này để nhập giá trị vào ta phải thêm dấu " &" trước biến $value , như thế này
&$value
Code:
<?php
$arr = array(1, 2, 3, 4);
foreach ($arr as &$value) {
$value = $value * 2;
}
// $arr is now array(2, 4, 6, 8)
?>

Thêm 1 ví dụ nữa , lần này sẽ có sự xuất hiện của chỉ mục


Code:
<?php
$arr = array("mot"=>"one", "hai"=>"two","ba"=> "three");
foreach ($arr as $key => $value) {
echo "Key: $key; Value: $value<br />\n";
}
?>

Một cách khác để làm như trên ta sẽ dùng vòng lặp while đi với list() và each(). Xét ví dụ sau ,
thay vì dùng foreach như trên thì ta dùng while như sau:

Code:
<?php
$arr = array("one", "two","three");
while (list($key, $value) = each($arr)) {
echo "Key: $key; Value: $value<br />\n";
}
?>
Lưu ý , list() chỉ hoạt động với mảng có chỉ mục là số và phần tử khởi đầu của mảng có chỉ mục
là 0 ( PHP manual nói thế)
List sẽ gán giá trị cho biến được khai báo bên trong hàm list với giá trị là giá trị tương ứng của
mảng.
Còn hàm each() sẽ trả về giá trị chỉ mục và giá trị của phần tử mảng hiện tại , đồng thời chuyển
vị trí của chỉ mục lên 1 đơn vị , sẽ trả về False nếu vị trí của chỉ mục là vị trí cuối cùng trong
mảng.Cặp giá trị trả về này sẽ nằm trong 1 mảng 4 phần tử là 0,1 , key, value . Phần tử 0 và key
chứa tên chỉ mục của mảng, phần tử 1 và value tất nhiên sẽ chứa giá trị .
Có thể chỉ sử dụng while và each thôi cũng được
Code:
<?php
$arr = array("one", "two","three");
while ($phantu = each($arr)) {
echo "Key: $phantu['key']; Value: $phantu['value']<br />\n";
}
?>

Đối với mảng nhiều chiều thỉ cách làm cũng tương tự, chỉ phức tạp hơn là thêm 1 vòng lặp nữa.

Code:
<?php
$sanpham = array( array("ITL","INTEL","HARD"),
array("MIR", "MICROSOFT","SOFT"),
array("PHP", "PHPVN.ORG","TUTORIAL")
);
for ($row = 0; $row < 3; $row++)
{
for ($col = 0; $col <3; $col++)
{
echo "|".$sanpham[$row][$col];
}
echo "<br>";
}
?>

Re: Mảng ( Arrray) toàn tập

Sắp xếp mảng

Do PHP lưu trữ các phần tử trong mảng theo thứ tự chúng được đưa vào mảng, chính vì vậy đôi
lúc sẽ nảy sinh nhu cầu sắp xếp các phần từ trong mảng. Để sắp xếp ta có thể dùng các hàm có
sẵn của PHP, tiêu biểu là hàm sort
Code:
<?php
$arr = array(5, 3, 6, 4, 2, 1);
var_dump($arr);
echo "<br/>\n";
sort($arr);
var_dump($arr);
?>

Kết quả thu được sẽ là:


Quote
array(6) {
o => int(5) [1]=> int(3) [2]=> int(6) [3]=> int(4) [4]=> int(2) [5]=> int(1) }

array(6) {

o => int(1) [1]=> int(2) [2]=> int(3) [3]=> int(4) [4]=> int(5) [5]=> int(6) }

Các bạn có thể thấy là các giá trị đã được sắp xếp tăng dần tuy nhiên các key cũng đã bị thay đổi.
Để dữ nguyên các key ban đầu, ta sử dụng hàm asort. Thay thế hàm sort trong ví dụ bằng asort
thì sẽ thu được kết quả như sau:

Quote
array(6) {

o => int(5) [1]=> int(3) [2]=> int(6) [3]=> int(4) [4]=> int(2) [5]=> int(1) }

array(6) { [5]=> int(1) [4]=> int(2) [1]=> int(3) [3]=> int(4)

o => int(5) [2]=> int(6) }

Các hàm này cũng sẽ làm việc tốt đẹp với các xâu kí tự, tuy nhiên với 1 mảng có các giá trị
"report1.pdf", "report5.pdf", "report10.pdf", and "report15.pdf" thì kết quả thu được sẽ là:
Quote
"report1.pdf", "report10.pdf", "report15.pdf", "report5.pdf"

Đơn giản là vì mã ASCII của "1" nhỏ hơn "5" nên kết quả sẽ ra như vậy. Để giải quyết vấn đề
này, thay vì sort và asort ta sử dụng natsort hoặc natcasesort. Kết quả thu được sẽ là:

"report1.pdf", "report5.pdf", "report10.pdf", "report15.pdf"

Sắp xếp mảng nâng cao

Giả sử bạn có mảng nhiều chiều sau:

Code:
<?php
$bikes = array();
$bikes["Tourmeister"] = array("name" => "Grande Tour Meister",
"engine_cc" => 1100,
"price" =>12999);
$bikes["Slasher1000"] = array("name" => "Slasher XYZ 1000",
"engine_cc" => 998,
"price" => 11450);
$bikes["OffRoadster"] = array("name" => "Off-Roadster",
"engine_cc" => 550,
"price" => "4295");
?>
Khi muốn sắp xếp mảng $bikes theo price của mỗi phần tử thì làm thế nào? Không thể dùng các
hàm ở trên được! Vậy giải pháp duy nhất là ta sẽ phải tự sắp xếp

Code:
<?php
function compare_price($in_bike1, $in_bike2)
{
if ($in_bike1["price"] > $in_bike2["price"])
{
return 1;
}
else if ($in_bike1["price"] == $in_bike2["price"])
{
return 0;
}
else
{
return -1;
}
}

uasort($bikes, "compare_price");
foreach ($bikes as $bike)
{
echo "Bike {$bike['name']} costs \${$bike['price']}<br/>\n";
}
?>

Trong ví dụ trên, mấu chốt chính là ở hàm uasort, hàm này sẽ so sánh từng giá trị trong mảng với
nhau bằng hàm so sánh compare_price. Hàm này sẽ so sánh 2 giá trị được đưa vào là $in_bike1
và $in_bike2 rồi trả lại 1 trong 3 giá trị: 1, 0 hoặc (-1) khi so sánh price của $in_bike1 và
$in_bike2. Sau cùng ta sẽ thu được kết quả:
Quote
Bike Off-Roadster costs $4295
Bike Slasher XYZ 1000 costs $11450
Bike Grande Tour Meister costs $12999

Sắp xếp ngược lại

Trong các phần trên ta đều thấy sắp xếp tăng dần, vậy để sắp xếp giảm dần thì làm thế nào? Ta
có thể sử dụng rsort và arsort thay thế cho sort và asort. Chú ý là không có ursort! Để sắp xếp
ngược lại bạn chỉ cần đảo ngược thứ tự trong hàm so sánh của mình

Sắp xếp theo key

Để sắp xếp theo key, ta có các hàm ksort, krsort, và uksort. Sắp xếp theo key sẽ luôn giữ nguyên
các key vì vậy không có kasort. Các giá trị đi kèm mỗi key cũng sẽ được giữ nguyên

Các hàm khác


array_merge
Hàm này sẽ nhận vào 2 mảng và trả lại 1 mảng trong đó bao gồm tất cả các giá trị của 2 mảng
ban đầu. Các key sẽ được giữ nguyên trừ trường hợp:

2 mảng có 1 key là xâu kí tự giống nhau, thì giá trị của mảng thứ nhất sẽ bị ghi đè bằng giá trị
của key đó ở mảng thứ hai
Ở mảng thứ hai nếu trùng các key là số nguyên với mảng thứ nhất, thì các giá trị của mảng thứ
hai sẽ nhận 1 key mới (không ghi đè)
Xét ví dụ:

Code:
<?php
$ar1 = array('name' => 'Zeke', 10, 100);
$ar2 = array('name' => 'Zimbu', 2, 3, 4);

$newar = array_merge($ar1, $ar2);

print_r($newar);
?>

Kết quả thu được sẽ là:

Quote
Array (
[name] => Zimbu

o => 10

[1] => 100


[2] => 2
[3] => 3
[4] => 4
)

array_combine

Hàm này nhận vào 2 mảng rồi trả lại 1 mảng, trong đó các key là các giá trị của mảng thứ nhất,
các giá trị là từ mảng thứ hai. Nếu 2 mảng không có cùng số phần tử sẽ báo lỗi. Xét ví dụ sau:

Code:
<?php
$ar1 = array('name', 'age', 'height');
$ar2 = array('Bob', 23, '5\'8"');

$newary = array_combine($ar1, $ar2);

print_r($newary);
?>

Kết quả thu được sẽ là:

Quote
Array (
[name] => Bob
[age] => 23
[height] => 5'8"
)

array_intersect

Hàm này nhận vào 2 mảng rồi trả lại các phần tử cùng có ở 2 mảng. Các key sẽ được giữ
nguyên, nếu cùng 1 giá trị mà lại có 2 key khác nhau thì key ở mảng thứ nhất sẽ được sử dụng.
Xét ví dụ sau:

Code:
<?php
$ar1 = array('name' => 'Zeke', 10, 100);
$ar2 = array('eeek' => 'Zeke', 2, 3, 4, 10);

$newar = array_intersect($ar1, $ar2);

print_r($newar);
?>

Kết quả thu được (đoán trước rồi hãy đọc xem có đúng kô nhé )
Quote
Array (
[name] => Zeke

o => 10

array_search
Khi bạn cần tìm 1 giá trị trong mảng thì sử dụng hàm này. Cấu trúc rất đơn giản:

Code:
<?php
$ar1 = array(1, 10, 100, 23, 44, 562, 354);

var_dump(array_search(100, $ar1));
var_dump(array_search(3333, $ar1));
?>

Và đây là kết quả:

Quote
int(2)
bool(false)

Cách lấy thông tin từ trình duyệt: GET, POST và COOKIE

Dữ liệu của người dùng từ trình duyệt sẽ được gửi lên máy chủ dưới dạng từng cặp biến=giá_trị
và có thể đi theo 3 con đường khác nhau. Tuỳ theo từng con đường cụ thể, trên máy chủ ta cũng
có các cách khác nhau để lấy dữ liệu được gửi lên.. 3 con đường đó là: GET, POST và
COOKIES. Vậy GET, POST và COKIES là gì?

1. Truyền dữ liệu thông qua phương thức GET


Dữ liệu gửi từ trình duyệt lên qua phương thức GET là phần dữ liệu được nhập trực tiếp theo sau
địa chỉ URL do trình duyệt gửi lên, được phân biệt với tên file script bằng dấu hỏi chấm (?). Ví
dụ, khi ta gõ vào trình duyệt địa chỉ URL sau:

http://www.phpvn.org/topic.php?TOPIC_ID=161
Khi đó, trình duyệt sẽ gửi theo địa chỉ trên một cặp biến = giá trị, trong đó biến có tên là
TOPIC_ID và giá trị là 161 (TOPIC_ID=161).
Chúng ta cũng có thể đưa lên nhiều cặp biết=giá_trị bằng cách phân cách chúng bởi dấu &:
http://www.phpvn.org/index.php?method=Reply&TOPIC_ID=161&FORUM_ID=20
Với địa chỉ URL trên, chúng ta sẽ gửi lên 3 cặp biến=giá_trị theo phương thức GET, đó là:
method=Reply, TOPIC_ID=161 và FORUM_ID=20.
Khi trình duyệt gửi các thông tin này lên máy chủ, PHP sẽ tự động sinh ra một mảng có tên là
$_GET[] để nắm giữ tất cả các cặp biến và giá trị đó, trong đó, chỉ số của mảng chính là một
chuỗi mang tên của tên biến và giá trị của chỉ số đó chính là giá trị của biến do trình duyệt gửi
lên. Ví dụ, với địa chỉ URL sau:

http://www.phpvn.org/post.php?method=Reply&TOPIC_ID=161&FORUM_ID=20

Thì PHP sẽ tự động sinh ra một mảng $_GET có nội dung sau:
$_GET["method"] = "Reply" // tương ứng với cặp method=Reply
$_GET["TOPIC_ID"] = 161 // tương ứng với cặp TOPIC_ID=161
$_GET["FORUM_ID"] = 20 // tương ứng với cặp FORUM_ID=20
Sau đó, trong trang web của mình, các bạn có thể tha hồ sử dụng các biến này. Ví dụ, tôi làm một
đoạn chương trình sau để khi người dùng nhập vào biến user=sinh thì cho hiển thị "Hello, my
Boss", còn nếu biến user khác sinh thì "Hello " + giá trị của biến:

Code:
<?
// Hàm isset được sử dụng để kiểm tra xem một biến đã được thiết lập hay chưa
if (isset ($_GET["user"]))
{
if ($_GET["user"]=="sinh")
{
echo "Hello, my boss. Good morning!";
}
else
{
echo "Hello, " . $_GET["user"] . ". Good morning!";
}
}
else
{
echo "Hello, guest. How do you do?";
}
?>

OK, bây giờ hãy save lại. Giả sử tôi lưu với tên là welcome.php trong thư mục www. Mở trình
duyệt lên, gõ vào ô Address dòng chữ sau:
http://localhost/welcome.php?user=sinh

Hãy xem kết quả hiển thị trên màn hình, sau đó thay chữ sinh bằng một cái tên gì đó xem kết quả
ra sao.

II. Phương thức POST

Post là phần dữ liệu được gửi qua các form HTML có method ="POST" (xin xem lại bài về
HTML).

Để lấy các biến theo kiểu POST, PHP sẽ tự động sinh ra mảng có tên là $_POST[]. Mảng này có
chỉ số chính là tên của các phần tử trong form (các thẻ input, select... có thuộc tính name) và giá
trị là nội dung giá trị do người sử dụng nhập vào các phần tử có tên tương ứng. Chẳng hạn với
mẫu biểu HTML sau:

Code:
<form method="POST">
<p>
User Name:<input type="text" name="T1" size="20"> </p>
<p>
Password:
<input type="password" name="T2" size="20"></p>
<p>Sex: <Select name ="sex">
<option value =1>Male </option>
<option value =0>Female </option>
</select>
</p>
<input type="submit" value="Gui di" name="B1">
</form>

Khi người dùng nhập user name (giả sử là Sinh), password (giả sử là 123456) và chọn sex là
Male, khi đó, mảng $_POST sẽ có các phần tử sau:
$_POST["T1"] = Sinh
$_POST["T2"] = 123456
$_POST["sex"] = 1

Sau khi lấy được các giá trị này rồi, các bạn có thể thoải mái sử dụng.

Đây là ví dụ một chương trình giải phương trình bậc nhất (cho nó đơn giản )

Code:
<form method="POST">
<p style="margin-top: 0; margin-bottom: 0">
Nhập a:<input type="text" name="a" size="20"></p>
<p style="margin-top: 0; margin-bottom: 0">Nhập b:<input type="text"
name="b" size="20"></p>
<p style="margin-top: 0; margin-bottom: 0">
<input type="submit" value="Tính" name="B1"></p>
</form>
<?
$a=0;
$b=0;
if (isset ($_POST["a"]))
{
$a =$_POST["a"];
}
if (isset ($_POST["b"]))
{
$b =$_POST["b"];
}
if ($a<>0)
{
echo "<BR>Nghiem la: " . $b/$a;Chỗ này là -$b/$a
}
else
{
if ($b==0)
{
echo "<BR>Vo so nghiem";
}
else
{
echo "<BR>Vo nghiem";
}
}
?>

Bây giờ hãy làm cốc cafe hoặc trà đá cho tỉnh táo.

III Cookie và cách sử dụng Cookie


Cookies là một phần dữ liệu được lưu trên máy khách. Mỗi khi máy khách gửi một yêu cầu tới
máy chủ nào đó, thì nó sẽ gửi phần dữ liệu được lưu trong cookie tương ứng với máy chủ đó.

Trong Cookie có một số thông số sau:


- Địa chỉ URL mà trình duyệt sẽ gửi cookie tới
- Thời gian hết hạn của cookie
- Các cặp biến:giá trị được lưu trữ liên tục

Người ta thường dùng cookies để lưu trữ các thông tin có liên quan đến nhiều "phiên" làm việc
khác nhau. Vi giao thức HTTP là giao thức không lưu trạng thái (Mỗi khi xử lý xong một yêu
cầu từ máy khách là nó phủi tay tự ngắt kết nối luôn và chẳng thèm quan tâm đến máy khách làm
gì ), nên cookies được sinh ra để làm nhiệm vụ lưu trữ một số biến trạng thái để khắc phục nhược
điểm này.

Khác với dữ liệu gửi từ form (Post hay Get) thì cookies sẽ được trình duyệt tự động gửi đi theo
mỗi lần truy cập lên máy chủ. Trong quá trình làm việc, cookie có thể bị thay đổi giá trị. Cookie
sẽ bị vô hiệu hoá nếu cửa sổ trình duyệt điều khiển cookie đóng lại và cookie hết thời gian có
hiệu lực. Theo mặc định, thời gian "sống" của cookies là tồn tại cho đến khi cửa sổ trình duyệt sử
dụng cookies bị đóng. Tuy nhiên người ta có thể thiết lập tham số thời gian để cookie có thể
sống lâu hơn (6 tháng chẳng hạn). Ví dụ như chế độ Remember ID & Password của 1 số trang
web.

Cách ghi thông tin vào cookie và gửi xuống trình duyệt
Trong PHP, để gửi cookie xuống trình duyệt, ta có thể sử dụng hàm setcookie:
setcookie ( string name [, string value [, int expire [, string path [, string domain [, int secure]]]]])

Trong đó:
- string name: Chuỗi mang tên của cookie
- string value: Chuỗi mang giá trị của cookie tương ứng với tên đã cho
- int expire: Thời gian hết hạn của cookie
- string path: Đường dẫn của cookie (đến 1 thư mục nào đó trên máy chủ. Tham số này cho biết
cookie sẽ chỉ được truyền đi nếu như trang web mà trình duyệt yêu cầu nằm trên thư mục đó,
thay vì lúc nào cũng phải gửi đi tới bất kỳ khu vực nào).
- string domain: cookie này sẽ được gửi tới domain nào?
- int secure: Chế độ bảo mật.

Các tham số trong cặp dấu ngoặc vuông là tuỳ chọn

Ví dụ: setcookie ("ten_truy_cap","lan gio vo tinh");

Chú ý: Hàm setcookie phải được gọi trước khi bạn gửi bất kỳ một nội dung nào xuống
trình duyệt:

VD: Cách dùng đúng:


Code:
// Thực hiện các câu lệnh nào đó, nhưng không được phép gửi gì xuống trình
duyệt
setcookie ("ten_truy_cap","lan gio vo tinh");
setcookie ("password","thumotti");
// Thực hiện các câu lệnh tiếp theo, có thể xuất dữ liệu xuống trình duyệt:

echo "<html><body>Xin chào lan gio vo tinh";

VD: Cách dùng sai:


Code:
// Thực hiện các câu lệnh nào đó
echo ("cái gì đó");
setcookie ("ten_truy_cap","lan gio vo tinh");
setcookie ("password","thumotti");
// các câu lệnh khác.

Ví dụ trên sai vì bạn đã trót gửi dòng "cái gì đó" xuống trình duyệt trước khi gọi hàm setcookie.

Cách lấy dữ liệu lưu trong cookie:

Để lấy dữ liệu đã lưu trong cookies do trình duyệt gửi lên, ta có thể dùng mảng
$_COOKIE["tên_cookie"]

Chẳng hạn, với câu lệnh setcookie ở trên, sau khi trình duyệt gửi lên, ta sẽ có 2 biến sau:
$_COOKIE["ten_truy_cap"] // chứa giá trị "lan gio vo tinh"
$_COOKIE["password"] // chứa giá trị "thumotti".

Chi tiết hơn các bạn có thể xem trong PHP Manual.
http://fr2.php.net/manual/en/language.variables.superglobals.php
_____
Note : Cập nhật thêm vởi sorivevol
Do từ php 4.1 thì có thêm $_POST, $_GET, $_REQUEST,$_COOKIE etc . & trở thành super
global variable & cũng do lý do tốc độ nên register_long_arrays thường được off, do vậy các bạn
khi sử dụng $HTPP_*_VARS sẽ có thể xảy ra 1 số lỗi.
Cho nên các bạn nên sử dụng $_POST,$_GET,$_COOKIE,etc. để lập trình.

You might also like