giáo trình PHP

88
Bài 1: Những khái niệm căn bản về mạng máy tính « on: January 18, 2007, 08:18:43 AM » Mục đích và yêu cầu: - Nắm được các khái niệm cơ bản nhất về mạng máy tính. - Biết cách cài đặt giao thức TCP/IP và web server. Yêu cầu: - Một tờ giấy trắng - Một gói café + 1 cốc nước nóng, hoặc một ít chè xanh. - Bộ cài Windows. - File phpdev.zip đi kèm tài liệu này. Bắt đầu: Bước 1: Ghi vào tờ giấy dòng chữ: "Đang bận làm việc, không tiếp khách, chỉ tiếp gái đẹp" rồi dán trước cửa hoặc trên bàn làm việc Bước 2: Pha một cốc café. Bước 3: Bắt đầu với những khái niệm: I. Khái niệm cơ bản: 1. Mạng máy tính: Là 2 hay nhiều máy tính được kết nối với nhau. 2. Máy chủ - Máy khách: Trong mạng máy tính, máy chủ (hay còn gọi là server) là một máy tính được sử dụng để các máy tính khác truy cập. Các máy tính truy cập vào 1 máy chủ được gọi là máy khách. Như vậy, 1 máy tính trong mạng có thể vừa là 1 máy chủ (khi có máy khác truy cập đến nó), vừa là một máy khách (nếu nó truy cập đến một máy tính khác). Vì vậy đừng nên nghĩ rằng máy chủ là 1 cái gì đó cao siêu cho mệt óc 3. Giao thức mạng: Các máy tính trên mạng "nói chuyện" với nhau thông qua một ngôn ngữ đặc biệt gọi là các giao thức mạng. Có rất nhiều giao thức khác nhau, mỗi giao thức có 1 nhiệm vụ riêng. Ở đây tôi tạm chia ra làm 2 nhóm giao thức: - Giao thức truyền dữ liệu, chuyên dùng để vận chuyển dữ liệu giữa 2 máy tính. - Giao thức xử lý dữ liệu, có nhiệm vụ xử lý dữ liệu nhận được từ giao thức truyền dữ liệu Túm lại: Không nên phát hoảng khi nghe thấy 2 từ giao thức. Chẳng qua nó chỉ là 1 dạng ngôn ngữ để trao đổi với nhau mà thôi. Và bạn cứ yên chí rằng nếu thích, bạn có thể tự định nghĩa ra một cái giao thức nào đó. Chẳng hạn như các chương trình chat của Yahoo, hay các chương trình remote trojan… Chúng tự đẻ ra các giao thức riêng dựa trên nền giao thức TCP/IP đấy. 4. Chùm giao thức TCP/IP Giao thức TCP/IP là 1 giao thức được sử dụng để truyền dữ liệu giữa 2 máy tính. Theo giao thức này, mỗi máy tính sẽ có 1 địa chỉ xác định trên mạng gọi là địa chỉ IP. Địa chỉ IP là một cụm chữ số có dạng a.b.c.d (a,b,c,d là các số từ 0 đến 255). VD: 174.178.0.1. Giao thức TCP/IP chỉ có nhiệm vụ duy nhất là truyền dữ liệu giữa 2 máy tính và đảm bảo giữ nguyên vẹn dữ liệu khi truyền đi. Ngoài ra nó chẳng cần biết dữ liệu đó là gì và được xử lý như thế nào.

Transcript of giáo trình PHP

Page 1: giáo trình PHP

Bài 1: Những khái niệm căn bản về mạng máy tính

« on: January 18, 2007, 08:18:43 AM »

Mục đích và yêu cầu:

- Nắm được các khái niệm cơ bản nhất về mạng máy tính.

- Biết cách cài đặt giao thức TCP/IP và web server.

Yêu cầu:

- Một tờ giấy trắng

- Một gói café + 1 cốc nước nóng, hoặc một ít chè xanh.

- Bộ cài Windows.

- File phpdev.zip đi kèm tài liệu này.

Bắt đầu:

Bước 1: Ghi vào tờ giấy dòng chữ: "Đang bận làm việc, không tiếp khách, chỉ tiếp gái đẹp" rồi dán trước cửa hoặc

trên bàn làm việc

Bước 2: Pha một cốc café.

Bước 3: Bắt đầu với những khái niệm:

I. Khái niệm cơ bản:

1. Mạng máy tính: Là 2 hay nhiều máy tính được kết nối với nhau.

2. Máy chủ - Máy khách:

Trong mạng máy tính, máy chủ (hay còn gọi là server) là một máy tính được sử dụng để các máy tính khác truy

cập. Các máy tính truy cập vào 1 máy chủ được gọi là máy khách.

Như vậy, 1 máy tính trong mạng có thể vừa là 1 máy chủ (khi có máy khác truy cập đến nó), vừa là một máy

khách (nếu nó truy cập đến một máy tính khác). Vì vậy đừng nên nghĩ rằng máy chủ là 1 cái gì đó cao siêu cho

mệt óc

3. Giao thức mạng:

Các máy tính trên mạng "nói chuyện" với nhau thông qua một ngôn ngữ đặc biệt gọi là các giao thức mạng. Có rất

nhiều giao thức khác nhau, mỗi giao thức có 1 nhiệm vụ riêng. Ở đây tôi tạm chia ra làm 2 nhóm giao thức:

- Giao thức truyền dữ liệu, chuyên dùng để vận chuyển dữ liệu giữa 2 máy tính.

- Giao thức xử lý dữ liệu, có nhiệm vụ xử lý dữ liệu nhận được từ giao thức truyền dữ liệu

Túm lại: Không nên phát hoảng khi nghe thấy 2 từ giao thức. Chẳng qua nó chỉ là 1 dạng ngôn ngữ để trao đổi với

nhau mà thôi. Và bạn cứ yên chí rằng nếu thích, bạn có thể tự định nghĩa ra một cái giao thức nào đó. Chẳng hạn

như các chương trình chat của Yahoo, hay các chương trình remote trojan… Chúng tự đẻ ra các giao thức riêng

dựa trên nền giao thức TCP/IP đấy.

4. Chùm giao thức TCP/IP

Giao thức TCP/IP là 1 giao thức được sử dụng để truyền dữ liệu giữa 2 máy tính. Theo giao thức này, mỗi máy tính

sẽ có 1 địa chỉ xác định trên mạng gọi là địa chỉ IP. Địa chỉ IP là một cụm chữ số có dạng a.b.c.d (a,b,c,d là các số

từ 0 đến 255). VD: 174.178.0.1.

Giao thức TCP/IP chỉ có nhiệm vụ duy nhất là truyền dữ liệu giữa 2 máy tính và đảm bảo giữ nguyên vẹn dữ liệu

khi truyền đi. Ngoài ra nó chẳng cần biết dữ liệu đó là gì và được xử lý như thế nào.

Dựa trên khả năng vận chuyển của giao thức TCP/IP, người ta xây dựng nên một nhóm các giao thức khác chuyên

xử lý dữ liệu nhận được từ TCP/IP, gọi là chùm giao thức TCP/IP hay họ giao thức TCP/IP.

Page 2: giáo trình PHP

Để phân chia các giao thức con trong chùm giao thức TCP/IP, người ta sử dụng một khái niệm khác gọi là Cổng

giao thức. Đây là 1 con số nguyên từ 0 đến 32767 thì phải :p. Mỗi giao thức con trong chùm giao thức sẽ chiếm

hữu một cổng riêng. Thông thường thì mỗi chương trình ứng dụng trên server sẽ chịu trách nhiệm mở một cổng

TCP/IP, định nghĩa giao thức cho cổng đó, và sau đó là lắng nghe các yêu cầu từ máy khách và xử lý các yêu cầu

đó.

Như vậy, trong hệ giao thức TCP/IP, một máy khách sẽ truy cập thành công đến máy chủ nếu như nó có địa chỉ IP

và cổng đang mở của dịch vụ trên máy chủ.

Chẳng hạn: Với 1 máy chủ quản lý web (web server), chúng ta cần phải có một ứng dụng web gọi là web server.

Ứng dụng này sẽ mở 1 cổng (mặc định là 80) và xử lý các tín hiệu đến từ cổng đó.

Bây giờ hãy nhấp 1 ngụm café cho tỉnh táo đã

II. Trang Web tĩnh và Trang Web động

1. Trang web tĩnh và trang web động

Bạn đã từng xây dựng một trang Web và đưa nó lên mạng? Trang web của bạn thật là thú vị (ít nhất là theo ý nghĩ

của bạn ) và tất nhiên bạn muốn tham khảo ý kiến của người đọc? Chẳng nhẽ bạn lại cho số điện thoại và yêu

cầu người góp ý phải gọi điện đến? Hic… Đảm bảo sẽ chẳng có ma nào thèm gọi điện.

Bạn muốn "xin" một ít thông tin về người duyệt Web… hic. Làm cách nào bây giờ???

Vâng, đó chính là nhược điểm của cái gọi là trang web tĩnh. Đó là các trang Web không cho phép bạn có thể tương

tác với người dùng (chẳng hạn như là trao đổi hay thu thập các thông tin từ phía người dùng). Nó là các trang web

có đuôi *.htm thông thường. Ngược lại, các trang Web động cho phép bạn nhận thông tin từ người dùng, xử lý

thông tin đó, và có thể đáp trả lại các yêu cầu của họ. Xem ra nó cũng linh động ra phết đấy chứ?

Để làm được điều đó, tất nhiên là bạn phải … theo dõi các bài viết này

2. Lập trình Script

Các trang web nguyên thuỷ sử dụng ngôn ngữ định dạng chuẩn là HTML (HyperText Markup Language). HTML

chuẩn chỉ bao gồm các cặp thẻ đánh dấu để định khuôn dạng của tài liệu. Tuỳ theo tên thẻ là gì mà trình duyệt sẽ

tự động hiểu và làm các công việc do thẻ đó quy định. Chẳng hạn như cặp thẻ <B>….</B> quy định đoạn văn

bản trong đó sử dụng chữ đậm. Vì vậy, trên thực tế người ta không coi nó là một ngôn ngữ (vì nó chẳng liên quan

gì đến những thứ mà ta hay gặp trong lập trình như biến, câu lệnh rẽ nhánh, lặp…). Cũng chính vì nguyên nhân

này, nó phải tự mở rộng bằng cách cho phép "nhúng" vào bản thân nó một số đoạn mã lệnh chương trình đặc

biệt, người ta thường gọi chúng là các đoạn mã Script  hay các đoạn mã nhúng . Ngôn ngữ sử dụng trong các

đoạn mã lệnh đó gọi là các ngôn ngữ Script. Các ngôn ngữ script thường đơn giản và không có nhiều sức mạnh

như các ngôn ngữ "kinh điển" cùng tên, hay nói cách khác, chúng là một phần rất nhỏ của một ngôn ngữ nào đó

được tích hợp vào trình duyệt để thực hiện một số thao tác nhất định.

Chi tiết về ngôn ngữ HTML đã có đầy rẫy trên Internet, cũng như ở các hiệu sách, nên chúng không được nhắc lại

ở đây. Nếu các bạn chưa biết gì về nó thì bạn phải tìm đọc các tài liệu về HTML trước khi tiếp tục theo dõi khoá

học này.

Lập trình Script ở máy khách

Như tên gọi của nó, lập trình script ở máy khách là viết các đoạn script chạy trên máy khách. Các đoạn mã này

được máy chủ gửi kèm trong tài liệu, đưa về máy khách và được thực hiện ở đây.

Trong tài liệu gửi về trình duyệt, các đoạn mã này thường được tìm thấy trong cặp thẻ <Script language

="xxxxxx">…</Script>.

Có nhiều ngôn ngữ script phía máy khách. Nổi tiếng hơn cả là Javascript. Kế đến là VbScript và PerlScript.

Vì tài liệu này chủ yếu tập trung vào PHP - một ngôn ngữ script chạy trên máy chủ, nên chi tiết những ngôn ngữ

Page 3: giáo trình PHP

này không được nhắc đến trong tài liệu. Riêng về JavaScript, các bạn có thể tìm thấy các tài liệu tiếng Việt qua

trang tìm kiếm Vinaseek.com. Nếu có thời gian, tôi khuyên các bạn nên tìm hiểu về chúng. Rất nhiều xảo thuật

bắt mắt có thể tìm thấy trong các đoạn mã này.

Kích chuột vào đây để tham khảo một tài liệu về JavaScript

Lập trình Script ở máy chủ

Trái ngược với lập trình Script ở máy khách (thực thi mã lệnh ở máy khách), lập trình script ở máy chủ cho phép

thực thi các đoạn mã ngay ở trên máy chủ. Không như các đoạn mã script hoạt động ở máy khách, các tài liệu có

chứa các đoạn mã script phía máy chủ thường được lưu ở các file tài liệu có đuôi mở rộng riêng biệt, và các đoạn

mã thi hành trên máy chủ cũng phải được đặt trong một cặp thẻ đặc biệt tuỳ theo quy định của chương trình xử

lý. Chú ý rằng đối với mỗi loại ngôn ngữ server script sẽ có một chương trình xử lý riêng. Chẳng hạn các đoạn mã

ASP thường được đặt trong các file *.asp, và chúng được xử lý bằng file ASP.dll.

 Chi tiết về cách thức hoạt động của loại này, có thể tóm tắt như sau:

 - Bước 1: Client gửi yêu cầu đến máy chủ

- Bước 2: Web server kiểm tra xem yêu cầu đó cần loại tài liệu nào. Nếu đó là loại tài liệu có chứa các đoạn mã

server script, nó sẽ triệu gọi chương trình xử lý tương ứng với loại tài liệu đó

- Bước 3: Chương trình xử lý sẽ thực thi các đoạn mã server script trong tài liệu đó, và trả kết quả (thường là dưới

khuôn dạng HTML) về cho web server.

- Bước 4: Web server trả kết quả tìm được cho Client và ngắt kết nối.

Bây giờ, 5 phút dành cho café. Ơ nhưng mà hết café rồi, hix, thôi đi ngủ vậy Bài 2: Cài đăt web server Apache, MySQL và PHP

« on: January 18, 2007, 08:30:59 AM »

Cài đăt web server Apache, MySQL và PHP.

1. Cài đặt giao thức TCP/IP

Các dịch vụ web server dựa  trên nền giao thức TCP/IP. Vì vậy trước khi cài đặt server, ta phải tiến hành cài đặt

giao thức TCP/IP.

Để cài đặt giao thức TCP/IP, ta vào Control Panel, chọn Network. Nếu thấy dòng chữ TCP/IP đã xuất hiện trong ô

Configuration, tức là giao thức TCP/IP đã được cài đặt trên máy. Còn nếu không, ta kích chuột vào Add. Hộp thoại

Select Component hiển thị ra. Kích chọn tiếp Protocol -> Add. Trong danh sách bên trái, chọn Microsoft. Sau đó

sang danh sách bên phải, chọn TCP/IP. Bấm Enter để bắt đầu quá trình cài đặt.

Trong quá trình cài đặt, nếu máy tính của bạn chưa có card mạng thì hệ thống sẽ yêu cầu cài một trình điều khiển

card mạng nào đó. Đừng lo, cứ chọn đại theo chỉ dẫn sẽ xong thôi.

Sau khi cài đặt xong, mở cửa sổ Command Prompt ra. Gõ lệnh

C:\ping 127.0.0.1

Nếu thấy có 4 dòng chữ có dạng:

Reply from 127.0.0.1: byte = xx time<xx ms TTL =xxx

Reply from 127.0.0.1: byte = xx time<xx ms TTL =xxx

Reply from 127.0.0.1: byte = xx time<xx ms TTL =xxx

Reply from 127.0.0.1: byte = xx time<xx ms TTL =xxx

tức là giao thức TCP/IP đã được cài đặt thành công.

 

Ghi chú: Dãy số 127.0.0.1 chính là địa chỉ IP mặc định của chính máy tính bạn đang sử dụng. Bạn cũng có thể sử

dụng cái tên localhost thay cho địa chỉ IP 127.0.0.1 để truy cập vào máy tính của chính mình.

2. Cài đặt web server, PHP, MySQL:

Trước khi cài đặt và vận hành hệ thống, hãy ngắt toàn bộ các website mặc định của IIS/PWS, và tắt luôn dịch vụ

nếu các bạn đã từng cài các webserver này. Nếu các bạn đang chạy Apache và MySQL thì cũng gỡ bỏ (uninstall)

Page 4: giáo trình PHP

đi.

Chạy chương trình phpdev423.exe để tiến hành cài đặt.

PHPDev là một phần mềm tích hợp bao gồm Web server Apache, bộ xử lý PHP, và CSDL My SQL. Các bạn có thể

tham khảo chi tiết phần mềm tại:

http://www.firepages.com.au/dev423.htm

Nhập tên thư mục cài đặt (chẳng hạn ở đây tôi chọn là c:\phpdev). Kích chọn Install để bắt đầu quá trình cài đặt: 

Sau khi cài đặt xong, các bạn đã có thể vận hành Apache, PHP và MySQL.

Để vận hành hệ thống, các bạn vào thư mục của hệ thống (c:\phpdev theo ví dụ trên), chạy file 2K-NT-XP-

phpdev_start.bat. Nếu trình duyệt hiện ra như hình dưới tức là bạn đã cài đặt thành công:

 

3. Một số thông tin về hệ thống:

- Thư mục gốc ảo: Là thư mục www của hệ thống. Đây là thư mục gốc của Apache. Mọi địa chỉ URL gửi lên server

sẽ được phân tích thành đường dẫn tương ứng với đường dẫn của thư mục gốc ảo trên.

Thư mục dữ liệu của MySQL: Nằm trong thư mục /mysql/data. Trong thư mục này, MySQL sẽ lưu trữ các CSDL

(Database) dưới dạng các thư mục, mỗi bảng trong CSDL được ghi trong một file riêng biệt.

- Để thao tác với CSDL MySQL, các bạn có thể mở trình duyệt và vào trang http://localhost/phpmyadmin/ . Chữ

Localhost đã được giải thích ở trên.

- Để xem các thông tin của hệ thống, các bạn mở trang http://localhost/phpinfo.php

- Các bạn có thể sử dụng thử diễn đàn IBF Forum được cài đặt miễn phí mặc định kèm hệ thống.Re: Bài 2: Cài đăt web server Apache, MySQL và PHP

« Reply #1 on: March 14, 2007, 10:29:17 PM »

Xin phép admin cho em được bổ sung thêm cách cài đặt thủ công (manual) từng phần nhé.

Link tải

- Apache HTTP server: http://httpd.apache.org/download.cgi , chọn Win32 Binary (MSI Installer).

- PHP: http://www.php.net/downloads.php , chọn Windows Binaries, gói zip package.

- MySQL: http://dev.mysql.com/downloads/ , chọn MySQL Community Server, chọn bản Without installer (unzip in

C:\).

Cài đặt

Trước khi cài đặt, các bạn cũng phải chú ý một số điều như ở bài trên.

1. Apache

Cài đặt Apache với các lựa chọn mặc định (cứ thoải mái nhấn Next, trừ khi bạn muốn có 1 vài rắc rối  ). Trong

mục network domain, server name và emai, có thể khai gì cũng được (nếu cần có thể chỉnh lại sau). Sau khi cài

đặt xong, Apache sẽ chạy dưới dạng 1 service của Windows và nó được thiết lập mặc định khởi động cùng

Windows. 1 chương trình nhỏ có tên Apache Service Monitor cũng được tự động chạy dưới khay hệ thống để có

thể mở hoặc tắt Apache thuận tiện. Để kiểm tra, hãy vào trình duyệt và gõ vào khung address: http://localhost/.

Dòng url này sẽ gọi file index.html nằm trong thư mục htdocs trong thư mục cài đặt Apache, đây là thư mục gốc

mặc định của Apache, website của bạn sẽ dc chứa tại đây. Nhấn Enter và dòng chữ "It works!!!" to tướng hiện ra.

Chú ý: Với Windows SP2, Apache có thể bị block. Cách giải quyết: Unblock 

Sau khi chạy thành công, có lẽ bạn sẽ muốn cấu hình lại Apache cho phù hợp hơn. Dùng Notepad mở file

Page 5: giáo trình PHP

httpd.conf nằm trong thư mục conf trong thư mục cài đặt Apache (hoặc vào Start menu để mở) và tiến hành

chỉnh sửa:

- Để chứa website của mình trong thư mục khác thuận tiện hơn thư mục mặc định htdocs của

Apache, VD: C:\www, chỉnh lại như sau:

Code:

DocumentRoot "C:/www/"

<Directory />

    Options FollowSymLinks

    AllowOverride None

    Order deny,allow

    Deny from all

    Satisfy all

</Directory>

<Directory "C:/www/">

- Để thiết lập danh sách các file Apache sẽ tự động cung cấp (VD: index.html, index.htm, index.php) khi 1 thư mục

được yêu cầu, chỉnh lại như sau:

Code:

<IfModule dir_module>

    DirectoryIndex index.html index.htm index.php

</IfModule>

Như vậy, để truy cập đến file index.html trong thư mục C:\www, bạn ko cần phải gõ: http://localhost/index.html

nữa mà chỉ cần gõ http://localhost/. Apache dò tìm các file theo thứ tự từ trái sang phải trong danh sách file mà

bạn khai báo.

Chú ý: sau mỗi lần chỉnh sửa file httpd.conf, bạn phải restart lại Apache (dùng Apache Service Monitor) để cập

nhật các thay đổi.

2. PHP

2.1 Cài đặt và cấu hình:

Giải nén ra 1 thư mục nào đó, VD: C:\php. Cần quan tâm đến 2 file sau:

- phpXapacheY.dll: đây là module mà Apache cần nạp để nó có thể hoạt động với PHP. X, Y lần lượt là số hiệu

phiên bản của PHP và Apache, VD: php5apache2.dll. Bạn phải biết phiên bản Apache và PHP mình đang dùng để

lựa chọn cho đúng. VD: nếu bạn có PHP 5.2.0 và Apache 2.2.3, thì ko thể dùng php5apache2.dll được mà phải

dùng php5apache2_2.dll (module kết nối PHP5 với Apache 2.2.x). Bạn hãy vào trang chủ của PHP để biết các chú

ý từ nhà sx. Để nạp module này (VD: php5apache2_2.dll) vào Apache, hãy mở httpd.conf và thêm vào cuối phần

LoadModule các dòng như sau:

Code:

LoadModule php5_module "C:/php/php5apache2_2.dll"

AddType application/x-httpd-php .php

PHPIniDir "C:/php"

Dòng cuối cùng là đường dẫn đến file cấu hình của PHP: php.ini.

- php.ini: đây là file cấu hình của PHP. Vào thư mục cài đặt PHP, chọn 1 trong 2 file php.ini-recommended hoặc

php.ini-dist để sửa thành php.ini. Theo khuyến cáo của nhà cung cấp, hãy chọn php.ini-recommended.

Page 6: giáo trình PHP

2.2 Kiểm tra:

Restart Apache. Nếu Apache không thể khởi động, xem lại bước 1. Nếu thành công, dùng Notepad tạo 1 file

phpinfo.php với nội dung như sau:

Code:

<?php

phpinfo();

?>

Copy file này vào thư mục chứa website (C:\www), rồi mở nó bằng trình duyệt (http://localhost/phpinfo.php ) bạn

sẽ nhận dc 1 bảng chỉ rõ cấu hình của Apache và PHP cài đặt trong máy tính.

3. MySQL

3.1 Cài đặt và kiểm tra

- Giải nén ra 1 thư mục nào đó, VD: C:\MySQL. Trong thư mục cài đặt, chọn file ini phù hợp với mức độ CSDL của

mình (VD: my-small.ini) rồi đổi tên thành my.ini và copy vào thư mục C:\Windows.

- Mặc định, dữ liệu của bạn sẽ được chứa trong C:\MySQL\data, nên chuyển nó ra nơi khác (VD: C:\mydata) đề

phòng trường hợp nâng cấp MySQL sẽ làm mất dữ liệu. Mở my.ini, xoá dấu comment # tại dòng dưới đây và chỉnh

lại như sau:

Code:

#innodb_data_home_dir = C:/mydata/

- Vào Start - Run, gõ cmd, cửa sổ Command Prompt thứ 1 hiện ra, gõ "C:\mysql\bin\mysqld" --console, MySQL

server sẽ khởi động. Chữ console là để bắt MySQL server hiển thị quá trình xử lý trên cửa sổ này, nó sẽ có dạng

như sau:

Quote

C:\>"C:\mysql\bin\mysqld" --console

InnoDB: The first specified data file .\ibdata1 did not exist:

InnoDB: a new database to be created!

061204 22:50:37 InnoDB: Setting file .\ibdata1 size to 10 MB

InnoDB: Database physically writes the file full: wait...

061204 22:50:38 InnoDB: Log file .\ib_logfile0 did not exist: new to be created

InnoDB: Setting log file .\ib_logfile0 size to 5 MB

InnoDB: Database physically writes the file full: wait...

061204 22:50:39 InnoDB: Log file .\ib_logfile1 did not exist: new to be created

InnoDB: Setting log file .\ib_logfile1 size to 5 MB

InnoDB: Database physically writes the file full: wait...

InnoDB: Doublewrite buffer not found: creating new

InnoDB: Doublewrite buffer created

InnoDB: Creating foreign key constraint system tables

InnoDB: Foreign key constraint system tables created

061204 22:50:40 InnoDB: Started; log sequence number 0 0

061204 22:50:42 [Note] C:\mysql\bin\mysqld: ready for connections.

Version: '5.0.27-community' socket: '' port: 3306 MySQL Community Edition (GP

L)

Page 7: giáo trình PHP

Nhưng để có thể giao tiếp được với CSDL này, bạn phải có 1 giao diện để tương tác với nó, gọi là MySQL client, có

thể là giao diện đồ hoạ (phpMyAdmin) hoặc giao diện dòng lệnh - console. MySQL cung cấp sẵn cho bạn 1 MySQL

client dạng console là mysql.exe trong C:\MySQL\bin. Để sử dụng nó, bạn tiếp tục mở 1 cửa sổ cmd thứ 2, gõ vào

"C:\mysql\bin\mysql" -u root, nó sẽ trông giống thế này:

Quote

C:\>"c:\mysql\bin\mysql" -u root

Welcome to the MySQL monitor. Commands end with ; or \g.

Your MySQL connection id is 1 to server version: 5.0.27-community

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql>

u là viết tắt của user, root là username. MySQL mặc định tạo user là root với quyền cao nhất và chưa đặt

password. Bạn nên đặt password tại đây chứ không nên đặt tại file my.ini vì nó sẽ không được mã hoá. Vì chúng

ta dùng localhost để thử nghiệm website nên không cần thiết phải đặt password.

Để tắt MySQL server, gõ exit tại dấu nhắc mysql>, cửa sổ cmd thứ 2 sẽ trả về thư mục gốc, tiếp tục gõ "C:\mysql\

bin\mysqladmin" -u root shutdown. Cửa sổ cmd thứ 1 sẽ hiển thị quá trình tắt:

Quote

061204 22:54:49 [Note] C:\mysql\bin\mysqld: Normal shutdown

061204 22:54:49 InnoDB: Starting shutdown...

061204 22:54:52 InnoDB: Shutdown completed; log sequence number 0 43655

061204 22:54:52 [Note] C:\mysql\bin\mysqld: Shutdown complete

Khi làm việc trên hệ console này, hầu như chúng ta chỉ sử dụng 2 thao tác bật và tắt MySQL server, các thao tác

khác sẽ được thực hiện thông qua mã lệnh trong các trang .php. Vì vậy, để thuận tiện, bạn nên tạo 2 file .bat

(dạng text):

    * File thứ 1 đặt tên là MyStart.bat có nội dung: "C:\mysql\bin\mysqld" --console.

    * File thứ 2 đặt tên là MyStop.bat có nội dung: "C:\mysql\bin\mysqladmin" -u root shutdown.

Khi cần bật tắt MySQL server chỉ cần chạy 2 file này là được.

3.2 Kết nối MySQL với PHP:

- Bạn cần 2 file: libmysql.dll và php_mysql.dll (hoặc php_mysqli.dll). Các file này đều có  sẵn trong bộ cài đặt

của php.

Vào thư mục gốc của php và copy libmysql.dll vào C:\windows\system32.

- Dùng Notepad mở php.ini:

    * Xoá dấu comment ";" tại 2 dòng dưới đây để PHP có thể load 2 extension mysql và mysqli. Tuy nhiên chỉ nên

dùng 1 trong 2 extension, dùng cái nào thì xoá dấu ";" tại cái đó:

Code:

;extension=php_mysql.dll

;extension=php_mysqli.dll

Page 8: giáo trình PHP

    * Khai báo đường dẫn đến thư mục chứa extension của PHP:

Code:

extension_dir = "C:\php\ext"

- Kiểm tra: restart Apache, bật MySQL server, dùng trình duyệt mở file phpinfo.php đã tạo ở mục 2.2

(http://localhost/phpinfo.php). Trong bảng cấu hình của Apache và PHP giờ có thêm mục MySQL (hoặc MySQLi).

Vậy là kết nối đã thành công.

Chú ý: nếu ko thấy mục MySQL(hoặc MySQLi) nghĩa là php vẫn chưa kết nối dc với mysql. Khi đó bạn hãy sử dụng

các file libmysql.dll, php_mysql.dll (hoặc php_mysqli.dll) do MySQL cung cấp. php_mysql.dll (hoặc

php_mysqli.dll) được gọi là connector - bộ kết nối. Connector cho MySQL mới nhất và PHP mới nhất có thể

download từ http://dev.mysql.com/downloads/connector/php/ , các phiên bản cũ hơn download từ các link dưới

đây (có thể sẽ ko có), trong đó thay x.y.z, a.b.c lần lượt bởi số hiệu phiên bản của PHP và MySQL cần dùng:

Download php_mysql.dll: http://dev.mysql.com/get/Downloads/Connector-php/php_x.y.z_mysql_a.b.c-win32.zip/

from/pick

Download php_mysqli.dll: http://dev.mysql.com/get/Downloads/Connector-php/php_x.y.z_mysqli_a.b.c-win32.zip/

from/pick

php_mysqli.dll là connector cải tiến của php_mysql.dll. Bạn nên download cả 2 về, nhưng mỗi lần chỉ nên dùng 1

trong 2 cái.

Sau khi download về, hãy copy đè libmysql.dll vào C:\windows\system32, copy đè php_mysql.dll và php_mysqli.dll

vào thư mục extension của php (VD: C:\php\ext). Sau đó kiểm tra lại như trên. Nếu vẫn ko được thì hết cách

Bài này tôi viết sau khi cài đặt Apache 2.2.3, PHP 5.2.0, MySQL 5.0.27. Hy vọng các phiên bản mới sẽ không kèm

theo các rắc rối mới  Bài 3: Lịch sử phát triển các ứng dụng trên Web server. ASP, JSP và PHP

« on: January 18, 2007, 08:32:48 AM »

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.

Page 9: giáo trình PHP

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

« on: January 25, 2007, 02:15:46 AM »

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>

Page 10: giáo trình PHP

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

Page 11: giáo trình PHP

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

Page 12: giáo trình PHP

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:

Page 13: giáo trình PHP

    <?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ôngHằng và biến trong PHP

« on: January 25, 2007, 02:25:39 AM »

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;

Page 14: giáo trình PHP

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.

Page 15: giáo trình PHP

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

Page 16: giáo trình PHP

É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

« on: January 19, 2007, 12:36:12 PM »

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)

Page 17: giáo trình PHP

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

Page 18: giáo trình PHP

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

Page 19: giáo trình PHP

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

Case gia_tri 2:

     doan_lenh_2;

Case gia_tri n:

     doan_lenh_n;

default:

     doan_lenh_khac;

}

Ví dụ:

switch ($thu){

case 2:

Page 20: giáo trình PHP

     echo ("Chao co, van, su, ly");

case 3:

     echo (" Hoa, Sinh, Dia, GDCD");

case 4:

     echo ("KTCN, Van, Toan, Tieng Anh");

case 5:

     echo (" Hoa, Toan, Van, Tin");

case 6:

     echo ("Toan, Van, Anh, Sinh hoat");

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ó)Lệnh điều khiển vòng lặp

« on: January 25, 2007, 06:29:21 PM »

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;

}

Page 21: giáo trình PHP

?>

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ẽ

Page 22: giáo trình PHP

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

Page 23: giáo trình PHP

}

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.

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à $HTTP_GET_VARS[]

để 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 $HTTP_GET_VARS có nội dung sau:

$HTTP_GET_VARS["method"] = "Reply" // tương ứng với cặp method=Reply

$HTTP_GET_VARS["TOPIC_ID"] = 161 // tương ứng với cặp TOPIC_ID=161

$HTTP_GET_VARS["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:

Page 24: giáo trình PHP

<?

// 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 ($HTTP_GET_VARS["user"]))

{

    if ($HTTP_GET_VARS["user"]=="sinh")

    {

        echo "Hello, my boss. Good morning!";

    }

    else

    {

        echo "Hello, " . $HTTP_GET_VARS["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à $HTTP_POST_VARS[]. 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:

<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

$HTTP_POST_VARS sẽ có các phần tử sau:

$HTTP_POST_VARS["T1"] = Sinh

$HTTP_POST_VARS["T2"] = 123456

Page 25: giáo trình PHP

$HTTP_POST_VARS["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 )

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

<?php

      $a=0;

$b=0;

      if (isset ($HTTP_POST_VARS["a"]))

      {

            $a =$HTTP_POST_VARS["a"];

      }

       if (isset ($HTTP_POST_VARS["b"]))

      {

            $b =$HTTP_POST_VARS["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

Page 26: giáo trình PHP

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:

// 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:

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

$HTTP_COOKIE_VARS["tên_cookie"]

Page 27: giáo trình PHP

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:

$HTTP_COOKIE_VARS["ten_truy_cap"] // chứa giá trị "lan gio vo tinh"

$HTTP_COOKIE_VARS["password"] // chứa giá trị "thumotti".

Chi tiết hơn các bạn có thể xem trong PHP Manual.Bài 11: Các thông tin khác liên quan đến trình duyệt và máy chủ.

« on: January 23, 2007, 01:19:48 AM »

Trong PHP, ngoài các thông tin trình duyệt gửi lên thông qua các con đường POST, GET, COOKIES, chúng ta cũng

có thể thu được một số thông tin khác có liên quan đến trình duyệt cũng như các thông số liên quan đến máy chủ

như: đường dẫn, địa chỉ IP, phiên bản... Các thông tin này được lưu trữ trong biến mảng $_SERVER (đối với các

phiên bản mới) hoặc $HTTP_SERVER_VARS (đối với các phiên bản cũ hơn bản 4.1.0):

$_SERVER['PHP_SELF']: Tên file nằm trên thư mục gốc của website. Ví dụ: biến $_SERVER['PHP_SELF'] trong script

đặt tại địa chỉ http://example.com/test.php/foo.bar sẽ là /test.php/foo.bar.

$_SERVER['SERVER_NAME']: Tên của máy chủ host, nơi mà đoạn script được thực thi. Nếu đoạn script này đang

chạy trên một host ảo thì giá trị này sẽ trả về tên host ảo đó.

$_SERVER['SERVER_SOFTWARE']: Chuỗi định danh của máy chủ, thường được cấp trong phần header khi trả lời

các yêu cầu từ máy khách.

$_SERVER['SERVER_PROTOCOL']: Tên và phiên bản của giao thức mà trang web yêu cầu. VD: 'HTTP/1.0';

$_SERVER['REQUEST_METHOD']: Loại yêu cầu được sử dụng để truy cập trang web. VD: 'GET', 'HEAD', 'POST',

'PUT'.

$_SERVER['QUERY_STRING']: Câu truy vấn (chứa các thông tin liên quan đến các biến và giá trị của phương thức

GET.

$_SERVER['DOCUMENT_ROOT']: Thư mục gốc của website, nơi mà file script đang được thực thi.

$_SERVER['HTTP_HOST']: Những nội dung liên quan đến Host header lấy từ yêu cầu hiện tại

$_SERVER['REMOTE_ADDR']: Địa chỉ của trình duyệt, nơi người sử dụng đang duyệt web.

$_SERVER['REMOTE_PORT']: Cổng được sử dụng trên máy khách (để kết nối tới web server).

$_SERVER['SCRIPT_FILENAME']: Đường dẫn tuyệt đối của file chứa script đang chạy

$_SERVER['SERVER_PORT']: Cổng của máy chủ web được mở để truyền dữ liệu. Mặc định là cổng 80.

$_SERVER['SERVER_SIGNATURE']: Chuỗi chứa phiên bản của máy chủ và tên host ảo (nếu được bật)

$_SERVER['PATH_TRANSLATED']: Đường dẫn file (không phải là thư mục gốc) dựa trên đường dẫn của đoạn

script.

$_SERVER['SCRIPT_NAME']: Chứa đường dẫn của file script. Thường dùng để trỏ đến chính nó.

$_SERVER['REQUEST_URI']: Địa chỉ URI (Định danh đối với các tài nguyên mạng, là một dạng thức mở rộng của

URL).

###GOOGLEADSN###Hàm trong PHP

« on: February 07, 2007, 01:34:32 AM »

Page 28: giáo trình PHP

I. Khái niệm hàm

Hàm (function), nguyên nghĩa tiếng Anh có nghĩa là chức năng.

Trong lập trình, ta có thể hiểu hàm là một đoạn chương trình được xây dựng để thực hiện một chức năng nào đó.

Đoạn chương trình này chỉ cần phải viết duy nhất một lần, và có thể được sử dụng nhiều lần trong toàn bộ chương

trình.

Một hàm sẽ được xác định bởi tên hàm và các tham số đầu vào liên quan đến hàm đó. Thông thường, hàm sẽ trả

về một kết quả nào đó.

Chúng ta có thể tưởng tượng theo sơ đồ sau:Code:

Tham số đầu vào 1 |

Tham số đầu vào 2 |

Tham số đầu vào 3 | ---> tên hàm --> kết quả trả về sau khi gọi hàm.

....              |

Tham số đầu vào n |

Như vậy một hàm sẽ nhận các thông tin đầu vào, xử lý nó và trả về kết quả nào đó.

Trong PHP có rất nhiều hàm đã được xây dựng sẵn mà chúng ta chỉ việc đem ra sử dụng, như các hàm xử lý chuỗi,

thời gian, xử lý tệp, thư mục...

Xét về bản chất, một ngôn ngữ lập trình chỉ có ba câu lệnh chính là gán, lặp và rẽ nhánh. Việc sắp xếp các câu

lệnh như thế nào để cho ra một kết quả gọi là một thuật toán (các bước để giải một bài tóan, đã được đề cập ở

những bài đầu tiên) hay giải thuật. Và một chương trình sẽ là sự kết hợp của giải thuật và các cấu trúc dữ liệu. Để

hỗ trợ các chương trình xử lý một số tình huống nào đó, người ta sử dụng các hàm.

Các câu lệnh write của Pascal hay câu lệnh echo của PHP thực chất phải được gọi là các hàm chứ không phải là

một câu lệnh.

Để giải thích rõ hơn khái niệm hàm, ta quay trở lại với "câu lệnh" echo quen thuộc:

Hàm echo(chuỗi) có tên là echo, tham số đầu vào là một chuỗi, và chức năng (kết quả mà nó trả về) là một dòng

chữ (được lưu trong biến chuỗi) được trả về trình duyệt.Re: Hàm trong PHP

« Reply #1 on: February 07, 2007, 01:44:38 AM »

II. Các hàm dựng sẵn và các hàm do người dùng tự xây dựng

Các hàm dựng sẵn trong PHP (PHP Built-in functions) là các hàm đã được các nhà phát triển PHP cài đặt sẵn, và

chúng ta chỉ việc đem ra sử dụng. Cần phân biệt các hàm này với các hàm do người dùng tự cài đặt (user

functions). Các hàm do người dùng tự xây dựng chỉ có thể được dùng trong chương trình có chứa hàm đó. Khi

chuyển qua một ứng dụng khác, nếu chúng ta không viết lại các hàm đó thì chúng ta sẽ không thể sử dụng.

Một điểm mà tôi rất thích sử dụng PHP đó là PHP có một thư viện các hàm dựng sẵn vô cùng phong phú, đáp ứng

được hầu hết nhu cầu phát triển các ứng dụng web. Đó chính là lý do vì sao mà PHP được ưa chuộng hơn hẳn so

với ASP (chỉ có mấy cái đối tượng "quèn"). Các hàm dựng sẵn trong PHP cũng rất đơn giản, dễ dùng, và được chú

thích, cũng như hướng dẫn rất chi tiết trong tài liệu PHP Manual.

Trước khi đi vào xây dựng các hàm của riêng mình, chúng ta sẽ làm quen với một số hàm có sẵn trong PHP để

hiểu cách sử dụng các hàm. Trong "khóa học" này, tôi sẽ trình bày một số hàm thông dụng để xử lý chuỗi và thời

gian. Sau đó, tôi sẽ hướng dẫn các bạn cách thức viết và sử dụng các hàm của riêng mình trên PHP

Page 29: giáo trình PHP

Chuỗi (xâu) và các hàm xử lý chuỗi trong PHP

« on: January 27, 2007, 05:29:30 AM »

1 addcslashes :Trích dẫn xâu kí tự với những vạch chéo trong kiểu C

*Cấu trúc :addcslashes(string with special characters);

2 addslashes :Trích dẫn xâu kí tự với những vạch chéo

*Cấu trúc : addcslashes(a string with special characters);

3 bin2hex :Chuyển đổi dữ liệu dạng nhị phân sang dạng biểu diễn hệ hexa

*Cấu trúc :bin2hex(string);

4 chop :Tách bỏ nhưng khoảng trắng từ cuối một xâu

5 chr : Cho một kí tự đặc biệt trong bảng mã

*Cấu trúc : chr(numeric);

6 chuck split : Tách một xâu thành các xâu nhỏ hơn

7 convert cyr string :Chuyển đổi từ một kí tự kirin sang một kí tự khác

8 count_chart : Cho thông tin về các kí tự dùng trong xâu

9 crc32 : Tính toán sự thừa vòng đa thức của một xâu

Tự động tạo ra chu ki kiểm tra tổng thừa của đa thức dài 32bit trong một xâu

10 crypt :Một cách mã hóa một xâu

11 echo : In ra một hay nhiều xâu

12 explode :Tách một xâu ra bởi xâu kí tự

13 fprintf :Viết một định dạng chuỗi ra một dòng

14 get html translation table :Cho ra bảng dịch bằng cách sử dung các thủ tục

html entity decode :

15 hebrev :Chuyển đổi văn ban logic khó hiểu sang văn ban trưc quan

16 hebrevc :Chuyển đổi văn ban logic khó hiểu sang văn ban trưc quan với sự chuyển đổi dòng mới

17 html entity decode :Chuyển đổi tấtcả cácthực thể HTML sang những kí tự có thể dùng được của chúng

18 htmlentities :Đổi tất cả các kí tự được sử dung sang các thực thể HTML

19 htmlspecialchars :Đổi những kí tự đặc biệt sang các thực thể của HTML

20 implode :Nối các phần tử của mảng với một xâu

21 join :Hàm này là một bí danh của hàm implode

22 levenshtein :Tính khoảng cách giữa hai xâu

23 localeconv :Lấy ra thông tin quy cách số

Page 30: giáo trình PHP

24,lstrim-- Strip whitespace from the beginning of a string

=>Xoá khoảng trắng từ phần tử đầu tiên của chuỗi

25,md5_file-- Calculates the md5 hash of a given filename

=>Mã hoá md5 tên file

26,md5 -- Calculate the md5 hash of a string

=>Mã hoá md5 1 chuỗi

27,metaphone -- Calculate the metaphone key of a string

=>Tính siêu khoá âm thanh của 1 chuỗi

28,money_format -- Formats a number as a currency string

=> Định dạng 1 số như 1 chuỗi tiền tệ

29,nl_langinfo -- Query language and locale information

=>Ngôn ngữ truy vấn và biên tập thông tin

30,nl2br -- Inserts HTML line breaks before all newlines in a string

=>Chèn 1 dòng ngắt HTML trước tất cả những dòng mới trong 1 chuỗi

31,number_format -- Format a number with grouped thousands

=>Định dạng 1 số với hàng nghìn chữ số

32,ord -- Return ASCII value of character

=>Trả lại giá trị ASCII của kí tự

33,parse_str -- Parses the string into variables

=>Phân tách chuỗi thành các biến số

34,print -- Output a string

=>In ra 1 chuỗi

35,printf -- Output a formatted string

=>In ra 1 chuỗi được định dạng

36,quoted_printable_decode -- Convert a quoted-printable string to an

8 bit string

=>Chuyển 1 chuỗi có thể in trích dẫn sang 1 chuỗi 8 bit.(Giải mã)

37,quotemeta -- Quote meta characters

=>Trích dẫn kí tự đặc biệt

38,rtrim -- Strip whitespace from the end of a string

=>Xoá khoảng trắng từ phần tử cuối cùng của chuỗi

39,setlocale -- Set locale information

=>Thiết lập vị trí thông tin

40,sha1_file -- Calculate the sha1 hash of a file

=>Mã hoá sha1 1 file

41,sha1 -- Calculate the sha1 hash of a string

=>Mã hoá sha1 1 chuỗi

Page 31: giáo trình PHP

42,similar_text -- Calculate the similarity between two strings

=>Cho số kí tự giống nhau của 2 chuỗi

43,soundex -- Calculate the soundex key of a string

=>Tính khoá chỉ âm của 1 chuỗi

44,sprintf -- Return a formatted string

=>Trả lại 1 chuỗi được định dạng

45,sscanf -- Parses input from a string according to a format

=>Phân tách chuỗi theo 1 định dạng

46,str_ireplace -- Case-insensitive version of str_replace().

=>Tương tự str_ replace().

 sscanf-- Parses input from a string according to a format

->Phân tích từ loại nhập vao từ một xâu theo một định dạng

str_ireplace-- Case-insensitive version of str_replace().

->Thay thế ngược lại khi xâu đã bị thay thế bằng str_replace()

str_pad-- Pad a string to a certain length with another string

->Co một xâu tới một độ dài nào đó với một xâu khác

str_repeat--Repeat a string

->Lặp lại một xâu

str_replace-- Replace all occurrences of the search string with the replacement string

->Thay thế tất cả các biến cố của xâu tìm kiếm với một xâu thay thế

str_rot13--Perform the rot13 transform on a string

->Thực hiện mã hoá theo rot 13 trên 1 xâu

(Rot-13 :Trong các nhóm tin của mạng USENET, đây là một kỹ thuật mật mã hoá đơn giản, nó làm dịch từng ký tự

đi 13 vị trí trong bảng chữ cái (cho nên e sẽ thành r). Mật mã rot- 13 được dùng cho mọi thông báo tin bất kỳ nào

có thể làm mất sự thú vị của một người nào đó (như) cách giải cho một trò chơi chẳng hạn hoặc xúc phạm một số

người đọc (như) bài thơ về tình dục chẳng hạn. Nếu người đọc cho giải mã thông báo tin này bằng cách phát ra

một lệnh thích hợp, thì người đọc đó - chứ không phải tác giả của thông báo - sẽ phải chịu trách nhiệm đối với sự

khó chịu do việc đọc thông báo gây ra.)

str_shuffle--Randomly shuffles a string

->Thay đổi một xâu bằng cách xê dịch ngẫu nhiên

str_split-- Convert a string to an array

->Đổi một xâu thành một mảng

str_word_count-- Return information about words used in a string

->Trả lại thông tin về những từ đã sử dụng trong một xâu

strcasecmp-- Binary safe case-insensitive string comparison

->So sánh xâu theo …case-insensitive.. nhị phân

strchr--Alias of strstr()

Page 32: giáo trình PHP

->Bí danh của strstr()

strcmp--Binary safe string comparison

->Sự so sánh xâu bằng cơ sở nhị phân

strcoll--Locale based string comparison

->Nơi diễn ra sự so sánh cơ sở

strcspn-- Find length of initial segment not matching mask

->Tìm độ dài của đoạn đầu tiên mà không tìm thấy trên bề mặt của xâu này đối với xâu kia.

strip_tags--Strip HTML and PHP tags from a string

->Loại bỏ các thẻ HTML và PHP từ một xâu

stripcslashes-- Un-quote string quoted with addcslashes()

->Loại bỏ các dấu slashe trong xâu do hàm addcslashes() tạo ra.

stripos-- Find position of first occurrence of a case-insensitive string

->Tìm ra vị trí đầu tiên của xâu này trong xâu kia của trường hợp sử lý cặp xâu.

stripslashes-- Un-quote string quoted with addslashes()

->Loại bỏ hàm addslashes(), hay nói cách khác, hàm này trả về giá trị ban đầu của xâu khi xâu bị hàm

addslashes() chèn các dấu slashe ở các ký tự đặc biệt

stristr-- Case-insensitive strstr()

->Loại bỏ hàm strstr() khi trong xâu có dấu chấm.

strlen--Get string length

->Lấy độ dài của xâu

strnatcasecmp-- Case insensitive string comparisons using a "natural order" algorithm

->So sánh xâu theo thứ tự abc, các ký tự được xét từ đầu đến cuối xâu

(VD: a2>a12>a11).

strnatcmp-- String comparisons using a "natural order" algorithm

->So sánh xâu sử dụng thứ tự abc và thứ tự toán học, nhưng được tính trên toàn bộ xâu ( VD: a12 > a11>a2).

strncasecmp-- Binary safe case-insensitive string comparison of the first n characters

->Là một hàm giống như strcasecmp(), khác ở chỗ hàm này có thể chỉ rõ số ký tự trong mỗi xâu đem so sánh.

strncmp:trả ra giá trị mà xâu1 dài hơn so với sâu hai.

strpos:Tìm vì trí xuất hiện đầu tiên của một xâu này trong xâu khác.

strrchr:Tìm kiếm vị trí xuất hiện cuối cùng của một kí tự trong xâu.

strrev:Đảo ngược một xâu.

strripos:Tìm vị trí cuối cùng của xâu này khiến nó khác một xâu cho trước.

strrpos:Tìm vị trí lần xuất hiện cuối cùng cùng của một kí tự trong một xâu.

strspn:Tính xem độ dài đoạn đầu của một xâu mà chứa toàn các kí tự thuộc xâu khác.

Page 33: giáo trình PHP

strstr:Lấy ra một đoạn của xâu từ vị trí xuất hiện kí tự cho trước.

strtok:chia cắt xâu.

strtolower:biến kí tự chữ hoa thành chữ thường.

strtoupper:biến kí tự chữ thường thành chữ hoa.

strtr:chuyển đổi kí tự theo một qui tắc nào đó.

substr_compare:không có thông tin.

substr_count:Tính số lần xuất hiện của một xâu này trong một xâu khác.

substr_replace:thay thế một đoạn văn bản trong phạm vi một đoạn của xâu kí tự.

substr:trả ra một phần của xâu.

trim:Loại bỏ kí tự thừa(whitespace)ở đầu và cuối mỗi xâu.

ucfirst:viết hoa kí tự đầu tiên của một xâu.

ucwords:viết hoa kí tự đầu tiên của mỗi từ.

vprints:xuất ra một xâu được định dạng

vsprint:quai lại một xâu định dạng.

wordswarp:chia xâu kí tự ra thành các sâu con nhờ một kí tự xác định.Các hàm do người dùng tự định nghĩa

« on: February 07, 2007, 02:01:11 AM »

I. Xây dựng các hàm trong PHP

Trong PHP, chúng ta có thể tự xây dựng các hàm của mình. Trước khi sử dụng, chúng ta cần phải tiến hành cài đặt

hàm.

Cú pháp cài đặt một hàm có thể được tóm tắt như sau:

function ten_ham (thamso1, thamso2, ..., thamson)

// đoạn chương trình xử lý dữ liệu bên trong hàm

    return gia_tri;

}

Trong đó:

- function là từ khóa,

- ten_ham là tên hàm do chúng ta tự đặt. Tên hàm thường sử dụng các ký hiệu chữ cái, chữ số và dấu gạch dưới.

- Các thamsoi là các tham số đưa vào. Các tham số khi khai báo thường ở dưới dạng các biến, còn khi sử dụng thì

có thể là biến, hằng, hay một giá trị nào đó. Một hàm có thể không có hoặc có nhiều tham số.

- Giá trị gia_tri sau từ khóa return là giá trị trả về sau khi gọi hàm. Giá trị này có thể là giá trị của một biến, hay

một giá trị cụ thể nào đó.

Ví dụ: Tôi xây dựng một hàm đơn giản để trả về dòng chữ "Xin chào":

Page 34: giáo trình PHP

function chao()

{

     return "<B>Xin chào</B>";

}

Ví dụ 2: Tôi đưa ra một hàm phức tạp hơn chút đỉnh: Khi xây dựng các ứng dụng liên quan đến CSDL, ta thường

phải xuất dữ liệu ra một bảng nào đó.

Một bảng trong HTML được cấu thành từ các cặp thẻ <table>, <tr>, <td> lồng vào nhau, ở mức độ nhỏ nhất của

cấu trúc trên là một ô.

Một ô có thể có chứa thông tin (nằm giữa các cặp thẻ <td></td>), có thể chứa các thuộc tính định dạng (style)...

Việc ngồi gõ đi gõ lại mấy cái thẻ HTML đủ làm cho chúng ta phát chán.

Ở đây tôi sẽ xây dựng một hàm để tự động sinh ra nội dung của một ô. Hàm này có 2 tham số đầu vào dạng chuỗi

là nội dung và định dạng thẻ:

<?

function viet_o ($noidung,$dinhdang)

{

     $td_tmp="<td " . $dinhdang . ">" . $noidung . "</td>";

     return $td_tmp;

}

?>

VD sử dụng hàm trên:

<table>

   <tr>

      <?viet_o("STT","");?>

      <?viet_o("Họ tên","");?>

      <?viet_o("Ngày sinh","");?>

   </tr>

   <tr>

      <?viet_o("1","");?>

      <?viet_o("Lê Nguyên Sinh","");?>

      <?viet_o("01/04/2006","");?>

   </tr>

   <tr>

      <?viet_o("2","");?>

      <?viet_o("Thử một tí","");?>

      <?viet_o("01/01/2007","");?>

   </tr>

</td>

Chúng ta có thể mở rộng ra các hàm khác để xử lý cột, bảng. Hãy xem xét toàn bộ đoạn mã sau:

<?

function viet_o ($noidung,$dinhdang)

{

     $td_tmp="<td " . $dinhdang . ">" . $noidung . "</td>";

     return $td_tmp;

}

function viet_cot ($noidung,$dinhdang)

Page 35: giáo trình PHP

{

     $td_tmp="<tr " . $dinhdang . ">" . $noidung . "</tr>";

     return $td_tmp;

}

?>

<?

function viet_bang ($noidung,$dinhdang)

{

     $td_tmp="<table " . $dinhdang . ">" . $noidung . "</table>";

     return $td_tmp;

}

// Tạo một bảng tương tự ở trên nhưng dùng các hàm vừa xây dựng

$noidung = viet_cot(viet_o("STT","") . viet_o("Họ tên","") . viet_o ("Ngày sinh",""),"");

$noidung .=viet_cot(viet_o("1","") . viet_o("Lê Nguyên Sinh","") . viet_o ("01/04/2006",""),"");

$noidung .=viet_cot(viet_o("2","") . viet_o("Thử một tí","") . viet_o ("01/01/2007",""),"");

$noidung = viet_bang($noidung,"");

echo $noidung;

?>

Đoạn mã trên nhìn qua thì nó hơi dài, nhưng khi bạn xử lý với số lượng dữ liệu lớn thì nó sẽ trở nên ngắn gọn hơn

nhiều, nhất là ta có thể dùng vòng lặp để duyệt qua các hàng của một bảng.Re: Các hàm do người dùng tự định nghĩa

« Reply #1 on: February 07, 2007, 09:46:24 PM »

II. Các tham số mặc định và các tham số tùy chọn

Khi đưa các tham số vào hàm, chúng ta có thể thiết lập các tham số mặc định. Các tham số này được đặt giá trị

ngay khi xây dựng hàm.

Ví dụ:

function viet_o ($noidung, $dinhdang="")

{

     $td_tmp="<td " . $dinhdang . ">" . $noidung . "</td>";

     return $td_tmp;

}

Nếu các tham số mặc định được đặt hết ở bên phải của danh sách tham số, khi triệu gọi hàm, chúng ta có thể bỏ

qua các tham số mặc định này. Tuy nhiên, nếu nó nằm giữa hay bên phải thì chúng ta không được phép bỏ qua.

Trong trường hợp các tham số mặc định được đặt ở bên trái, chúng ta có thể coi chúng như là các tham số tùy

chọn.

Với ví dụ trên, ta có thể gọi hàm viet_o theo một trong hai cách sau:

viet_o("Thử một tí","");

họăc

viet_o("Thử hai tí");//Trường hợp này tham số tùy chọn là tham số mặc định được đặt là rỗng ở phía bên phải của

danh sách tham số.Re: Các hàm do người dùng tự định nghĩa

« Reply #2 on: February 07, 2007, 09:52:41 PM »

III. Phạm vi hoạt động của các biến trong và ngoài hàm

Chú ý rằng khi ta sử dụng các biến bên trong hàm, mặc định, các biến đó được coi là biến cục bộ của hàm, chứ

không phải là biến toàn cục của chương trình.

Page 36: giáo trình PHP

Để thiết lập hoặc lấy giá trị của các biến toàn cục, chúng ta có thể sử dụng 1 trong 2 cách sau đây:

Cách 1: Dùng khai báo GLOBAL để khai báo các biến toàn cục

Cách 2: Sử dụng mảng $GLOBALS["tên_biến_toàn_cục"].

Ví dụ:

<?

$x=1;

$y=3;

function cong ()

{

return $x+$y;

}

?>

Khi ta gọi hàm cong() ở trên sẽ cho ra kết quả bằng 0 (vì $x và $y lúc này được coi là biến cục bộ và có giá trị

bằng 0.

Để chương trình chạy đúng, ta phải làm như sau:

Cách 1:

<?

$x=1;

$y=3;

function cong ()

{

GLOBAL $x, $y

return $x+$y;

}

?>

Cách 2:

<?

$x=1;

$y=3;

function cong ()

{

return $GLOBALS["x"]+$GLOBALS["y"];

}

?>Bài 17: Giới thiệu ngôn ngữ truy vấn CSDL SQL

« on: January 23, 2007, 02:09:05 AM »

I. Một số khái niệm cơ bản về CSDL

Cơ sở dữ liệu (database) có thể hiểu là nơi chứa dữ liệu. Có nhiều loại cơ sở dữ liệu khác nhau như cơ sở dữ

liệu quan hệ, CSDL hướng đối tượng, CSDL phân tán...

Hiện nay, trong phần lớn các ứng dụng, người ta thường sử dụng CSDL quan hệ.

Trong mô hình CSDL quan hệ, dữ liệu thường được chia thành các bảng có liên quan với nhau.

VD: ta có 2 bảng:

Bảng 1 chứa các thông tin về Mã hàng, tên hàng, ngày nhập hàng, giá nhập hàng

Page 37: giáo trình PHP

Bảng 2 chứa các thông tin về Mã hàng, ngày bán hàng, giá bán.

Hai bảng này có quan hệ với nhau thông qua mã hàng, tức là chỉ cần có mã hàng ở bảng 2, ta có thể tìm ra

tên hàng dựa trên mối liên hệ giữa mã hàng và tên hàng lưu ở bảng 1.

Hệ quản trị CSDL là chương trình dùng để quản lý một CSDL nào đó. Chẳng hạn như chương trình Access là

một hệ quản trị CSDL để quản lý CSDL Access. Thông thường thì tên của hệ quản trị CSDL gắn liền với tên

của loại CSDL. VD như: CSDL Access <-> Hệ quản trị CSDL Access, CSDL MySQL <-> Hệ quản trị CSDL

MySQL, CSDL Oracle <-> Hệ quản trị CSDL Oracle. Trong trường hợp này thì người ta thường nhầm lẫn

giữa khái niệm CSDL và cấu trúc (dạng nhị phân) của một CSDL do hệ quản trị CSDL quy định.

Người ta gọi các cột trong một bảng là các trường, các dòng trong một bảng là các bản ghi.

Mỗi trường sẽ có một kiểu dữ liệu xác định. Đó có thể là kiểu số, kiểu chuỗi, kiểu ngày tháng...

VD về một bảng có chứa thông tin người dùng. Bảng này sẽ có tên là NSD, các cột (trường) là: Ma_ND,

Ten_ND, Tuoi_ND, Matkhau_ND; trong đó Ma_ND có kiểu nguyên, Ten_ND có kiểu chuỗi, Tuoi_ND có kiểu

số, Matkhau_ND có kiểu chuỗi.

II. Ngôn ngữ truy vấn CSDL SQL

SQL là một ngôn ngữ được sử dụng trong các ngôn ngữ lập trình để truy vấn thông tin trong CSDL. Điểm

mạnh của ngôn ngữ này là cấu trúc đơn giản, có thể nhập lệnh vào dưới dạng các chuỗi văn bản, sau đó

chuyển câu lệnh tới các chương trình điều khiển trung gian để truy vấn dữ liệu rồi trả về cho chương trình.

Như vậy, mọi thao tác kết xuất, truy vấn hoàn tòan dễ dàng thông qua việc điều khiển chuỗi văn bản có

chứa câu lệnh SQL.

Bài viết này tập trung vào việc trình bày cú pháp của ngôn ngữ SQL, có thể sử dụng PHP để biểu diễn một

số thao tác để mọi người dễ dàng hình dung.

1. Câu lệnh chèn dữ liệu vào một bảng.

Cú pháp của câu lệnh này có dạng:

INSERT INTO tên_bảng (danh_sách_trường) VALUES (danh_sách_giá_trị)

Trong đó:

Các từ khóa cố định là INSERT, INTO và VALUES.

tên_bảng là tên của một bảng quan hệ trong CSDL.

danh_sách_trường là danh sách các trường trong bảng quan hệ được sử dụng để chèn giá trị vào, mỗi

trường cách nhau một dấu phảy.

danh_sách_giá_trị là danh sách các giá trị tương ứng với các trường, có bao nhiêu trường thì phải chèn vào

bấy nhiêu giá trị. Thông thường, các giá trị chuỗi phải được đặt trong cặp dấu nháy hoặc dấu ngoặc kép

tùy thuộc vào ngôn ngữ biểu diễn và kiểu dữ liệu của trường. Mỗi giá trị cách nhau bởi một dấu phẩy.

VD, với bảng dữ liệu ở trên (Bảng NSD có các cột (trường) là: Ma_ND, Ten_ND, Tuoi_ND, Matkhau_ND), ta

có thể dùng câu lệnh SQL để chèn thông tin vào như sau:

INSERT INTO NSD (Ten_ND,MatKhau_ND) VALUES('Sinh','123456')

Hoặc ta có thể chèn nhiều thông tin hơn:

INSERT INTO NSD (Ten_ND,Tuoi_ND,MatKhau_ND) VALUES('Sinh',30,'123456')

2. Câu lệnh chỉnh sửa dữ liệu trong bảng

Để chỉnh sửa (cập nhật) thông tin trong bảng, ta dùng câu lệnh UPDATE với cú pháp sau:

UPDATE tên_bảng SET tên_trường1=giá_trị1[, tên_trường_i=giá_trịi] WHERE điều_kiện

Chẳng hạn, nếu ta muốn đổi mật khẩu của những người có trường Ten_ND là Sinh thành 'JQKA' trong bảng

trên, ta sẽ làm như sau:

UPDATE NSD SET Matkhau_ID = 'JQKA' WHERE Ten_ND='Sinh'

Chú ý mệnh đề điều kiện WHERE. Mệnh đề này sẽ được mô tả chi tiết hơn ở phía dưới.

3. Câu lệnh xóa dữ liệu trong bảng

Để xóa dữ liệu trong bảng, ta dùng câu lệnh DELETE với cú pháp sau:

DELETE FROM tên_bảng WHERE điều_kiện.

Page 38: giáo trình PHP

Câu lệnh này sẽ xóa tất cả những bản ghi thỏa mãn điều kiện nằm sau mệnh đề WHERE.

VD:

UPDATE FROM NSD WHERE Ten_ND='Sinh'

4. Câu lệnh truy vấn (tìm kiếm) dữ liệu trong bảng

Đây là câu lệnh phức tạp nhất trong nhóm các câu lệnh của SQL.

Cú pháp của lệnh này như sau:

SELECT [danh_sách_trường] FROM [danh_sách_bảng] WHERE [danh_sách_điều_kiện] [ORDER BY]Các thao tác kết nối tới MySQL và lựa chọn CSDL bằng PHP

II. « on: January 24, 2007, 07:08:30 PM »

Bài viết này sẽ tập trung vào việc khai thác hệ quản trị CSDL miễn phí MySQL.

Tại sao lại sử dụng MySQL?

MySQL là một phần mềm quản trị CSDL mã nguồn mở, nằm trong nhóm LAMP (Linux - Apache -MySQL - PHP).

"Liên minh" mã mở này đang được coi là một đối trọng với các sản phẩm mã đóng "đắt vãi..." (vãi gì thì tôi không

biết ) của Microsoft (Windows, IIS, SQL Server, ASP/ASP.NET).

Một số đặc điểm của MySQL

MySQL là một phần mềm quản trị CSDL dạng server-based (gần tương đương với SQL Server của Microsoft).

MySQL quản lý dữ liệu thông qua các CSDL, mỗi CSDL có thể có nhiều bảng quan hệ chứa dữ liệu.

MySQL có cơ chế phân quyền người sử dụng riêng, mỗi người dùng có thể được quản lý một hoặc nhiều CSDL khác

nhau, mỗi người dùng có một tên truy cập (user name) và mật khẩu tương ứng để truy xuất đến CSDL.

Khi ta truy vấn tới CSDL MySQL, ta phải cung cấp tên truy cập và mật khẩu của tài khỏan có quyền sử dụng CSDL

đó. Nếu không, chúng ta sẽ không làm được gì cả.

Các bước xây dựng chương trình có kết nối tới CSDL:

Thông thường, trong một ứng dụng có giao tiếp với CSDL, ta phải làm theo bốn trình tự sau:

Bước 1: Thiết lập kết nối tới CSDL.

Bước 2: Lựa chọn CSDL.

Bước 3: Tiến hành các truy vấn SQL, xử lý các kết quả trả về nếu có

Bước 4: Đóng kết nối tới CSDL.

Nếu như trong lập trình thông thường trên Windows sử dụng các chương trình điều khiển trung gian (ADO,

ODBC...) để thực hiện kết nối và truy vấn, thì trong PHP, khi lập trình tương tác với CSDL, chúng ta thường sử

dụng thông qua các hàm.

Chú ý: Trước khi sử dụng PHP để lập trình với MySQL, hãy sử dụng chương trình quản lý phpMyAdmin để tạo trước

một CSDL, vài bảng cũng như người dùng... để tiện thực hành. Bài hướng dẫn sử dụng phpMyAdmin sẽ được trình

bày sau.

Trong bài viết này, tôi sử dụng MySQL chạy trên nền máy chủ localhost, người sử dụng của CSDL này có

username là mysql_user, mật khẩu là mysql_password

Thiết lập kêt nối tới MySQL.

Để kết nối tới MySQL, ta sử dụng hàm mysql_connect()

Cú pháp:

mysql_connect(host,tên_truy_cập,mật_khẩu);

trong đó:

Page 39: giáo trình PHP

host là chuỗi chứa tên (hoặc địa chỉ IP) của máy chủ cài đặt MySQL.

tên_truy_cập là chuỗi chứa tên truy cập hợp lệ của CSDL cần kết nối

mật_khẩu là chuỗi chứa mật khẩu tương ứng với tên truy cập

Ví dụ:

<?

mysql_connect ("localhost", "thu_mot_ti","thu_hai_ti");

?>

Khi kết nối tới MySQL thành công, hàm sẽ trả về giá trị là một số nguyên định danh của liên kết, ngược lại, hàm

trả về giá trị false.

Ta có thể dùng hàm if để kiểm tra xem có kết nối được tới MySQL hay không:

<?php

    $link = mysql_connect("localhost", "mysql_user", "mysql_password");

    if (!$link)

     {

         echo "Không thể kết nối được tới CSDL MySQL";

     }

?>

Lựa chọn CSDL

Để lựa chọn một CSDL nào đó mà người sử dụng có tên là tên_truy_cập" có quyền sử dụng, ta dùng hàm

mysql_select_db:

mysql_select_db (tên_CSDL);

Hàm này thường được dùng sau khi thiết lập kết nối bằng hàm mysql_connect. Hàm này trả về true nếu thành

công, false nếu thất bại.

VD:

<?php

    $link = mysql_connect("localhost", "mysql_user", "mysql_password");

    if (!$link)

     {

         echo "Không thể kết nối được tới MySQL";

     }

    if (!mysql_select_db ("Forums"))

     {

         echo "Không thể lựa chọn được CSDL Forums";

     }

?>

Đóng kết nối tới CSDL:

Để đóng kết nối tới CSDL, ta dùng hàm mysql_close.

Hàm này có nhiệm vụ đóng kết nối tới CSDL có mã định danh được tạo ra bởi hàm mysql_connect().

Cú pháp: mysql_close(mã_định_danh_kết_nối).

Ví dụ:

<?php

    $link = mysql_connect("localhost", "mysql_user", "mysql_password");

    if (!$link)

     {

         echo "Không thể kết nối được tới MySQL";

     }

Page 40: giáo trình PHP

    mysql_close($link);

?>Thực hiện các truy vấn thêm, xóa, sửa bản ghi thông qua câu lệnh SQL

« on: January 25, 2007, 01:40:54 AM »

Trong bài viết này, tôi sử dụng MySQL chạy trên nền máy chủ localhost, người sử dụng có username là

mysql_user, mật khẩu là mysql_password.

CSDL có tên là CMXQ_Forum, trong đó có một bảng là CMXQ_Users để lưu thông tin về những thành viên của diễn

đàn. Bảng CMXQ_Users có các trường sau:

User_ID: Autonumber.// mã số của người dùng

User_Name: Varchar [20] // tên truy cập của người dùng

User_Pass: Varchar[64] //mật khẩu của người dùng

User_IP: Varchar [15] //Địa chỉ IP của người dùng.

User_Post: Number // Số bài viết của người dùng.

Bây giờ tôi sẽ tiến hành một số thao tác thêm, sửa và xóa dữ liệu trên bảng đó. Xin xem lại bài Căn bản về SQL.

Để thực thi một câu lệnh SQL bất kỳ trong PHP tác động lên MySQL, ta dùng hàm mysql_query

(chuỗi_câu_lệnh_SQL)

I. Thêm một bản ghi vào bảng.

Ví dụ tôi muốn chèn thêm một người sử dụng có User_Name là "CMXQ", User_Pass là "123456", User_Post=0 ta

làm như sau:

<?

$sql = "INSERT INTO CMXQ_Users (User_Name, User_Pass) VALUES ("CMXQ","123456",0);

mysql_query ($sql);

?>

II. Xóa một bản ghi khỏi bảng.

Trong trường hợp này, ta sử dụng câu lệnh SQL DELETE FROM:

VD: tôi muốn xóa khỏi bảng CMXQ_Users tất cả những người có User_Name="CMXQ":

<?

$sql = "DELETE FROM CMXQ_Users WHERE User_Name='CMXQ'";

mysql_query ($sql);

?>

III. Sửa thông tin của bản ghi trong bảng.

Trong trường hợp này, tôi sử dụng cú pháp UPDATE:

VD: Tôi muốn cập nhật địa chỉ IP cho người có User_Name="CMXQ" với địa chỉ IP được lấy từ trình duyệt:

<?

$sql = "UPDATE CMXQ_Users SET User_IP ='" . $_SERVER['REMOTE_ADDR'] . "' Where User_Name='CMXQ'";

mysql_query ($sql);

?>

(Biến $_SERVER['REMOTE_ADDR'] chứa địa chỉ IP của trình duyệt. Xin xem lại ở bài trước)Sử dụng SQL để truy vấn dữ liệu trong PHP

« on: January 26, 2007, 01:02:14 AM »

Phần trước các bạn đã biết sử dụng SQL để tạo, xóa, sửa dữ liệu trong một bảng, cũng như đã biết cách sử dụng

câu lệnh SQL để truy vấn dữ liệu từ các bảng. Tuy nhiên, sau khi có được câu lệnh SQL rồi, ta phải làm thế nào để

hiển thị, xử lý dữ liệu đó? Bài viết này đề cập đến một số kỹ thuật có liên quan đến việc truy vấn dữ liệu, chẳng

hạn như cách lấy dữ liệu, sắp xếp dữ liệu, phân trang dữ liệu...Re: Sử dụng SQL để truy vấn dữ liệu trong PHP

« Reply #1 on: January 30, 2007, 08:32:38 AM »

Câu lệnh SELECT

Câu lệnh SELECT được dùng để truy xuất dữ liệu từ một bảng. Kết quả trả về dưới dạng bảng được lưu trong 1

bảng, gọi là bảng kết quả - result table (còn được gọi là tập kết quả - result set).

Page 41: giáo trình PHP

Cú pháp

Cú pháp của câu lệnh SELECT như sau:

    SELECT tên_các_cột

    FROM tên_bảng

Ví dụ, để truy xuất các cột mang tên LastName và FirstName từ một bảng có tên là Persons, ta dùng một câu lệnh

SELECT như sau:

    SELECT LastName, FirstName FROM Persons

Ta có thể dùng dấu * để thay thế cho tất cả các cột:

    SELECT * FROM Persons

Kết quả trả về từ một câu truy vấn SQL được lưu trong 1 tập kết quả (result set). Tập kết quả này sau đó sẽ được

lập trình viên tìm cách đưa ra dưới dạng một bảng hoặc một hình thức nào đó. Xin xem chi tiết ở phần lập trình

với phpRe: Sử dụng SQL để truy vấn dữ liệu trong PHP

« Reply #2 on: January 30, 2007, 08:34:25 AM »

Mệnh đề WHERE

Mệnh đề WHERE được dùng để thiết lập điều kiện truy xuất.

Để truy xuất dữ liệu trong bảng theo các điều kiện nào đó, một mệnh đề WHERE có thể được thêm vào câu lệnh

SELECT.

Cú pháp mệnh đề WHERE trong câu lệnh SELECT như sau:

    SELECT tên_cột FROM tên_bảng

    WHERE tên_cột phép_toán giá_trị

Trong mệnh đề WHERE, các phép toán được sử dụng là

    Phép toán      Mô tả

    =               So sánh bằng

    <>             So sánh không bằng

    >               Lớn hơn

    <               Nhỏ hơn

    >=             Lớn hơn hoặc bằng

    <=             Nhỏ hơn hoặc bằng

    BETWEEN    Nằm giữa một khoảng

    LIKE           So sánh mẫu chuỗi

Lưu ý: Trong một số phiên bản của SQL, phép toán <> có thể được viết dưới dạng !=

Ví dụ để lấy danh sách những người sống ở thành phố Sandnes, ta sử dụng mệnh đề WHERE trong câu lệnh

SELECT như sau:

    SELECT * FROM Persons

    WHERE City = 'Sandnes'Re: Sử dụng SQL để truy vấn dữ liệu trong PHP

« Reply #3 on: January 30, 2007, 08:36:56 AM »

Tóan tử AND và OR

Page 42: giáo trình PHP

Hai toán tử AND và OR nối hai hoặc nhiều điều kiện trong mệnh đề WHERE lại với nhau.

Toán tử AND sẽ hiển thị 1 dòng nếu TẤT CẢ các điều kiện đều thoả mãn. Toán tử OR hiển thị một dòng nếu BẤT

KỲ điều kiện nào được thoả.

Ví dụ: Sử dụng AND để tìm những người có tên là Tove và họ là Svendson:

    SELECT * FROM Persons

    WHERE FirstName = 'Tove'

    AND LastName = 'Svendson'

Ví dụ: Sử dụng OR để tìm những người có tên là Tove hoặc họ là Svendson:

    SELECT * FROM Persons

    WHERE firstname = 'Tove'

    OR lastname = 'Svendson'

Ví dụ: Sử dụng kết hợp AND và OR cùng với dấu ngoặc đơn để tạo nên các câu truy vấn phức tạp:

    SELECT * FROM Persons WHERE

    (FirstName = 'Tove' OR FirstName = 'Stephen')

    AND LastName = 'Svendson'Re: Sử dụng SQL để truy vấn dữ liệu trong PHP

« Reply #4 on: January 30, 2007, 08:39:45 AM »

Từ khoá DISTINCT

Từ khoá DISTINCT được dùng để lọc ra các giá trị khác nhau.

Câu lệnh SELECT sẽ trả về thông tin về các cột trong bảng. Nhưng nếu chúng ta không muốn lấy về các giá trị

trùng nhau thì sau?

Với SQL, ta chỉ cần thêm từ khoá DISTINCT vào câu lệnh SELECT theo cú pháp sau:

    SELECT DISTINCT tên_cột FROM tên_bảng

Ví dụ: Tìm tất cả các công ty trong bảng đặt hàng, câu lệnh SQL thông thường sẽ như sau:

    SELECT Company FROM Orders

Để tìm tất cả các công ty khác nhau trong bảng đặt hàng, ta sử dụng câu lệnh SQL sau:

    SELECT DISTINCT Company FROM OrdersRe: Sử dụng SQL để truy vấn dữ liệu trong PHP

« Reply #5 on: January 30, 2007, 08:43:05 AM »

Mệnh đề ORDER BY:

Mệnh đề ORDER BY được dùng để sắp xếp các dòng.

Cú pháp: Select..... ORDER BY tên các cột [ASC/DESC]

ORER BY có thể đi kèm từ khóa DESC để sắp xếp theo chiều giảm dần, hoặc ASC để sắp xếp theo chiều tăng dần

của các cột

VD: Để lấy danh sách các công ty theo thứ tự chữ cái (tăng dần):

    SELECT Company, OrderNumber FROM Orders

    ORDER BY Company

Page 43: giáo trình PHP

VD 2: Lấy danh sách các công ty theo thứ tự chữ cái (tăng dần) và hoá đơn đặt hàng theo thứ tự số tăng dần:

    SELECT Company, OrderNumber FROM Orders

    ORDER BY Company, OrderNumber

VD 3: Lấy danh sách các công ty theo thứ tự giảm dần:

    SELECT Company, OrderNumber FROM Orders

    ORDER BY Company DESCRe: Sử dụng SQL để truy vấn dữ liệu trong PHP

« Reply #6 on: March 18, 2007, 12:41:35 PM »

Truy vấn CSDL với PHP

Ở bài trước, chúng ta đã biết cách dùng hàm mysql_query() để tiến hành các truy vấn sửa, thêm và xóa. Bài này

tập trung vào việc ứng dụng PHP để lấy thông tin từ CSDL.

Qua những phần ở trên, chúng ta đã biết cách làm việc với các câu truy vấn SELECT. Bây giờ, kết hợp với hàm

mysql_query() để lấy thông tin.

Cú pháp hàm mysql_query như sau:

mysql_query(câu lệnh sql).

VD: Để lấy tất cả các bản ghi trong bảng "Members", ta sẽ gọi hàm mysql_query() như sau:

<?

mysql_query ("Select * from Members")

?>

Vấn đề là khi thực hiện truy vấn này, dữ liệu sẽ được trả về dưới dạng một bảng. Ta sẽ tiến hành lấy từng dòng

của bảng đó ra dưới dạng một mảng (sử dụng hàm mysql_fetch_array()), tiếp đó, việc xử lý các phần tử của mảng

đó như thế nào là tùy ý các bạn.

Xem ví dụ sau:

<?php

    $result = mysql_query("SELECT id, name FROM mytable");

    while ($row = mysql_fetch_array($result, MYSQL_ASSOC))

    {

        printf ("ID: %s  Name: %s", $row["name"]);

    }

    mysql_free_result($result);

?>

Đoạn lệnh trên lặp duyệt qua bảng kết quả result, đối với mỗi dòng của bảng, hàm mysql_fetch_array() sẽ đảm

nhiệm việc tách dòng đó rồi đưa vào một mảng có tên là $row. Mỗi phần tử của mảng này sẽ là giá trị của cột có

tên tương ứng.Re: Sử dụng SQL để truy vấn dữ liệu trong PHP

« Reply #7 on: April 21, 2007, 11:12:05 AM »

Như vậy, trước khi xác định dữ liệu cần lấy là gì, chúng ta phải thiết kế câu truy vấn SQL sao cho hợp lý và đảm

bảo rằng truy vấn đó chỉ lấy ra những thông tin gì cần sử dụng. Nếu lấy ra nhiều quá sẽ gây quá tải hệ thống dẫn

đến treo máy.

Page 44: giáo trình PHP

Sau khi đã có được câu truy vấn SQL, ta chỉ việc kết hợp với hàm mysql_query() để trả kết quả về dưới dạng một

biến nào đó.

 

Phần tiếp theo, chúng ta sẽ dùng một hàm có tên là mysql_fetch_array () để lấy từng dòng dữ liệu ra để xử lý.

Hàm mysql_fetch_array có hai tham số:

- Tham số đầu tiên xác định biến nắm giữ kết quả trả về bởi hàm mysql_query()

- Tham số thứ hai xác định kiểu định danh trường:

+ MYSQL_ASSOC: Đưa ra một mảng với chỉ số của mảng là tên trường

+ MYSQL_NUM: Đưa ra một mảng với chỉ số của mảng là số thứ tự của trường được liệt kê trong câu truy vấn SQL

+ MYSQL_BOTH: Đưa ra một mảng với chỉ số kết hợp giữa hai loại trên

Thông thường, ta dùng MYSQL_ASSOC để sử dụng chỉ số bằng tên các trường.Re: Sử dụng SQL để truy vấn dữ liệu trong PHP

« Reply #8 on: April 21, 2007, 11:21:08 AM »

Khi truy vấn CSDL MySQL, ta có thể sử dụng thêm một số hàm phụ trợ:

mysql_num_rows(biến kết quả): trả về số các dòng lấy được từ biến kết quả.

VD:

<?php

$link = mysql_connect("localhost", "mysql_user", "mysql_password");

mysql_select_db("database", $link);

$result = mysql_query("SELECT * FROM table1", $link);

$num_rows = mysql_num_rows($result);

echo "Có $num_rows bản ghi được tìm thấy\n";

?>

Tương tự ta có:

mysql_num_fields (biến kết quả): Trả về số trường (cột) trong tập kết quả

mysql_affected_rows (): Trả về số bản ghi bị ảnh hưởng bởi các câu lệnh SQL INSERT, UPDATE, DELETE.

Ví dụ:

<?php

    mysql_pconnect("localhost", "mysql_user", "mysql_password") or

        die ("Could not connect");

    mysql_query("DELETE FROM mytable WHERE id < 10");

    printf ("Số bản ghi bị xóa: %d\n", mysql_affected_rows());

?>

 

mysql_data_seek ( nguồn kết quả, dòng cần truy cập): Hàm này chuyển con trỏ dòng của nguồn kết quả

đến một dòng nào đó. Dòng đầu tiên trong bảng kết quả được đánh số là 0, dòng cuối cùng chính là

mysql_num_rows()-1. Hàm trả về TRUE nếu thành công, ngược lại là FALSE

Chú ý rằng hàm này chỉ sử dụng cùng với hàm mysql_query

Ví dụ:

<?php

    $link = mysql_pconnect("localhost", "mysql_user", "mysql_password")

        or die("Could not connect");

Page 45: giáo trình PHP

    mysql_select_db("samp_db")

        or exit("Could not select database");

    $query = "SELECT last_name, first_name FROM friends";

    $result = mysql_query($query)

        or die("Query failed");

    /* fetch rows in reverse order */

    for ($i = mysql_num_rows($result) - 1; $i >= 0; $i--) {

        if (!mysql_data_seek($result, $i)) {

            echo "Cannot seek to row $i\n";

            continue;

        }

        if(!($row = mysql_fetch_object($result)))

            continue;

        echo "$row->last_name $row->first_name<br />\n";

    }

    mysql_free_result($result);

?>Xử lý XML

« on: January 08, 2008, 04:49:46 AM »

PHP5 cung cấp class SimpleXML là một class rất dễ sử dụng, bài này sẽ hướng dẫn các bạn parse file XML trong 7

nốt nhạc.

Đầu tiên, lấy một đoạn XML mẫu để tập tành phân tích:Code:

<?xml version="1.0"?>

<books>

  <book isbn="978-1594489501">

    <title>A Thousand Splendid Suns</title>

    <author>Khaled Hosseini</author>

    <publisher>Riverhead Hardcover</publisher>

    <amazon_price>14.27</amazon_price>

  </book>

  <book isbn="978-1594489587">

    <title>The Brief Wondrous Life of Oscar Wao</title>

    <author>Junot Diaz</author>

    <publisher>Riverhead Hardcover</publisher>

    <amazon_price>14.97</amazon_price>

  </book>

  <book isbn="978-0545010221">

    <title>Harry Potter and the Deathly Hallows</title>

    <author>J. K. Rowling</author>

    <publisher>Arthur A. Levine Books</publisher>

    <amazon_price>19.24</amazon_price>

  </book>

</books>

Để tạo ra một đối tượng SimpleXmlElement, cách đơn giản là truyền vào một chuỗi hoặc một file:

Page 46: giáo trình PHP

Code:

// Passing the XML

$books = SimpleXMLElement($XmlData);

//-------------------

// Passing a filename

$books = SimpleXMLElement('books.xml', null, true);

Nhìn vào đoạn XML ví dụ, ta sẽ lấy ra tất cả các book hay của Amazon:Code:

<?php

// load SimpleXML

$books = new SimpleXMLElement('books.xml', null, true);

echo <<<EOF

<table>

    <tr>

        <th>Title</th>

        <th>Author</th>

<th>Publisher</th>

        <th>Price at Amazon.com</th>

        <th>ISBN</th>

    </tr>

EOF;

foreach($books as $book) // loop through our books

{

    echo <<<EOF

    <tr>

        <td>{$book->title}</td>

        <td>{$book->author}</td>

        <td>{$book->publisher}</td>

        <td>${$book->amazon_price}</td>

        <td>{$book['isbn']}</td>

    </tr>

EOF;

}

echo '</table>';

?>

Bạn để ý rằng $books (có chữ 's' nhé) là một Element do khái niệm mỗi một file XML thì phải có root element. Vì

thế, đừng mong đợi có đối tượng SimpleXml không nhé . Mỗi element có thể có nhiều element con cùng loại hay

khác loại, ví dụ này là cùng loại 'book' và class SimpleXmlElement này cho phép ta duyệt qua các element con

cùng loại như một array như ví dụ foreach() ở trên.

Cuối cùng, nói về cú pháp truy cập child element và attribute. Bác nào chưa biết khái niệm này nữa thì:Code:

  <book isbn="978-1594489501">

    <title>A Thousand Splendid Suns</title>

    <author>Khaled Hosseini</author>

    <publisher>Riverhead Hardcover</publisher>

    <amazon_price>14.27</amazon_price>

  </book>

Page 47: giáo trình PHP

isbn là một attribute, các giá trị của một attribute phải để trong dấu (")

<title>, <author>,... là các child element

Chỉ giải thích tới đây thôi, bác nào có ý định ngâm cứu XML, XML Schema,... thì 5s gợi ý là nên ... từ bỏ ý định

ngông cuống thừa thời gian này đi vì có cả năm  may ra học mới xong mà học từ tháng 1-12 thì tới tháng 12 sẽ

quên tháng 1 . Cứ việc coi nó như khái niểm HTML đã  học rồi xài cho thoải mái nhá.

Quay về cú pháp, lại coi ví dụ 'simple' trên: $book->title là truy cập child element trong khi $book['isbn'] là truy

cập attribute. Done!!!

Đơn giản thế thôi, bạn thấy xử lý XML data có dễ chưa ?

Ví dụ trên, nếu bạn không thích dụng foreach thì có thể dùng biến counter $i, viết lại là $tempBook = $books-

>book[$i] rồi dùng $tempBook để xử lý.

Giờ thêm vào tí XPath cho nó bằng anh bằng em:

XPath đơn giản là cách chỉ ra đường dẫn "path" trong 1 XML document thông qua các element cha/con theo cú

pháp giống như thư mục của linux: /home/user/... Xpath giúp bạn lọc ra các child element trong các element cha

cùng loại, gom lại thành mảng và xử lý.

Ví dụ sau giúp bạn lấy ra tất cả các title của book và tất cả các số ISBN:Code:

$titles = $books->xpath('book/title');

foreach($titles as $title)

{

    echo $title.PHP_EOL;

}

//////////////////////////////////////////////

$isbn = $books->xpath('book/@isbn');

foreach($isbn as $isbn)

{

    echo $isbn.PHP_EOL;

}

Nhớ chú ý cách dùng cú pháp / và /@ nhé.

Giờ parse thử RSS của tuổi trẻ coi sao nèCode:

<?php

$rss = new SimpleXMLElement('http://www.tuoitre.com.vn/tianyon/RssView.aspx?ChannelID=16', nul

l, true);

echo "<h1><a href='{$rss->channel->link}'>{$rss->channel->title}</a></h1>".PHP_EOL.'<hr /

>'.PHP_EOL;

foreach($rss->xpath('channel/item') as $item)

{

    echo <<<EOF

<h2><a href='{$item->link}'>{$item->title}</a></h2>

<div>Posted at: {$item->pubDate}</div>

Page 48: giáo trình PHP

{$item->description}

<hr />

EOF;

}

?>

Cuối cùng,một vài thuộc tính của đối tượng SimpleXmlElement các bạn sẽ quan tâm:

    $value      = trim((string) $element);  // Bản thên element nó là XML, bạn lấy giá trị của element thì ép kiểu về

string

    $attributes = $element->attributes();   // lấy tất cả các attribute

    $children   = $element->children();     // lấy các child elementLDAP (Lightweight Directory Access Protocol)

« on: September 23, 2007, 08:43:43 PM »

Hiện nay, để xây dựng các hệ thống lớn, điều tối quan trọng là phải làm cách nào để có thể tích hợp dữ liệu để từ

đó có thể dùng chung giữa các hệ thống khác nhau. Trong đó, tích hợp tài khoản của người sử dụng là vấn đề cần

thiết nhất trong những cái "tối quan trọng" trên.

Hãy tưởng tượng một hệ thống với khoảng 5 - 6 mô đun khác nhau, mỗi mô đun lại được thiết kế trên một nền

tảng khác nhau (Có ông thì dùng Oracle + AS Portal, có người thì xài DB2 với WebSphere, lão khác thì MySQL với

phpnuke, ông thì xài Wíndow, lão thì cài Linux, có thằng điên lại chỉ thích Unix...hic, cuộc đời thật đúng là bể khổ),

do đó cần có một hệ thống người dùng khác nhau. Vậy thì với mỗi mô đun, người sử dụng cần phải có một User

Name, một mật khẩu khác nhau, đó là điều không thể chấp nhận được. Người dùng chẳng mấy chốc mà chán

ghét hệ thống.

Làm cách nào để có thể tích hợp được người dùng giữa các hệ thống trên? Câu trả lời đó là LDAP.

Vây LDAP là gì?

LDAP - viết tắt của Lightweight Directory Access Protocol, hay dịch ra tiếng Việt có nghĩa là giao thức truy cập

nhanh các dịch vụ thư mục.

•   Là một giao thức tìm, truy nhập các thông tin dạng thư mục trên server.

•   Nó là giao thức dạng Client/Server dùng để truy cập dịch vụ thư mục.

•   LDAP chạy trên TCP/IP hoặc các dịch vụ hướng kết nối khác.

•   Là một mô hình thông tin cho phép xác định cấu trúc và đặc điểm của thông tin trong thư mục.

•   Là một không gian tên cho phép xác định cách các thông tin được tham chiếu và tổ chức

•   Một mô hình các thao tác cho phép xác định các tham chiếu và phân bố dữ liệu.

•   Là một giao thức mở rộng

•   Là một mô hình thông tin mở rộng.

Ở đây chúng ta cần tránh hiểu nhầm từ "thư mục" như trên Windows là folder hay directory, đó là thư mục theo

nghĩa hẹp để quản lý hệ thống tệp tin. Từ thư mục trong LDAP mang ý nghĩa rộng hơn, nó bao hàm các cấu trúc

dữ liệu dạng liệt kê theo thư mục (hay mục lục) - một "từ khoá" của dân thư viện nhằm ám chỉ cách thức sắp xếp

dữ liệu để tiện truy xuất nhất. Re: LDAP (Lightweight Directory Access Protocol)

« Reply #1 on: September 23, 2007, 09:03:23 PM »

Làm việc với LDAP thông qua PHP

Trình tự cơ bản khi có thao tác với LDAP gồm các bước

•   Connect (kết nối với LDAP)

•   Bind (kiểu kết nối: nặc danh hoặc đăng nhập xác thực)

•   Search (tìm kiếm)

•   Interpret search (xử lý tìm kiếm)

Page 49: giáo trình PHP

•   Result (kết quả)

•   Close connection (đóng kết nối)Re: LDAP (Lightweight Directory Access Protocol)

« Reply #2 on: September 23, 2007, 09:08:21 PM »

Ldap_connect():

hàm kết nối tới máy chủ LDAP, hàm này có 2 tham số: hostname (tên máy chủ LDAP) và port (cổng kết nối, mặc

định là cổng 389)

Ldap_connect(string hostname, int port);

Code:

<?php

// LDAP variables

$ldaphost = "ldap.example.com";  // your ldap servers

$ldapport = 389;                 // your ldap server's port number

// Connecting to LDAP

$ldapconn = ldap_connect($ldaphost, $ldapport)

         or die("Không thể kết nối được đến $ldaphost");

?>Re: LDAP (Lightweight Directory Access Protocol)

« Reply #3 on: September 23, 2007, 09:09:33 PM »

Ldap_bind();

Hàm nối kết với server LDAP để có thể thao tác với LDAP

Vd kết nối với LDAP server bằng user và password hợp lệCode:

<?php

// using ldap bind

$ldaprdn  = 'uname';     // ldap rdn or dn

$ldappass = 'password';  // associated password

// connect to ldap server

$ldapconn = ldap_connect("ldap.example.com")

   or die("Could not connect to LDAP server.");

if ($ldapconn) {

   // binding to ldap server

   $ldapbind = ldap_bind($ldapconn, $ldaprdn, $ldappass);

   // verify binding

   if ($ldapbind) {

       echo "LDAP bind successful...";

   } else {

       echo "LDAP bind failed...";

   }

}

?>

Page 50: giáo trình PHP

Nếu kết nối bằng quyền anonymouslyCode:

<?php

//using ldap bind anonymously

// connect to ldap server

$ldapconn = ldap_connect("ldap.example.com")

   or die("Could not connect to LDAP server.");

if ($ldapconn) {

   // binding anonymously

   $ldapbind = ldap_bind($ldapconn);

   if ($ldapbind) {

       echo "LDAP bind anonymous successful...";

   } else {

       echo "LDAP bind anonymous failed...";

   }

}

?>Re: LDAP (Lightweight Directory Access Protocol)

« Reply #4 on: September 23, 2007, 09:10:48 PM »

ldap_search();

ldap_search ( resource link_identifier, string base_dn, string filter [, array attributes [, int attrsonly [, int sizelimit [,

int timelimit [, int deref]]]]] )

VD tìm kiếm các thông tin của tất cả mọi người ở trong “My Company” nơi surname hoặc given name chứa trong

biến $person. Ví dụ này yêu cầu server tìm ra thông tin của nhiều hơn một thuộc tính cần tìm kiếm.

Code:

<?php

// $ds is a valid link identifier for a directory server

// $person is all or part of a person's name, eg "Jo"

$dn = "o=My Company, c=US";

$filter="(|(sn=$person*)(givenname=$person*))";

$justthese = array("ou", "sn", "givenname", "mail");

$sr=ldap_search($ds, $dn, $filter, $justthese);

$info = ldap_get_entries($ds, $sr);

echo $info["count"]." entries returned\n";

?>Re: LDAP (Lightweight Directory Access Protocol)

« Reply #5 on: September 24, 2007, 12:42:19 AM »

Ldap_close();

Page 51: giáo trình PHP

Hàm đóng kết nối với LDAP, hàm này tương đương với ldap_unbind();

bool ldap_unbind ( resource link_identifier );

Nếu kết nối đóng thành công sẽ trả về giá trị TRUE, ngược lại là FALSE.Re: LDAP (Lightweight Directory Access Protocol)

« Reply #6 on: September 24, 2007, 12:43:14 AM »

ldap_add();

Hàm thêm các entry vào thư mục LDAP

bool ldap_add ( resource link_identifier, string dn, array entry )

Code:

<?php

$ds = ldap_connect("localhost");  // assuming the LDAP server is on this host

if ($ds) {

   // bind with appropriate dn to give update access

   $r = ldap_bind($ds, "cn=root, o=My Company, c=US", "secret");

   // prepare data

   $info["cn"] = "John Jones";

   $info["sn"] = "Jones";

   $info["mail"] = "[email protected]";

   $info["objectclass"] = "person";

   // add data to directory

   $r = ldap_add($ds, "cn=John Jones, o=My Company, c=US", $info);

   ldap_close($ds);

} else {

   echo "Unable to connect to LDAP server";

}

?>Re: LDAP (Lightweight Directory Access Protocol)

« Reply #7 on: September 24, 2007, 12:44:10 AM »

ldap_delete();

Xóa một entry khỏi thư mục LDAP

Code:

bool ldap_delete ( resource link_identifier, string dn )

Hàm trả về giá trị TRUE nếu xóa thành công và FALSE nếu thất bạiRe: LDAP (Lightweight Directory Access Protocol)

« Reply #8 on: September 24, 2007, 12:44:52 AM »

ldap_compare();

So sánh giá trị của một thuộc tính

mixed ldap_compare ( resource link_identifier, string dn, string attribute, string value )

VD:

Page 52: giáo trình PHP

Code:

<?php

$ds=ldap_connect("localhost");  // assuming the LDAP server is on this host

if ($ds) {

   // bind

   if (ldap_bind($ds)) {

       // prepare data

       $dn = "cn=Matti Meikku, ou=My Unit, o=My Company, c=FI";

       $value = "secretpassword";

       $attr = "password";

       // compare value

       $r=ldap_compare($ds, $dn, $attr, $value);

       if ($r === -1) {

           echo "Error: " . ldap_error($ds);

       } elseif ($r === true) {

           echo "Password correct.";

       } elseif ($r === false) {

           echo "Wrong guess! Password incorrect.";

       }

   } else {

       echo "Unable to bind to LDAP server.";

   }

   ldap_close($ds);

} else {

   echo "Unable to connect to LDAP server.";

}

?>Re: LDAP (Lightweight Directory Access Protocol)

« Reply #9 on: September 24, 2007, 01:07:52 AM »

Ldap_count_entries();

Đếm số lượng các entry được tìm thấy từ kết quả của lệnh tìm kiếm.

int ldap_count_entries ( resource link_identifier, resource result_identifier )Re: LDAP (Lightweight Directory Access Protocol)

« Reply #10 on: September 24, 2007, 01:08:43 AM »

ldap_error();

trả lại thông báo lỗi LDAP của lệnh LDAP cuối cùng.

string ldap_error ( resource link_identifier )Re: LDAP (Lightweight Directory Access Protocol)

« Reply #11 on: September 24, 2007, 01:09:51 AM »

Page 53: giáo trình PHP

ldap_first_attribute();

hàm trả lại thuộc tính đầu tiên của entry

string ldap_first_attribute ( resource link_identifier,

resource result_entry_identifier,

int &ber_identifier )Re: LDAP (Lightweight Directory Access Protocol)

« Reply #12 on: September 24, 2007, 01:11:27 AM »

ldap_first_entry();

trả lại kết quả id đầu tiên của entry

ldap_first_entry ( resource link_identifier, resource result_identifier )Re: LDAP (Lightweight Directory Access Protocol)

« Reply #13 on: September 24, 2007, 01:13:12 AM »

ldap_first_reference();

trả lại tham chiếu đầu tiên

ldap_first_reference ( resource link, resource result )Re: LDAP (Lightweight Directory Access Protocol)

« Reply #14 on: September 24, 2007, 01:13:59 AM »

ldap_free_result();

giải phóng kết quả bộ nhớ

bool ldap_free_result ( resource result_identifier )Thủ thuật sử dụng thư viện GD

« on: January 10, 2008, 03:54:43 AM »

Cơ Bản Graphics

Chúng ta hãy bắt đầu tìm hiểu khái niệm về tệp ảnh là gì và nó đuợc diễn đạt qua máy vi tính như thế nào. Một

tệp ảnh chẳng khác nào là một tập hợp của nhiều pixel hay dots bởi một màu sắc nhất định nào đó.

Mọi hình ảnh đều có dạng hình chử nhật (rectangular) và có cạnh dài và ngắn nhất định, đuợc tạo bởi một matrix

của pixels. 100 hình mỗi hình có 300 pix sẽ có tổng số pix là 30000 pixels. Trong php, hình ảnh là một hệ thống

liên hợp (coordinate). Ví dụ: x bằng 300 và y bằng 100.

Ở góc độ trên bên trái của hình nó sẽ luôn là (0,0). Giá trị của x tăng dần theo khi kéo chéo một đường từ góc trái

xuống góc phải đối diện (x,y), cũng như giá trị y tăng dần khi kéo một đường thẳng từ trên xuống dưới(0,y).Khi

cho nội dung bất kỳ vào khung ảnh nó luôn liên quan tới góc độ trái phía bên trên. Nhìn ví dụ trên, góc liên hợp

(180, 50) đựơc đóng lại phía tay phải của tệp hình, khoảng giữa đổ xuống.

Làm một ví dụ tương tự trong đời sống, để xem hình ảnh đựơc diễn tả như thế nào. Bạn hãy tưởng tượng bạn đặt

100 con cá màu vàng vào một ô có chiều cao là 10 và chiều dài cũng là 10, căn bản bạn sẽ thấy một hình vuông

màu vàng. Bây giờ bạn thử thay vào đó vài con cá khác màu xanh theo dạng hình chữ H bạn sẽ nhận ra ngay chữ

H xanh trong một khung hình vàng. Chúc mừng bạn, bạn đã tạo một tệp ảnh động rồi đó...

Một điểm cần chú ý nữa đó là transparency (vô sắc).Transparency có khả năng tẩy „clear“ pixel. Trong trường hợp

bạn muốn giấu mấy con cá vàng, bạn chỉ cần đổi chúng thành vô sắc, sau đó bạn chỉ còn thấy chữ H màu xanh

bao bọc bởi một màu trắng do transparency kết nối lại với nhau.

Page 54: giáo trình PHP

Image-formate

Cấu trúc, được html hiện thị lên web-site để biểu diễn hình ảnh luôn là một liên đới tĩnh (relativ statisch ). Dạng

hình đã thay đổi chút ít trong những năm qua. 3 dạng hình quan trọng thường đựơc dùng là gif, jpeg, png.

GIF được viết tắc từ Graphics Interchange Format. Vài năm trước đây gif rất được sử dụng phổ biến, bởi tính năng

vô sắc ( transparency ) của nó. Dạng màu của Gif được  kết hợp bởi 8-bit, do đó bạn chỉ có thể có 256 màu trong

một tệp ảnh duy nhất.

Do ảnh hưởng của sức chứa màu, ảnh Gif chủ thích hợp với những khung có diện tích lớn.

Trong những năm gần đây Unisys Corporation, chủ quyền của LZW compression, người toàn quyền về việc sử

dụng dạng hình gif, đã mất quyền chuyên giữ (patent) vào khoảng tháng 6 2003, nên giới sử dụng dạng gif cũng

giảm xuống rất nhiều.

JPEG, Joint Photographic Experts Group, một dạng hình thích hợp cho ảnh chụp.Dạng jpeg không có vô sắc màu,

nên nó không thích hợp với các toolbars hay Form không có góc cạnh.

PNG, Portable Network Graphics, một dạng dình mới được hổ trợ bởi nhiều trình duyệt. PNG có nhiều điểm lợi gần

như của gif cộng cả tính vô sắc màu. Điểm cần chú ý PNG không biểu hiện rỏ ràng trên trình duyệt của netscape

4, nhưng mọi trình duy hiện tại đều diễn đạt tốt. Bạn nên thử loại hình này trong mọi trình duyệt xem nó có thích

ứng không.

Thủ thuật biến đỏi ảnh bằng PHP

GD là một ANSI-C thư viện cho việc tạo lập hình ảnh động. Tương tự như php, thư viện gd là một mã nguồn mở

của boutell.com bạn có thể vào đây để tải nó xuống nếu trong php chưa có thư viện này ( tôi nghĩ rằng không,

php đã cài sẳn nó rồi, cảm ơn trời phật :-))

Installation thư viện GD: chỉ nói ngắn gọn.

xem trong file php.ini. Tìm dòng ;extension=php_gd2.dll bỏ dấu „ ; „  và start apache là ok. Muốn cho chắc chắn

thì vào trình duyệt gọi tệp này <?php phpìno() ; ?> xem tv GD đã bật chưa.

GD-API bao gồm nhiều function, giúp bạn tạo, sửa các tệp tin hình ảnh qua lập trinh php.API rất bao la và không

chỉ vỏn vẹn trong phần tạo ứng nhỏ trong bài này. Chúng ta tập trung vào 4 điểm quan trọng :

-Phương thức cơ bản (basic funtions)

-Sảo thuật màu (color manipulation)

-Vẽ hình (drawing primitive shapes)

-Vẽ chữ ( working with text)

the basic function

Chúng ta bắt đầu với cốt lõi của function và dùng nó để tạo hình trong bất kỳ server-graphic nào. Function này sẽ

nạp (load ) hình từ máy, lưu giử vào bộ phận nhớ ( memory) sau đó ghi hình vào đĩa cứng (disk) hay chuyển

(streaming) đến trình duyệt.

Creating Images

Bạn có thể dùng function imagecreate () để tạo một nguồn ảnh mới để chỉnh đổi. Cách gọi : Ressource

imagecreate (int x_size, int y_size) .

Function imagecreate() trả lại cho chúng ta nguồn (resource) tương đương với ảnh hình giống như cú pháp của

mysql mysql_connect() trả cho chúng ta một mảng dử liệu ( recordset), nhưng bạn không thể sử lý trực tiếp vào

biến này được, ở đây có liên quan đến funtion làm biến đổi hình ảnh, do đó nó sẽ vận chuyển source của ảnh đến

funtion image để làm việc này. Function sẽ cho ta kết quả của ảnh ở độ phân giải x_size và y_size.

Sử dụng ảnh đã có (Using Existing Images)

Để tạo một ảnh trống (blank image) , chúng ta có thể lấy ảnh từ disk qua các funtions sau:

resource imagecreatefromjpeg (string filename) // ảnh dạng jpeg

Ressource imagecreatefrompng (string filename) // ảnh dạng png

Nhiều tương tự như funtion imagecreate(). 2 Funtions này trả cho ta giá trị của nguồn ảnh tương đương với tệp

ảnh trong disk , nếu nó là true. Nguợc lại funtion trả một chuỗi trống ( empty string) nếu là false. Nếu fopen-

wrappers' được bật lên ( có thể chỉnh sửa trong tệp tin php.ini) bạn có thể dùng URL như tên của tệp ảnh.

Nhưng coi chừng máy sẽ chạy chậm đi vì phải tìm chất liệu qua HTTP.  Mỗi khi 1 chức năng dùng URL thay vì một

hồ sơ trên đĩa, chức năng script phải tìm qua mạng lưới. Vì qua mạng lúc nào cũng chậm hơn là đi thẳng từ đĩa

Page 55: giáo trình PHP

nên máy chạy chậm đi là 1 quan tâm ở đây.

fopen_wrappers chạy tốt với php trên nền unix và cũng được chỉnh sửa trên nền Windows kể từ phiên bản (vers.)

4.3.

Truy tìm kích thước của tệp ảnh ( Finding an Image's Size)

Rất nhiều điểm lợi khi ứng dụng web cho ta biết kích thước của ảnh. Chúng ta có thể sử dụng thông tin này:ví dụ

cần kích thước chính xác của ảnh để làm một popup-window cho một thư viện ảnh hoặc đặt ảnh theo chiều cao,

rộng trong <img>tag.

Array getimagesize ( string filename [, array imageìno])

funtion getimagesize() trả về cho ta 4 phần tử (elements) array là:

element 0: độ ngang của ảnh trỏ về tham số pixels của tệp ảnh

element 1: độ cao của ảnh trỏ về tham số pixels của tệp ảnh

element 2: trị số (interger) tương đương cho loại ảnh (typ image) (1=gif, 2=JPG, 3=PNG)

element 4: chuỗi gắn thêm (add) vào <img>tag để biểu hiện độ cao rộng, vd: „height=100 width=200“

Tham số (parameter) của tệp ảnh dự bị được chuyển đưa đến dãy array nhằm lấy thêm những thông tin của ảnh.

Khi họat động nó trả lại một JPG APP (nhờ thằng google nó giải thích giùm là cái gì nhá) khác nằm trong một

associative array.

Truy lùng độ phân giả cao rộng ( retrieving the width and height)

Nếu chúng ta cần đến độ cao rộng của ảnh chúng ta không cần đo thông tin ảnh trong mãng array một cách khó

khăn.

Chúng ta có thể sử dụng funtion imagesx() và imagey() để truy tìm độ cao rộng của tệp ảnh.

Int imagex ( resource image)

Int imagey ( resource image)

Như đã thấy funtions imagex và imagey trả cho ta giá trị của độ cao và rộng của tệp ảnh. Cũng cần lưu ý function

này không giống như function getimagesize trên. 2 functions này chỉ lấy nguồn ảnh (resource) , chứ không phải

đường dẫn của ảnh (file path). Muốn tạo ảnh bạn nên dùng funtion imagecreate() trước sau đó đến 2 function

imagex() và imagey() để lấy tham số của ảnh do imagecreate() tạo.

Copy và Bóp ảnh ( copy & resizing an a image)

 Chúng ta có thể dùng coy và resize để tạo ảnh mới. Function này rất lợi cho việc làm thư viện hình ảnh như

thubmnails...

int imagecopyresized (resource dst_im, resource src_im,

int dstX, int dstY,int srcX, int srcY,

int dstW, int dstH, int srcW, int srcH)

Function này copy phần góc (rectangular) của nguồn ảnh và trao trả chúng đến đích của ảnh thật.

dst_im, src_im – the destination and source image resources

int dstX, int dstY – the upper-left corner of the replaced content in the destination image

int srcX, int srcY – the upper-left corner of the source content in the source image

int dstW, int dstH – the width and height of the rectangular area to replace in the destination image

int srcW, int srcH – the width and height of the rectangular area to copy in the source image

Nếu trong phạm vi góc thì không tương ứng với độ cao rộng trong khoảng giữa nguồn ảnh và đích ảnh. Function

này họat động tương đối nó có thể copy từng vùng (regions) với cùng lọai ảnh (same image) (vd: dst_im tuơng

ứng với src_im ). Tuy nhiên nếu vùng ảnh(régions) nằm trên vùng đã có kết quả (results) thì ta không thể liệu

trước được.

Cho ảnh hiệ thị trên trình duyệt ( outputting to the browser)

Khi đã chỉnh sửa ảnh xong, chúng ta cần tìm giải pháp cho ảnh hiện trên trình duyệt. Để làm việc này chúng ta

dùng function imagepng() and imagejpeg()

int imagepng (resource image [, string filename])

int imagejpeg (resource image [, string filename])

function này xuất dữ liệu nguyên thủy (raw) của ảnh đến trinh duyệt. Nếu nguồn ảnh là một tên tệp (file name) ,

nó sẽ được ghi chép mọi thông tin vào tệp ảnh. Tên tệp phải nằm trong đĩa cứng (disk) và php phải có toàn quyền

(chmod 777) để sao chép tin tệp. Ta cần dùng funtion header() trong trình duyệt khi muốn đưa ảnh hiện thị.

Page 56: giáo trình PHP

Xóa bỏ bộ nhớ ( Reclaiming  used Memory)

Sau giao chuyển hình đến trinh duyệt chúng ta cần loại bỏ đi phần tồn trong bộ phận nhớ qua function :

imagedestory().

int imagedestory ( resource image)

Cách sử dụng căn bản

Để dùng function này chúng ta cần tạo một thubmnail để nạp (load) hình và kéo nhỏ xuống 1/8 so với ảnh nguyên

thủy , kế đến lưu vào đĩa.Code:

<?php                     

   //load the image into memory and get its properties

   $img = imagecreatefrompng("goldengate.png");

   $imgsz = getimagesize("goldengate.png");

   

   //create new image for thumbnail 1/8 the size of the original

   $thumb = imagecreate($imgsz[0]/8, $imgsz[1]/8);

   

   //shrink the original image to 1/8th its size

   imagecopyresized($thumb, $img, 0, 0, 0, 0, 

$imgsz[0]/8, $imgsz[1]/8, $imgsz[0], $imgsz[1]);

   

   //write the thumbnail to disk

   imagepng($thumb, "goldengate_thumb.png");

   

   //get the image size of the thumbnail for use in the HTML below

   $thumbsz = getimagesize("goldengate_thumb.png");

   

   //free resources occupied by the images

   imagedestroy($img);

   imagedestroy($thumb);

?>

<html>

   <body>

     <img src="goldengate.png" <?php echo $imgsz[3] ?>>

     <img src="goldengate_thumb.png" <?php echo $thumbsz[3] ?>>

   </body>

Pha màu (Working with Color)

Ngoài cách sử dụng những function trên khi đã có một nguồn ảnh bạn cũng sẽ muốn biến đổi chúng đôi chút thay

vì chỉ bóp ảnh nhỏ lại. Có lẽ bạn đã ít nhiều quen biết với nhiều loại màu sắc.Như cấu trúc của html, thư viện GD

xem màu sắc như một màu tổng hợp bởi xanh, đỏ, vàng. Chúng ta có thể hoán đổi giá trị màu qua thông số

hexadecimal biến chúng thành một màu thích hợp. Màu ở dạng html số đầu có hai digits là đỏ (red), kế đến là

xanh lá (green)cây sau cùng là  màu xanh đậm(blue).Xem giá trị màu của bảng dưới đây:

Color         Html hexadecimal      GD Triple Representation

Black         #000000              (0,0,0)

White             #FFFFFF             (255,255,255)

Red         #FF0000              (255,0,0)

Yellow             #00FFFF              (0,255,255)

Purple              #FF00FF              (255,0,255)

chúng ta sẽ sử dụng funtion này trong những bài tới:

Tạo hình cơ bản và sử dụng font chữ để viết text.Cách sử dụng trực tiếp qua function này là dùng công cụ đồ họa.

Page 57: giáo trình PHP

Hòa màu ( Adding a color to the Palette)

Để hòa màu trong tệp ảnh, bạn cần biết xác định màu trong bảng sắc  màu (palette). Function

imagecolorallocate() sẽ phân phối màu một cách chính xác, rõ rệt vào trong bảng màu này.

Câu lệnh : int imagecolorallocate(resource image, int red, int green, int blue)

funtion imageallocate() dùng ba màu sắc (red, green, blue) để hòa màu cho ảnh nguồn, đồng thời ảnh nguồn này

phải do function imagecreate() hay funtion imagecreatefrom() tạo ra. Giá trị của màu red, green, blue phải là giá

trị của mã số (int) khoảng 0 và 255.Funtion này trả giá trị -1, nếu toàn vùng ảnh nguồn (allocation) không được

thực hiện đúng. Trong thực tế người ta sử dụng các biến có cùng màu tương tự cho vùng màu. Màu đầu tiên của

toàn vùng sẽ là màu của nền (background color).

Vd: $darkred = imagecolorallocate($myImage, 186, 0, 0);

Lấy màu từ ảnh nguồn (retrieving a color from an existing image)

Muốn lấy màu từ một điểm chính xác trong một tệp ảnh, ta cần phối hợp của nhiều functions.

Vd: int imagecolorat (resource image, int x, int y)

array imagecolorsforindex (resource image, int index)

funtion trả về một chỉ điểm (index) cho bảng màu(palette) ở một tụ điểm chính xác (x,y) trong tệp ảnh nguồn. Tuy

nhiên function sẽ không trả màu thật (màu hiện tại actual color). Bảng màu không chỉ là một dãy màu (array of

color).

Vd hình có 8bit thì màu sẽ được lưu trong một array hay một bảng bao gồm 256 màu. Funtion

imagecolorsforindex() trả lại một associative array cho giá trị của các màu red, green và blue.

Vd: $colorIndex = imagecolorat($myImage, $x, $y);

$colorArray = imagecolorsforindex($myImage, $colorIndex);

printf('Red: %d Green: %d Blue: %d', $colorArray['red'],

$colorArray['green'], $colorArray['blue']);

Lấy đúng màu ( getting the closest Match for a color)

Khi gặp phải bảng màu không thích hợp (confined palette), thỉnh thoảng ta nên dùng màu tương đối thích hợp

thay vì dùng một màu mới khác hoặc

bởi lúc phân phối màu cho tệp ảnh đã làm tăng độ nặng cho tệp ảnh này, hoặc nếu không còn chỗ chứa cho bảng

màu nữa. 

Vd: Int imagecolorclosest (resource image, int red, int green, int blue)

Imagecolorclosest()trả giá trị của màu kế tiếp đến bảng màu đồng thời ấn định rõ rệt 3 thể lọai màu RGB.

Xóa màu trong Palette ( Removing a color from the Palette)

Nên xóa bỏ các loại màu trong bàng nếu không cần đến chúng nữa. Function imagecolordeallocate() có chức năng

này.

Vd: int imagecolordeallocate (resource image, int color)

Function này có thể  làm dạng màu trong tệp ảnh trở lại như màu của index trong bảng màu để có thể sử dụng lại

như lúc ban đầu. Cách họat động của function  imagecolorallocate() là thay đổi màu trong mỗi pixel cho tương

ứng với index của palette màu.

Thay đổi màu ( Altering a Color)

Để thay đổi màu cho tệp ảnh, ta có thể thay đổi trụec tiếp qua bảng màu(palette)

vd: bool imagecolorset (resource image, int index, int red, int green, int blue)

Sự thay đổi màu trong palette được đặt tại điểm index của 3 màu RGB. Function này rất có lợi khi thay đổi màu ở

một khoàng lớn mà không cần tốn nhiều màu để đổ (flut fill)

Page 58: giáo trình PHP

Tổng kết số lượng màu đã dùng ( Couting How many Colors are used)

Để tổng kết số lượng màu trong một tệp ảnh ta cần đến function này :

int imagecolorstotal (resource image)

Funtion này trả cho ta một luợng màu trong palette ảnh.

Làm màu vô sắc ( Making a transparent Color)

Muốn tạo một vùng màu nhất định nào đó ta có thể sử dụng function này :

vd: int imagecolortransparent (resource image [, int index])

Funtion này lấy màu từ trong palette chính xác là index của bảng màu và chuyển đổi nó thành transparent. Vô

sắc màu này là thuộc tính của ảnh bảng (image palette) chứ không phải của pixel. Một khi màu đã được chuyển

đổi sang transparent thì trong tương lai tệp ảnh cũng sẽ có dạng transparent. Sử dụng màu khác biệt ví dụ như

màu tím (magenta) với màu xanh(green), lý do nó giúp ta phân biệt dễ dàng trong lúc thao tác. Nếu bạn muốn sử

dụng transparent, bạn nên đổi nó sang dạng được hổ trợ transparency ví dụ như :PNG , GIF. Thuộc tính

transparency sẽ bị hủy nếu bạn đổi nó thành dạng JPG.

Tạo hình căn bản (Creating primitive Shapes)

Giờ chúng ta đã có vùng màu trong tệp ảnh của chúng ta. Chúng ta có thể sử dụng màu để tạo hình trong tệp

ảnh. Thư viện GD có những funtion để vẽ đường thẳng (line) và hình tròn (circle) cũng như hình đa giác

(polygons). Chúng ta có thể dùng phồi hợp (coordinate system) chính xác một điểm, nơi tv GD tạo cho ta một

form hình. Chúng ta  có thể tạo hình từ khởi đầu hoặc chỉnh sửa một hình đã có sẳn.

Đường thẳng (Lines)

Đường thẳng là lọai hay được dùng nhầt trong đố họa hình.

Câu lệnh : int imageline (resource image, int x1, int y1, int x2, int y2, int col)

 Funtion này tạo một đường thẳng trong một cột vô nguồn hình từ điểm (x1,y1) tới (x2, y2). Để vẽ một đường

thăng đỏ đậm trên một tấm ảnh khoảng độ 200 x 200 từ bên trên tay trái xuống chéo phía dưới bên phải chúng ta

có thể dùng funtion sau: $ Bordeaux = imagecolorallocate ($ myImage, 186, 0, 0); imageline ($ myImage, 0, 0,

199, 199, $ bordeaux);

Hình chữ nhật (Rectangles)

Cách tạo cũng tương tự như trên, tạo một hình chữ nhật: Int imagerectangle (resource image, int x1, int y1, int x2,

int y2, int col) int imagefilledrectangle (resource image, int x1, int y1, int x2, int y2, int col)

funtion này kẻ tạo một hình vuông. Góc trái phía trên là điểm (x1,y1), góc phải bên dưới là điểm (x2,y2). Trong

trường hợp này (x2>x1) điểm này được tiềp tục kéo dãn về phía phải và (y2>y1) điểm này được tiếp tục kéo dãn

xuống dưới. Qua các thông tin của hình ta có thể nhận ra cách đọc của code nhằm tránh những lỗi có thể xẩy ra.

Hình Góc (Polygons)

Thư viện GD cho phép ta tạo ra nhiếu mẫu hình góc như hình tam giác và hình lục giác.

Câu lệnh:Int imagepolygon (resource image, array points, int num_points, int col) int imagefilledpolygon (resource

image, array points, int num_points, int col)

funtion này tạo một đường ngoài bao bọc sau đó tô thành một đồi tượng hình tương ứng. Nều bạn muồn tạo một

hình đa góc có nhiếu điểm. Đầu tiên Thư viện GD sẽ tạo đặt thành hình đa góc và kết nối chúng từ những đọan

thẳng từ điểm đầu tiên lần đến điểm cuồi cùng. Điểm số (Num_points) phải nhỏ hơn hoặc bằng đường thẳng đứng

của hình góc. Nếu điểm số (num_points) lớn hơn số của đường thẳng đứng, funtion sẽ thảy ra một lỗi, lý do

funtion không đủ thông tin để đáp ứng tạo một hình góc (polygons).

Nều num_points nhỏ hơn số của đường thẳng, hình góc sẽ giao trả lại cho đọan thẳng với num_points đó và điểm

đầu và cuối không đựơc kết hợp, đương nhiên sẽ không có kết quả cho việc tạo hình. Dãy array là trung gian

(vector) của điểm làm thay đổi giá trị giữa kết hợp của x và kết hợp của y. Để vẽ một tam giác chúng ta cần sử

dụng code sau: $darkgreen = imagecolorallocate($myImage, 0, 67, 0);

$myPoints = Array(10, 10, 10, 60, 60, 60);

imagepolygon($myImage, $myPoints, 3, $darkgreen);

Page 59: giáo trình PHP

Đọan code trên tạo nên một  (ellipse) ở các điểm (cx,cy) với cạnh ngang là w và cao là h. Php không có funtion để

tạo hinh tròn. Đê giải quyết vấn đề này nó cần một funtion đặt biệt. Nếu như chiều ngang bằng với chiều cao

ellipse sẽ biến thành một hình tròn. Kể tư vers php4.0.6 php đã cài đặt funtion này vào và cấn có thư viện GD

vers.2.0.1

Tạo hình võng (Arcs)

funtion arc được kế thừa từ funtion ellipse. Chúng có thể tạo một phần (partial) cho ellipse

câu lệnh:int imagearc (resource image, int cx, int cy, int w, int h, int s, int e, int col)

int imagefilledarc (resource image, int cx, int cy, int w, int h, int s, int e, int col, int style

Funtion này tạo một hình võng có tụ điểm ở (cx, cy) của chiều ngang và cao. Điểm khởi đầu và điểm cuối s, e là

đường biểu diễn tương ứng với điểm đầu và cuồi trong góc độ của hình võng.Góc độ zero tương ứng với vị trí 3 giờ

của đồng hố. Php vẽ hình võng theo chiều kim đồng hồ. Góc 90 độ sẽ là 6 giờ, 180 độ sẽ là 9 giờ v.v...funtion này

có trong php4.0.6 và cần thư viện GD 2.0.1.

funtion Imagefilledarc() có tham sồ cộng theo cách sau:

IMG_ARC_PIE – Produces a rounded edge and fills in the arc like that of a pie graph.

IMG_ARC_CHORD – Connects the starting and ending points with a straight line and fills in the resulting triangle.

IMG_ARC_NOFILL – Suspends the filling of the arc.

IMG_ARC_EDGED – Paints the edge of the arc. Used in conjunction with IMG_ARC_NOFILL to make an outlined pie

slice.

Tô màu (Fills)

Chúng ta có thể đổ màu cho một hình kỳ hoặt bằng kỷ thuật đổ màu ập (flood filling)

câu lệnh: int imagefill (resource image, int x, int y, int col)

int imagefilltoborder (resource image, int x, int y, int border, int col)

function này làm thay đổi màu của các pixel trong toàn diện vùng thành màu trong col. ImageFillToborder() chỉ tô

màu cho các cạnh (border).

Cách sử dụng một form hình đơn giản

Chúng ta đã biết sơ qua lý thuyêt cơ bản để làm việc với hình ảnh đơn giản. Hãy xem một ví dụ nhỏ về cách họat

động của function trong thực tế.

Code:

<?php

header('Content-Type: image/png');

//Tạo một ảnh nguồn có độ phân giãi 300 X 300 pixel:

$myImage = imagecreate(300, 300); 

//tạo màu trắng đen trong ảnh. Màu đen là màu nền. Nó đã được cài sẳn lúc đầu rồi.

$black = imagecolorallocate($myImage, 0, 0, 0);

$white = imagecolorallocate($myImage, 255, 255, 255);

//Cho màu trắng vào hình (rectangle) ở trung tâm của ảnh sẽ tạo ra một ảo ảnh đen của cạnh(bord

er).

imagefilledrectangle($myImage, 25, 25, 275, 275, $white);

//gạch chính giữa hình (ectangle) một đường thẳng từ trên xuống dưới. Ta biết đường thẳng sẽ là 

x1 = x2.

imageline($myImage, 150, 30, 150, 270, $black);

/*Cài một lọat điểm cho hình rectangle. Hình rectangle sẽ đậy toàn vùng qua các thông sô  (50,5

0), (50,100),(100,100). Nếu ta cho dãy số vào function imagepolygon() và cho chúng biết hình tr

iangle có 3 đường thẳng đứng.Chúng ta đã vẽ một hình chữ nhật có hình dáng tương tự như trước đ

Page 60: giáo trình PHP

ây.

*/

$myTriangle = array (50, 50, 50, 100, 100, 100);

imagepolygon($myImage, $myTriangle, 3, $black);

imagerectangle($myImage, 50, 150, 100, 250, $black);

/* Chúng ta sẽ tô hình, đường thẳng đứng kéo dãn hình ellipse. Chúng ta biết ellipse được kéo d

ãn thằng tuột do h>w. Trong ví dụ này chiều cao là 100 và chiều ngang là 50.

*/

imagefilledellipse($myImage, 225, 200, 50, 100, $black);

//Cuối cùng là vẽ hình Pac-Man-style ellipse với function imagefilledarc().

imagefilledarc($myImage, 225, 75, 50, 50, 45, 315, $black, IMG_ARC_PIE);

// cuối cùng chúng ta gởi hình đến trình duyệt và xóa bộ nhớ.

  imagepng($myImage);

  imagedestroy($myImage);

?>

cho script chạy chúng ta sê nhận được một hình vẽ như sau:

 Vẽ chữ ( Working with text)

Vẽ chữ là phần cuồi trong tutorial, chúng ta sẽ đào sâu hơn trong ứng dụng server-generate graphics. Chúng ta

cùng nhau thảo luận thêm từ các bài trên qua các ví dụ vừa rôi.

Vẽ chữ (adding text) là một trong những ứng dụng được xài nhiều nhầt trong server-generate graphics. Những

công việc như tạo buttons nhàm chán giống như công việc nhà được thực hiện một cách máy móc. Tạo nút tự

động có 2 điểm lợi: Thay đổi một lấn là có thể sử dụng khắp nơi và hình được lưu gữi ở một nơi cái rẩt lợi vế mặc

sử lý ít khi gặp lỗi.

Chún ta tập trung vào việc sử dụng font chữ TrueType và các thiềt kề những font chữ khác. Dạng trueType là

dạng chữ chuẩn ( standard- outline), khởi nguồn từ Appel Computer và sau này là Microsoft trong hệ windows 3.1.

font chữ của windows được cài đặt trong thư mục c:\windows \fonts hay c:\winnt\ fonts. Thường font chữ có đuôi

như sau: TTF. Bạn có thể vào đây để biết thêm chi tiết : www.freetype.org. Trong PHP  hệ windows nó được

compiler theo dạng freetype trong thư viện GD.

ô Text ( textfield)

Page 61: giáo trình PHP

Function trả cho ta một bounding vuông vức(box) bao bọc bởi chữ. Để tính toán độ lớn nhỏ của hình nền

(background) hay một vùng ta dùng function này để đặt chữ vào đó

câu lệnh: array imagettfbbox (int size, int angle, string fontfile, string text)

Nó bao gốm 4 tham sồ : cở chữ được kết tụ bởi các điểm, góc của text được tạo tại điểm ngang tương đối,

đường dẫn tuyệt đối đền font chữ và tạo text . Đường dẫn trong hệ unix phải hoàn tòan đầy đủ (full path), đối với

hệ windows tương đối dễ hơn có thê xài đường dẫn full hay relative tùy ý. Function này trả một dãy array có 8 giá

trị (values):

returnArray[0] – lower-left corner, X position

returnArray[1] – lower-left corner, Y position

returnArray[2] – lower-right corner, X position

returnArray[3] – lower-right corner, Y position

returnArray[4] – upper-right corner, X position

returnArray[5] – upper-right corner, Y position

returnArray[6] – upper-left corner, X position

returnArray[7] – upper-left corner, Y position

Tất cả vị trí của array này đều tương đối với góc lower-left. Giá trị dương nằm ở phía dưới bên phải. Ngược lại giă

trị âm nằm ở vị trí trên bên trái và thẳng lên từ điểm nguyên thủy (original). Nếu (x,y) nằm góc trái (lower-left), thì

(x+$returnArray[6], y+$returnArray[7]) nằm bên góc trên (upper-left).

Text

Để giao trả một text đến tệp ảnh trong bộ nhớ ta cần gọi function imagegettext()

array imagettftext (resource image, int size, int angle, int x, int y, int col, string

fontfile, string text)

Không giống như những function khác, Liên kết (x,y) trỏ xuống phía dưới bên trái (bottom left) hay điểm căn bản

của ký tự đầu tiên. Góc là góc độ từ 0 trỏ đến đường ngang của text và giá trị chiều cao diễn tả theo chiều kim

đồng hồ. Vd: góc 270 độ tạo một text từ trên xuống dưới. Tệp chữ là đường dẫn đến font chữ trueType mà bạn

cần đến. Text là chuỗi ký tự để tạo. Bạn cũng nên dùng utf-8 để diễn đạt đựợc nhiều ký tự có dạng như &#123;

chẳng hạn. Giá trị được trả cũng tương tự như của function imagettfbbox().

Cách sử dụng text

Xem ví dụ này để xem có liên quan dến nhau như thế nào imagettfbbox() và imagettftext().

Code:

<?php 

/* Trong các ví dụ trước , chúng ta đã sử dụng http header để chuyển gởi ảnh tới trình duyệt. 

Tiếp đến chúng ta tạo một source ảnh có kích thước 300x300 pixel và tạo hai màu trắng đen cho 

vùng ảnh.

*/

header('Content-Type: image/png');

$myImage = imagecreate(200, 200);

$black = imagecolorallocate($myImage, 0, 0, 0);

$white = imagecolorallocate($myImage, 255, 255, 255);

/* tính toán vùng ảnh và dùng imagettfbbox() để tạo chữ. 

Chú ý đường dẫn đến font chữ trong hệ thống của bạn.

*/

$boundingbox = imagettfbbox(25, 0, '/usr/local/fonts/arial.ttf', 'Hello Greg');

// dán text „ Hello phpvn“ vào. Sử dụng cở chữ (size) là 25 kiểu chữ arial.ttf, chữ trắng nằm 

ngang (ở góc độ =0), 

imagettftext($myImage, 25, 0, 10, 50, $white, 'arial.ttf', 'Hello phpvn');

Page 62: giáo trình PHP

/*Để vẽ một hình chữ nhật ta dùng function imagettfbbox(), function này tạo cho ta một boundin

g box. 

Imagerectangle() họat động kết hợp với upper-left và lower-rigth. Chúng ta có thể sử dụng arra

y để tính các điểm này.

*/

imagerectangle($myImage, 10+$boundingbox[6], 50+$boundingbox[7],

 10+$boundingbox[2], 50+$boundingbox[3], $white);

// lập lại 3 bước sau cho góc của text 

$boundingbox = imagettfbbox(25, 45, 'arial.ttf', 'Hello phpvn');

imagettftext($myImage, 25, 45, 30, 175, $white, 'arial.ttf', 'Hello phpvn');

imagerectangle($myImage, 30+$boundingbox[6], 175+$boundingbox[7],

30+$boundingbox[2], 175+$boundingbox[3], $white);

// run script và xóa bộ nhớ

  imagepng($myImage);

  imagedestroy($myImage);

?>Căn bản về JavaScript

« on: March 30, 2007, 11:41:54 PM »

[Trích từ Wikipedia]

JavaScript, theo phiên bản hiện hành, là một ngôn ngữ lập trình kịch bản dựa trên đối tượng được phát triển từ

các ý niệm nguyên mẫu. Ngôn ngữ này được dùng rộng rãi cho các trang web, nhưng cũng được dùng để tạo

khả năng viết script sử dụng các đối tượng nằm sẵn trong các ứng dụng. Nó vốn được phát triển bởi Brendan

Eich tại Hãng truyền thông Netscape với cái tên đầu tiên Mocha, rồi sau đó đổi tên thành LiveScript, và cuối

cùng thành JavaScript. Giống Java, JavaScript có cú pháp tương tự C, nhưng nó gần với Self hơn Java. .js là phần

mở rộng thường được dùng cho tập tin mã nguồn JavaScript.

Phiên bản mới nhất của JavaScript là phiên bản 1.5, tương ứng với ECMA-262 bản 3. ECMAScript là phiên bản

chuẩn hóa của JavaScript. Trình duyệt Mozilla phiên bản 1.8 beta 1 có hỗ trợ không đầy đủ cho E4X - phần mở

rộng cho JavaScript hỗ trợ làm việc với XML, được chuẩn hóa trong ECMA-357.

Java, JavaScript và JScript

Cùng thời điểm Netscape bắt đầu sử dụng công nghệ Java trên trình duyệt Netscape, LiveScript đã được đổi tên

thành JavaScript để được chú ý hơn bởi ngôn ngữ lập trình Java lúc đó đang được coi là một hiện tượng.

JavaScript được bổ sung vào trình duyệt Netscape bắt đầu từ phiên bản 2.0b3 của trình duyệt này vào tháng 12

năm 1995. Trên thực tế, hai ngôn ngữ lập trình Java và JavaScript không có liên quan gì đến nhau, ngoại trừ việc

cú pháp của cả hai ngôn ngữ cùng được phát triển dựa trên cú pháp của C. Java Script gồm 2 mảng là client-

server thực hiện lệnh trên máy của end-user và web-server.

Sau thành công của JavaScript, Microsoft bắt đầu phát triển JScript, một ngôn ngữ có cùng ứng dụng và tương

thích với JavaScript. JScript được bổ sung vào trình duyệt Internet Explorer bắt đầu từ Internet Explorer phiên

bản 3.0 được phát hành tháng 8 năm 1996.

DOM (Document Object Model), một khái niệm thường được nhắc đến với JavaScript trên thực tế không phải là

một phần của chuẩn ECMAScript, DOM là một chuẩn riêng biệt có liên quan chặt chẽ với XML.

Ứng dụng

JavaScript là một ngôn ngữ lập trình dựa trên nguyên mẫu với cú pháp phát triển từ C. Giống như C, JavaScript

Page 63: giáo trình PHP

có khái niệm từ khóa, do đó, JavaScript gần như không thể được mở rộng.

Cũng giống như C, JavaScript không có bộ xử lý xuất/nhập (input/output) riêng. Trong khi C sử dụng thư viện

xuất/nhập chuẩn, JavaScript dựa vào phần mềm ngôn ngữ được gắn vào để thực hiện xuất/nhập.

Trên trình duyệt, rất nhiều trang web sử dụng JavaScript để thiết kế trang web động và một số hiệu ứng hình

ảnh thông qua DOM. JavaScript được dùng để thực hiện một số tác vụ không thể thực hiện được với chỉ HTML

như kiểm tra thông tin nhập vào, tự động thay đổi hình ảnh,... Ở Việt Nam, JavaScript còn được ứng dụng để làm

bộ gõ tiếng Việt giống như bộ gõ hiện đang sử dụng trên trang Wikipedia tiếng Việt. Tuy nhiên, mỗi trình duyệt

áp dụng JavaScript khác nhau và không tuân theo chuẩn W3C DOM, do đó trong rất nhiều trường hợp lập trình

viên phải viết nhiều phiên bản của cùng một đoạn mã nguồn để có thể hoạt động trên nhiều trình duyệt. Một số

công nghệ nổi bật dòng JavaScript để tương tác với DOM bao gồm DHTML, Ajax và SPA.

Bên ngoài trình duyệt, JavaScript có thể được sử dụng trong tập tin PDF của Adobe Acrobat và Adobe Reader.

Điều khiển Dashboard trên hệ điều hành Mac OS X phiên bản 10.4 cũng có sử dụng JavaScript. Công nghệ kịch

bản linh động (active scripting) của Microsoft có hỗ trợ ngôn ngữ JScript làm một ngôn ngữ kịch bản dùng cho hệ

điều hành. JScript .NET là một ngôn ngữ tương thích với CLI gần giống JScript nhưng có thêm nhiều tính năng lập

trình hướng đối tượng.

Mỗi ứng dụng này đều cung cấp mô hình đối tượng riêng cho phép tương tác với môi trường chủ, với phần lõi là

ngôn ngữ lập trình JavaScript gần như giống nhau.

Các thành phần cú pháp chính

Khoảng trắng

Dấu cách, tab và ký tự dòng mới sử dụng bên ngoài một chuỗi ký tự được gọi là khoảng trắng. Khác với C, khoảng

trắng trong JavaScript có thể ảnh hưởng trực tiếp tới ý nghĩa của câu lệnh. Sử dụng phương pháp "tự động thêm

dấu chấm phẩy", bất cứ một dòng JavaScript nào thích hợp sẽ được coi là một câu lệnh hợp lệ (giống như có dấu

chấm phẩy trước ký tự dòng mới).

Tuy trong phần lớn trường hợp, dấu chấm phẩy trước khi kết thúc một dòng JavaScript là không cần thiết để đoạn

mã nguồn hoạt động chính xác, lập trình viên nên sử dụng dấu chấm phẩy sau mỗi câu lệnh để đoạn mã nguồn

dễ nhìn hơn. Ngoài ra, do đặc thù của JavaScript - chuyên dùng trên trang web, kích cỡ của đoạn mã nguồn là

quan trọng, có một số phần mềm có thể làm giảm kích cỡ của đoạn mã nguồn JavaScript bằng cách bỏ đi những

khoảng trắng không cần thiết, để những phần mềm này hoạt động chính xác, lập trình viên cần thêm dấu chấm

phẩy vào cuối mỗi câu lệnh.

Chú giải

Cú pháp chú giải của JavaScript giống với C++. Lập trình viên có thể chú giải trên nhiều dòng bằng cách bao bọc

chú giải với /* và */ hoặc sử dụng // để chú giải từ vị trí // đến hết dòng.

Biến

Trước khi sử dụng biến trong JavaScript, lập trình viên không nhất thiết phải khai báo biến. Có hai cách để định

nghĩa biến trong JavaScript. Một là sử dụng cú pháp var để khai báo biến:

Code:

<script language="JavaScript">

    var tên_biến;

</script>

Ngoài ra, lập trình viên có thể chỉ việc gán cho biến một gía trị để sử dụng biến đó. Biến được định nghĩa ngoài tất

Page 64: giáo trình PHP

cả các hàm hoặc được sử dụng mà không khai báo với cú pháp var sẽ được coi là biến toàn cục, những biến này

có thể sử dụng trên toàn trang web. Biến được khai báo với var bên trong một hàm là biến cục bộ của hàm đó và

chỉ có thể sử dụng được bên trong hàm đó.

Đối tượng

Kiểu của JavaScript được chia ra làm hai loại: kiểu cơ bản và đối tượng. Đối tượng trong JavaScript là một thực thể

có tên xác định và có thuộc tính trỏ đến giá trị, hàm hoặc cũng có thể là một đối tượng khác. Có nghĩa là, đối

tượng trong JavaScript là một mảng kết hợp (associative array) tương tự như mảng trong PHP hay từ điển trong

Python, PostScript hoặc Smalltalk.

JavaScript có một số đối tượng định nghĩa sẵn, bao gồm mảng (Array), đối tượng đại số Bool (Boolean), đối tượng

ngày tháng (Date), đối tượng hàm (Function), đối tượng toán học (Math), đối tượng số (Number), đối tượng đối

tượng (Object), đối tượng biểu thức tìm kiếm (RegExp) và đối tượng chuỗi ký tự (String). Các đối tượng khác là đối

tượng thuộc phần mềm chủ (phần mềm áp dụng JavaScript - thường là trình duyệt).

Bằng cách định nghĩa hàm khởi tạo, lập trình viên có thể tạo đối tượng. JavaScript là một ngôn ngữ lập trình dựa

trên nguyên mẫu do đó thừa kế diễn ra giữa các đối tượng, không phải giữa các lớp (JavaScript không hề có lớp).

Đối tượng thừa kế thuộc tính từ các nguyên mẫu của chúng.

Lập trình viên có thể thêm hoặc xóa thuộc tính hoặc hàm trong đối tượng sau khi đối tượng đã được tạo. Để làm

việc này cho tất cả các đối tượng được tạo từ cùng một hàm khởi tạo, lập trình viên có thể sử dụng thuộc tính

prototype của hàm khởi tạo để truy cập đối tượng nguyên mẫu. Lập trình viên không nhất thiết phải tự xóa các

đối tượng đã tạo, JavaScript tự động gom rác tất cả những biến không còn được dùng nữa.

Ví dụ:

Code:

<script language="JavaScript">

    function samplePrototype() {

        this.attribute1 = "someValue"; // thêm một thuộc tính cho đối tượng

        this.attribute2 = 234; // thêm thuộc tính nữa cho đối tượng

        this.function1 = testFunction; // thêm một hàm vào đối tượng

    }

    function testFunction() {

        alert(this.attribute2); //hiển thị 234

    }

    var sampleObject = new samplePrototype; // khởi tạo một đối tượng

    sampleObject.function1(); // gọi hàm function1 của đối tượng sampleObject

    sampleObject.attribute3 = 123; // thêm một thuộc tính nữa cho đối tượng sampleObject

    delete sampleObject.attribute1; // xóa bỏ 1 thuộc tính

    delete sampleObject; // xóa bỏ đối tượng

</script>

Cấu trúc dữ liệu

Một cấu trúc dữ liệu tiêu điểm là mảng (Array), mảng trong JavaScript là một bảng liên kết chỉ mục đến giá trị.

Trong JavaScript, tất cả các đối tượng đều có thể liên kết chỉ mục đến giá trị, nhưng mảng là một đối tượng đặc

biệt có thêm nhiều tính năng xử lý chỉ mục và dữ liệu đặc biệt (ví dụ: push, join, v.v.)

Page 65: giáo trình PHP

Mảng trong JavaScript có thuộc tính length. Thuộc tính length của JavaScript luôn luôn lớn hơn số chỉ mục lớn nhất

trong mảng một đơn vị. Trong phần lớn ngôn ngữ lập trình, những thuộc tính có tính năng như length thường là

thuộc tính chỉ đọc, tuy nhiên, với JavaScript, lập trình viên có thể thay đổi thuộc tính length. Bằng cách thay đổi

thuộc tính length, lập trình viên có thể làm mảng lớn hơn hoặc nhỏ hơn (và xóa đi những chỉ mục lớn hơn hoặc

bằng thuộc tính length mới).

Mảng trong JavaScript là mảng rải rác, có nghĩa là cho dù lập trình viên có một mảng như sau:

Code:

<script language="JavaScript">

    var test = new Array();

    test[2] = 0;

    test[100] = 5;

</script>

Trong trường hợp này, dù mảng có đến chỉ mục mang số 100 thì mảng cũng chỉ chiếm bộ nhớ của hai số 0 và 5.

Tuy nhiên, thuộc tính length sẽ có giá trị 101 do chỉ mục lớn nhất của mảng trong ví dụ trên là 100.

Một số ví dụ về mảng:

Code:

<script language="JavaScript">

    var test = new Array(10); // Tạo một mảng 10 chỉ mục

    var test2 = new Array(0,1,2,,3); // Tạo một mảng với bốn giá trị và 5 chỉ mục

    var test3 = new Array();

    test3["1"] = 123; // Hoàn toàn đúng cú pháp

</script>

Lập trình viên cũng có thể định nghĩa cấu trúc bằng đối tượng như sau:

Code:

<script language="JavaScript">

    var myStructure = {

        name: {

            first: "Mel",

            last: "Smith"

        },

        age: 33,

        hobbies: [ "chess", "jogging" ]

    };

</script>

Cú pháp định nghĩa cấu trúc bằng đối tượng trên có một chuẩn trên danh nghĩa là JSON.

Cấu trúc điều khiển

Rẽ nhánh theo điều kiện với if ... else

Cú pháp if ... else dùng trong trường hợp muốn rẽ nhánh theo điều kiện. Cú pháp này tương đương với nếu x thì

làm y, còn nếu không thì làm z. Các câu lệnh if ... else có thể lồng trong nhau.

Cú pháp:

<script language="JavaScript">

Page 66: giáo trình PHP

    if (biểu_thức_1)

    {

        khối lệnh được thực hiện nếu biểu thức 1 đúng;

    }

    else if (biểu_thức_2)

    {

        khối lệnh được thực hiện nếu biểu thức 2 đúng;

    }

    else

    {

        khối lệnh được thực hiện nếu cả hai biểu thức trên đều không đúng;

    }

</script>

Ví dụ:

Code:

<script language="JavaScript">

    var x = prompt("Nhập vào giá trị của x:");

    x = parseFloat(x);

    if (!isNaN(x)) {

        if (x > 0)

        {

            alert("x > 0");

        }

        else if (x == 0)

        {

            alert("x = 0");

        }

        else

        {

            alert("x < 0");

        }

    }

    else

    {

        alert("giá trị bạn nhập không phải là một số");

    }

</script>

Đoạn mã nguồn trên mở một hộp thoại yêu cầu nhập vào một giá trị số, sau đó hiển thị thông báo số đó lớn hơn

0, bằng 0 hay nhỏ hơn 0.

Code:

Toán tử điều kiện

Toán từ điều kiện còn được biết đến với tên gọi toán tử tam phân. Cú pháp của toán tử này như sau:

<script language="JavaScript">

    điều_kiện ? biểu_thức_đúng : biểu_thức_sai;

</script>

Page 67: giáo trình PHP

Toán tử này sẽ trả lại giá trị là kết quả của biểu_thức_đúng nếu điều_kiện có giá trị bool bằng true, ngược lại nó sẽ

trả lại giá trị bằng biểu_thức_sai.

Vòng lặp while

Vòng lặp while có mục đích lặp đi lặp lại một khối lệnh nhất định cho đến khi biểu thức điều kiện trả về false. Khi

dùng vòng lặp while phải chú ý tạo lối thoát cho vòng lặp (làm cho biểu thức điều kiện có giá trị false), nếu không

đoạn mã nguồn sẽ rơi vào vòng lặp vô hạn, là một lỗi lập trình. Vòng lặp while thường được dùng khi lập trình viên

không biết chính xác cần lặp bao nhiêu lần. Cú pháp của vòng lặp while như sau:

Code:

<script language="JavaScript">

    while (biểu_thức_điều_kiện) {

        khối lệnh cần thực hiện nếu biểu_thức_điều_kiện trả về true;

    }

</script>

Vòng lặp do ... while

Về cơ bản, vòng lặp do ... while gần như giống hệt như vòng lặp while. Tuy nhiên, trong trường hợp biểu thức điều

kiện trả về false ngay từ đầu, khối lệnh trong vòng lặp while sẽ không bao giờ được thực hiện, trong khi đó, vòng

lặp do ... while luôn đảm bảo khối lệnh trong vòng lặp được thực hiện ít nhất một lần. Ví dụ:

Code:

<script language="JavaScript">

    while (0 > 1)

    {

        alert("while"); // Câu lệnh này sẽ không bao giờ được thực hiện

    }

    do

    {

        alert("do ... while"); // Bạn sẽ nhận được thông báo do ... while một lần duy nhất

    } while (0 > 1);

</script>

Cú pháp của vòng lặp do ... while như sau:

Code:

<script language="JavaScript">

    do

    {

        khối lệnh;

    } while (biểu_thức_điều_kiện);

</script>

Vòng lặp for

Vòng lặp for thường được sử dụng khi cần lặp một khối lệnh mà lập trình viên biết trước sẽ cần lặp bao nhiêu lần.

Cú pháp của vòng lặp for như sau:

Code:

<script language="JavaScript">

    for (biểu_thức_khởi_tạo; biểu_thức_điều_kiện; biểu_thức_thay_đổi_giá_trị)

Page 68: giáo trình PHP

    {

        Khối lệnh cần lặp;

    }

</script>

Khi bắt đầu vòng lặp for, lập trình viên cần khởi tạo một biến nhất định bằng biểu_thức_khởi_tạo để dùng trong

biểu_thức_điều_kiện, nếu biểu_thức_điều_kiện trả về true, khối lệnh cần lặp sẽ được thực hiện, sau khi thực hiện

xong khối lệnh cần lặp, biểu_thức_thay_đổi_giá_trị sẽ được thực hiện, tiếp theo, biểu_thức_điều_kiện sẽ lại được

kiểm tra, cứ như vậy cho đến khi biểu_thức_điều_kiện trả về false, khi đó vòng lặp sẽ kết thúc.

Vòng lặp for ... in

Vòng lặp for ... in dùng để lặp qua tất cả các thuộc tính của một đối tượng (hay lặp qua tất cả các phần tử của một

mảng). Cú pháp của vòng lặp này như sau:

Code:

<script language="JavaScript">

    for (biến in đối_tượng)

    {

        khối lệnh cần thực hiện, có thể sử dụng đối_tượng[biến] để truy cập từng thuộc tính

(phần tử) của đối tượng;

    }

</script>

Cú pháp switch

Cú pháp switch cũng là cú pháp điều kiện như if ... else hay toán tử tam phân. Tuy nhiên, cú pháp switch thường

được dùng khi chỉ cần so sánh bằng với số lượng kết quả cần kiểm tra lớn. Cách sử dụng cú pháp switch:

Code:

<script language="JavaScript">

    switch (biểu_thức_điều_kiện)

    {

        case kết_quả_1 :

            khối lệnh cần thực hiện néu biểu_thức_điều_kiện bằng kết_quả_1;

            break;

        case kết_quả_2 :

            khối lệnh cần thực hiện néu biểu_thức_điều_kiện bằng kết_quả_2;

            break;

        default :

            khối lệnh cần thực hiện nếu biểu_thức_điều_kiện cho ra một kết quả khác;

    }

</script>

Sau mỗi khối lệnh trong một mục kiểm tra kết quả (trừ mục default), lập trình viên cần phải thêm vào break.Re: Căn bản về JavaScript « Reply #3 on: March 30, 2007, 11:52:08 PM »

Hàm

Hàm là một khối các câu lệnh với một danh sách một hoặc nhiều đối số (có thể không có đối số) và thường có tên

(mặc dù trong JavaScript hàm không nhất thiết phải có tên). Hàm có thể trả lại một giá trị. Cú pháp của hàm như

sau:Code:

Page 69: giáo trình PHP

<script language="JavaScript">

    function tên_hàm(đối_số_1, đối_số_2)

    {

        các câu lệnh cần thực hiện mỗi khi hàm được gọi;

        return giá_trị_cần_trả_về;

    }

    tên_hàm(1, 2); // Gọi hàm tên_hàm với hai đối số 1 và 2 ứng với đối_số_1 và đối_số_2

    tên_hàm(1); // Gọi hàm tên_hàm với đối_số_1 có giá trị 1, đối_số_2 có giá trị undefined

</script>

Trong JavaScript, khi gọi hàm không nhất thiết phải gọi hàm với cùng số đối số như khi định nghĩa hàm, nếu số đối

số ít hơn khi định nghĩa hàm, những đối số không được chuyển cho hàm sẽ mang giá trị undefined.

Các kiểu cơ bản sẽ được chuyển vào hàm theo giá trị, đối tượng sẽ được chuyển vào hàm theo tham chiếu.

Hàm là đối tượng hạng nhất trong JavaScript. Tất cả các hàm là đối tượng của nguyên mẫu Function. Hàm có thể

được tạo và dùng trong phép toán gán như bất kỳ một đối tượng nào khác, và cũng có thể được dùng làm đối số

cho các hàm khác. Do đó, JavaScript hỗ trợ hàm cấp độ cao. Ví dụ:

Code:

<script language="JavaScript">

    Array.prototype.fold =

    function (value, functor) {

        var result = value;

        for (var i = 0; i < this.length; i++) {

            result = functor(result, this[i]);

        }

        return result;

    }

    var sum = [1,2,3,4,5,6,7,8,9,10].fold(0, function (a, b) { return a + b })

</script>

Đoạn mã nguồn trên sẽ trả lại kết quả là 55.

Vì hàm trong JavaScript là đối tượng, lập trình viên có thể khởi tạo hàm không tên:

Code:

<script language="JavaScript">

    function() { thân hàm; }

</script>

Một ví dụ sử dụng hàm không tên trong JavaScript:

Code:

<script language="JavaScript">

    document.onkeypress = function(e) {

        alert("Bạn vừa nhấn một phím trên bàn phím");

    }

</script>

Hàm trên sẽ hiển thị thông báo khi một số phím trên bàn phím có thể gây sự kiện onkeypress được nhấn.

Page 70: giáo trình PHP

Mặc định, tất cả các thành phần của đối tượng thuộc phạm vi công cộng (public). Trong JavaScript, không có

khái niệm thành phần riêng hay thành phần được bảo vệ (private và protected), tuy nhiên những tính năng này

có thể được giả lập.

Quản lý lỗi

Tùy theo môi trường phát triển, sửa lỗi JavaScript có thể sẽ rất khó khăn. Với JavaScript dùng trên trang web,

hiện tại, các trình duyệt dựa trên Gecko (như Mozilla, Mozilla Firefox) có công cụ tìm diệt lỗi rất tốt (Venkman),

ngoài ra còn kèm theo một công cụ kiểm tra DOM.

Các phiên bản mới hơn của JavaScript (như bản dùng trên Internet Explorer 5 và Netscape 6) hỗ trợ mệnh đề

quản lý lỗi try ... catch ... finally, mệnh đề này bắt nguồn từ Java giúp lập trình viên quản lý lỗi thời gian chạy

hoặc quản lý ngoại lệ xuất phát từ cú pháp throw. Cú pháp của mệnh đề này như sau:

<script language="JavaScript">

    try

    {

        Khối lệnh cần thực hiện có thể gây lỗi;

    }

    catch (error)

    {

        Khối lệnh cần thực hiện trong trường hợp có lỗi;

    }

    finally

    {

        Khối lệnh luôn được thực hiện;

    }

</script>

Trong cú pháp trên error là một đối tượng Error có hai thuộc tính theo chuẩn ECMAScript phiên bản 3:

    * error["message"]: Thông điệp diễn giải lỗi

    * error["name"]: Tên lỗi

Tuy nhiên mỗi trình duyệt sử dụng một bản JavaScript khác nhau, trong các trình duyệt lớn và phổ dụng không

có trình duyệt nào hoàn toàn tuân thủ theo chuẩn ECMAScript phien bản 3. Ví dụ như Internet Explorer 6 SP 1 có

thêm hai thuộc tính:

    * error["number"]: Bí số của lỗi

    * error["description"]: Thông điệp diễn giải lỗi

Còn Mozilla Firefox 1.07 có thêm ba thuộc tính:

    * error["fileName"]: Tên tập tin xảy ra lỗi

    * error["lineNumber"]: Dòng xảy ra lỗi

    * error["stack"]: Cả hai thuộc tính trên gộp lại trong một chuỗi ký tự

Phần finally là không bắt buộc. Lập trình viên hoàn toàn có thể sử dụng try ... catch mà không có finally.

Phạm vi ảnh hưởng của lỗi

Các ngôn ngữ lập trình kịch bản rất dễ bị ảnh hưởng bởi lỗi, hơn nữa, mỗi một trình duyệt, mỗi một công ty ứng

dụng JavaScript một cách hoàn toàn khác nhau nên lập trình viên JavaScript thường phải dành rất nhiều thời

Page 71: giáo trình PHP

gian sửa lỗi để đảm bảo đoạn mã nguồn của mình sẽ hoạt động tốt. Trong những trang HTML mà thẻ script và

các đoạn mã HTML khác xen kẽ lẫn nhau, lỗi cú pháp có thể được phát hiện dễ dàng hơn bằng cách để mỗi hàm

trong một thẻ script riêng biệt hoặc có thể sử dụng nhiều tệp .js khác nhau. Trong nhiều trường hợp, cách này

còn giúp tránh làm hỏng cả trang web trong trường hợp có lỗi trong một đoạn mã nguồn.Tạo một MVC framework làm nền tảng cho một ứng dụng PHP

« on: January 06, 2008, 01:21:18 AM »

Như đã viết trong bài roadmap from newbie to professional, hôm nay 5s bắt đầu series về xây dựng một MVC

framework cho ứng dụng web bằng PHP. Trong bài viết này, 5s sẽ walk through nhiều concept quan trọng của một

ứng dụng để tạo nên một MVC framework thực sự hữu dụng cho các bạn mới bắt đầu.

Có được kíên thức MVC cơ bản, các bạn sẽ thấy thoải mái khi sử dụng những framework "pro" như Zend hay

Symfony, CakePHP,... MVC cơ bản này cũng sẽ giúp bạn nếu đam mê xây dựng application architect phát triển bổ

sung vào nó những công cụ hữu ích khác nếu muốn, tạo nên một framework hoàn chỉnh có thể dùng trong công

việc hàng ngày mà ở đó bạn có thể kiểm soát hoàn toàn các đoạn code của mình.

MVC này cũng sẽ hữu ích cho các bạn SV vì cứ coi như nó là cây nhà lá vườn, no name, no author để sử dụng thoải

mái trong bài tập hay dự án thực hành. Sẽ không bị các thầy cô đánh giá là "đạo" các đồ chơi hầm hố của tây tàu

về dùng  .

Trước hết, MVC là mô hình gồm 3 thành phần:

Model: Truy vấn dữ liệu

View: Hiển thị dữ liệu và nhập liệu

Controller: Xử lý nghiệp vụ

Như vậy, MVC là mô hình gắn liền với mô hình ứng dụng 3 lớp mà chúng ta đã quen thuộc.

Xử lý tập trung

Xét với 1 ứng dụng web, do bản chất của nó là giao tiếp giữa client (web browser của người dùng) và server (web

server) quan các lời gọi Request và trả lời Response, một ứng dụng web có thể cho user truy cập nhiều trang web

khác nhau như index.php, user.php, view_product.php,... Việc này dẫn đến nhiều khó khăn khi hệ thống có những

biến chia sẻ chung như setting, database access,... Thường thì chúng ta sẽ phải viết code như sau:

Code:

<?php

include ('global.php'); //Các biến dùng chung

// Các xử lý code khác

?>

Mô hình MVC sẽ thay đổi việc này bằng cách tập trung tất cả các request của user về một trang duy nhất:

index.php sau đó sẽ xử lý bằng cách phân tích request và gọi đúng trang php cần thiết để xử lý. Việc tập trung

này sẽ giúp các bạn tiến hành các bước kết nối DB, logging, error handling,... hết sức hiệu quả sau này. Tuy nhiên,

trong serie này 5s không thể đề cập hết các chi tiết đó.

Trước tiên, ta sẽ tạo một file .htaccess để thực hiện rewrite URL, thay đổi request về file index.php sẽ có tham số

route trong query string như sau:

file .htacess ngang cấp với index.phpCode:

Page 72: giáo trình PHP

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f

RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^(.*)$ index.php?route=$1 [L,QSA]

Chú ý, nếu bạn chưa load module mod_rewrite của Apache, phải vào httpd.conf để sửa đổi cấu hình và restart

Apache.

Ở đây, route là tham số dùng để thay đổi cách gọi request của user, nó giúp file index.php phân tích nội dung

request để chuyển tới file php khác thực hiện xử lý thích hợp.

Cũng giống như thông tin cấu hình ở ví dụ trên, chúng ta sẽ làm vài việc gọi là initialize ứng dụng web của mình:

File index.phpCode:

require 'includes/init.php';

File includes/init.phpCode:

<?php

error_reporting (E_ALL); //Thông báo tất cả các lỗi

if (version_compare(phpversion(), '5.1.0', '<') == true) { die ('PHP5.1 Only'); } //Framework c

ủa chúng ta làm việc trên PHP5

// Constants:

define ('DIRSEP', DIRECTORY_SEPARATOR); //Tương thích với môi trường Win hay Unix, ta tìm dúng 

dấu phân cách dir là  \ hay /

// Get site path

$site_path = realpath(dirname(__FILE__) . DIRSEP . '..' . DIRSEP) . DIRSEP;

define ('site_path', $site_path);

Tiếp theo, tạo một biến registry để chứa các biến toàn cục trong ứng dụng. Sau này ta sẽ lưu vào đây các biến

DB, Logger, Cache, Template,...

Code:

$registry = new Registry;

Vì chúng ta sẽ rất lười nhác phải viếc các hàm include file và vấn đề đang gặp phải là sẽ phải tạo file Registry.php

(chú ý case sensitve nhé) cho class Registry ta đang dùng ở trên nên ta sẽ viết một hàm __autoload() cho PHP5 để

nó tự load các file php ứng với class ta cần dùng:

Code:

function __autoload($class_name) {

        $filename = strtolower($class_name) . '.php';

        $file = site_path . 'classes' . DIRSEP . $filename;

        if (file_exists($file) == false) {

                return false;

        }

Page 73: giáo trình PHP

        include ($file);

}

Hàm này PHP5 tự động sẽ gọi khi không tìm thấy class cần dùng trong hệ thống, chúng ta cứ viết và để đó -

không cần quan tâm gì thêm. Một điều 5s muốn các bạn chú ý là trong một framework, cách đặt tên các file,

class, variable,... là rất quan trọng và ảnh hưởng tới cơ chế xây dựng framework, do đó, hãy đế ý tới tên họ các

biến, class cho cẩn thận, nhất là chữ hoa/thường vì sau này upload lên host Linux sẽ gặp nhiều vấn đề.

Tạo class Registry

Chúng ta sẽ dùng object của Registry để pass dữ liệu lòng vòng trong ứng dụng tương tự như việc dùng

Application['abc'] của ASP hay biến $GLOBALS của PHP.Code:

<?php

Class Registry {

        private $vars = array();

function set($key, $var) {

        if (isset($this->vars[$key]) == true) {

                throw new Exception('Unable to set var `' . $key . '`. Already set.');

        }

        $this->vars[$key] = $var;

        return true;

}

function get($key) {

        if (isset($this->vars[$key]) == false) {

                return null;

        }

        return $this->vars[$key];

}

function remove($var) {

        unset($this->vars[$key]);

}

}

?>

Chúng ta vừa tạo một Dictionary class. Ý nghĩa của một từ điển là cứ cho tôi một từ khoá (key) tôi sẽ cho ý nghĩa

của nó (value). Value-key pair cũng là khái niệm hay dùng nên bạn cũng nên nắm bắt luôn ở đây.

Ví dụ sử dụng Registry:Code:

<?php

$registry = new Registry;

// Set some data

Page 74: giáo trình PHP

$registry->set ('name', 'hung 5s');

// Get data, using get()

echo $registry->get ('name');

// Get data, using array access

echo $registry['name']

?>

Do tôi cũng lười typing và muốn nhấn mạnh một chút về OOP, ta sẽ implement một interface để biến đối tượng

$registry mới tạo thành một array của PHP cho dễ dùng hơn.

Đầu tiên sửa lại class Registry:Code:

class Registry Implements ArrayAccess {

Sau đó implement 4 method của interface ArrayAccess như sau:

Code:

function offsetExists($offset) {

        return isset($this->vars[$offset]);

}

function offsetGet($offset) {

        return $this->get($offset);

}

function offsetSet($offset, $value) {

        $this->set($offset, $value);

}

function offsetUnset($offset) {

        unset($this->vars[$offset]);

}

Bây giờ bạn có thể viết $registry['name'] = 'abc' thay vì $registry->set('name', 'abc'); khoái chí không nào. Nếu

bạn muốn ứng dụng cái này ở class nào đó cho riêng mình để có thêm vòng lặp foreach chẳng hạn thì bạn thử

implement thêm interface Iterator nữa nhé. Bạn hãy tham khảo Standard PHP Lib document ở đây

http://www.php.net/~helly/php/ext/spl/

Sử dụng Smarty Template

« on: August 24, 2007, 02:39:39 AM »

Sử dụng Smarty Template.

download ->http:smarty.net.

Install coi chỉ dẫn trong file Quick install.

Tất nhiên bạn phải có sẳn local server trong pc. Smarty Folder có thể cài đặt trong htdocs ( nếu bạn xài program

của xampp)

Page 75: giáo trình PHP

- Smarty config:

kết nạp Smarty ClassCode:

  <?php

define('SMARTY_DIR', '/Path/to/Smarty/');

require_once(SMARTY_DIR. 'Smarty.class.php');

?>

Tạo lớp:Code:

<?php

$smarty = new Smarty();

?>

Tạo thêm các hàm sau:Code:

<?php

$smarty->compile_check = true // kiểm tra xem template đã có thay đổi gì không, nếu có, nạp dữ 

liệu mới

$smarty->caching = true // bật hàm caching

?>

Ta cần 4 folders :

- templates ( Chứa đựng các Templates, trong hộp này ta cũng có thể tào thêm các hộp con (subfolder)

- templte_c ( Chứa các templates được Smarty compiled)

- configs  (Cho các tệp tin configs)

-cache ( cho các templates Cache) // chỉ là option thôi khong có không sao

Smarty luôn tìm nhũng hộp (folder) này khi php hoạt động. Ta có thể định đường dẫn như thế này:Code:

<?php

$smarty->template_dir   = '/path/to/Template_Folder/';

$smarty->compile_dir    = '/path/to/Template_c_Folder/';

$smarty->config_dir     = '/path/to/Config_Folder/';

$smarty->cache_dir      = '/path/to/Cache_folder/';

?>

1) Đưa một giá trị (value) đến Smarty Class.Code:

<?php

// Array, có thể lấy từ Database

$array = array(

                0 => array( 'id' => 1, 

                            'text' => 'test'),

                1 => array( 'id' => 2,

                            'text' => 'foobar' ),

                2 => array( 'id' => 3,

                            'text' => 'another test'

                            ));

$test   = 'string';

$test2  = 2;

$smarty->assign('test_array',   $array);

$smarty->assign('test',         $test);

Page 76: giáo trình PHP

$smarty->assign('test2',        $test2);

?>

2) Tích hợp Template.tplCode:

<body><table><tr>

Variable test : {$test}

Variable test2 : {$test2}

{foreach from=$test_array item=arr}

    Item ID : {$arr.id}

    Text From : {$arr.text}

{/foreach}

</tr></table></body>

Template sẽ hiển thị 2 thông số Test & Test2 như đã định trong têp .php , kế tiếp lệnh foreach sẽ được kích

họat.Trong loop này bao gồm 2 Params có trị số from và item .from là thuộc tinh array và item là tên biến được

trả về với biến {$arr.id} tương tự như value của 1 array : $arr['id'].

 Thử test xem template có work không nha. vd:tên tệp của template là test.tplCode:

<?php

$smarty->display('test.tpl'); 

?>

Nếu trình duyệt xuất ra dòng Text thì bạn đã thành công. Smarty còn nhiều function khác nữa.Đây chỉ là một gợi ý

nhỏ cho việc sự dụng Smarty Template.

test_file.php:Code:

<?php

define('SMARTY_DIR', '/xampp/htdocs/smarty/libs/');

require_once(SMARTY_DIR. 'Smarty.class.php');

$smarty = new Smarty;

$smarty->compile_check = true;

$smarty->debugging = true;

//$smarty->caching = true // bật hàm caching

$array = array(

                0 => array( 'id' => 1, 

                            'text' => 'test'),

                1 => array( 'id' => 2,

                            'text' => 'foobar' ),

                2 => array( 'id' => 3,

                            'text' => 'another test'

                            ));

$test   = 'string';

$test2  = 2;

$smarty->assign('test_array',   $array);

$smarty->assign('test',         $test);

$smarty->assign('test2',        $test2);

Page 77: giáo trình PHP

$smarty->display('test.tpl'); 

?>

test.tplCode:

<body><table><tr>

Variable test : {$test}

Variable test2 : {$test2}

{foreach from=$test_array item=arr}

    Item ID : {$arr.id}

    Text From : {$arr.text}

{/foreach}

</tr></table></body>

test.conf (trong config folder)Code:

title = Welcome to Smarty!

cutoff_size = 40

[setup]

bold = trueDịch vụ Web (Web service) « on: October 06, 2007, 04:52:00 AM »Dịch vụ Web (Web Service) được coi là một công nghệ mang đến cuộc cách mạng trong cách thức hoạt động của các dịch vụ B2B (Business to Business) và B2C (Business to Customer). Giá trị cơ bản của dịch vụ Web dựa trên việc cung cấp các phương thức theo chuẩn trong việc truy nhập đối với hệ thống đóng gói và hệ thống kế thừa. Các phần mềm được viết bởi những ngôn ngữ lập trình khác nhau và chạy trên những nền tảng khác nhau có thể sử dụng dịch vụ Web để chuyển đổi dữ liệu thông qua mạng Internet theo cách giao tiếp tương tự bên trong một máy tính. Tuy nhiên, công nghệ xây dựng dịch vụ Web không nhất thiết phải là các công nghệ mới, nó có thể kết hợp với các công nghệ đã có như XML, SOAP, WSDL, UDDI… Với sự phát triển và lớn mạnh của Internet, dịch vụ Web thật sự là một công nghệ đáng được quan tâm để giảm chi phí và độ phức tạp trong tích hợp và phát triển hệ thống. Chúng ta sẽ xem xét các dịch vụ Web từ mức khái niệm đến cách thức xây dựng.

1. Giới thiệu công nghệ

Theo định nghĩa của W3C (World Wide Web Consortium), dịch vụ Web là một hệ thống phần mềm được thiết kế để hỗ trợ khả năng tương tác giữa các ứng dụng trên các máy tính khác nhau thông qua mạng Internet, giao diện

Page 78: giáo trình PHP

chung và sự gắn kết của nó được mô tả bằng XML. Dịch vụ Web là tài nguyên phần mềm có thể xác định bằng địa chỉ URL, thực hiện các chức năng và đưa ra các thông tin người dùng yêu cầu. Một dịch vụ Web được tạo nên bằng cách lấy các chức năng và đóng gói chúng sao cho các ứng dụng khác dễ dàng nhìn thấy và có thể truy cập đến những dịch vụ mà nó thực hiện, đồng thời có thể yêu cầu thông tin từ dịch vụ Web khác. Nó bao gồm các mô đun độc lập cho hoạt động của khách hàng và doanh nghiệp và bản thân nó được thực thi trên server.

Trước hết, có thể nói rằng ứng dụng cơ bản của Dịch vụ Web là tích hợp các hệ thống và là một trong những hoạt động chính khi phát triển hệ thống. Trong hệ thống này, các ứng dụng cần được tích hợp với cơ sở dữ liệu (CSDL) và các ứng dụng khác, người sử dụng sẽ giao tiếp với CSDL để tiến hành phân tích và lấy dữ liệu. Trong thời gian gần đây, việc phát triển mạnh mẽ của thương mại điện tử và B2B cũng đòi hỏi các hệ thống phải có khả năng tích hợp với CSDL của các đối tác kinh doanh (nghĩa là tương tác với hệ thống bên ngoài - bên cạnh tương tác với các thành phần bên trong của hệ thống trong doanh nghiệp).

Dưới đây, chúng ta sẽ xem qua những khái niệm và cách thức cơ bản nhất để xây dựng một dịch vụ Web trong tích hợp và phát triển hệ thống.

2. Đặc điểm của Dịch vụ Web

   a) Đặc điểm

- Dịch vụ Web cho phép client và server tương tác được với nhau ngay cả trong những môi trường khác nhau. Ví dụ, đặt Web server cho ứng dụng trên một máy chủ chạy hệ điều hành Linux trong khi người dùng sử dụng máy tính chạy hệ điều hành Windows, ứng dụng vẫn có thể chạy và xử lý bình thường mà không cần thêm yêu cầu đặc biệt để tương thích giữa hai hệ điều hành này.- Phần lớn kĩ thuật của Dịch vụ Web được xây dựng dựa trên mã nguồn mở và được phát triển từ các chuẩn đã được công nhận, ví dụ như XML.- Một Dịch vụ Web bao gồm có nhiều mô-đun và có thể công bố lên mạng Internet.- Là sự kết hợp của việc phát triển theo hướng từng thành phần với những lĩnh vực cụ thể và cơ sở hạ tầng Web, đưa ra những lợi ích cho cả doanh nghiệp, khách hàng, những nhà cung cấp khác và cả những cá nhân thông qua mạng Internet.- Một ứng dụng khi được triển khai sẽ hoạt động theo mô hình client-server. Nó có thể được triển khai bởi một phần mềm ứng dụng phía server ví dụ như PHP, Oracle Application server hay Microsoft.Net…- Ngày nay dịch vụ Web đang rất phát triển, những lĩnh vực trong cuộc sống có thể áp dụng và tích hợp dịch vụ Web là khá rộng lớn như dịch vụ chọn lọc và phân loại tin tức (hệ thống thư viện có kết nối đến web portal để tìm kiếm các thông tin cần thiết); ứng dụng cho các dịch vụ du lịch (cung cấp giá vé, thông tin về địa điểm…), các đại lý bán hàng qua mạng, thông tin thương mại như giá cả, tỷ giá hối đoái, đấu giá qua mạng…hay dịch vụ giao dịch trực tuyến (cho cả B2B và B2C) như đặt vé máy bay, thông tin thuê xe…- Các ứng dụng có tích hợp dịch vụ Web đã không còn là xa lạ, đặc biệt trong điều kiện thương mại điện tử đang bùng nổ và phát triển không ngừng cùng với sự lớn mạnh của Internet. Bất kì một lĩnh vực nào trong cuộc sống cũng có thể tích hợp với dịch vụ Web, đây là cách thức kinh doanh và làm việc có hiệu quả bởi thời đại ngày nay là thời đại của truyền thông và trao đổi thông tin qua mạng. Do vậy, việc phát triển và tích hợp các ứng dụng với dịch vụ Web đang được quan tâm phát triển là điều hoàn toàn dễ hiểu.

b) Ưu và nhược điểm

Ưu điểm:

+ Dịch vụ Web cung cấp khả năng hoạt động rộng lớn với các ứng dụng phần mềm khác nhau chạy trên những nền tảng khác nhau.+ Sử dụng các giao thức và chuẩn mở. Giao thức và định dạng dữ liệu dựa trên văn bản (text), giúp các lập trình viên dễ dàng hiểu được.+ Nâng cao khả năng tái sử dụng.+ Thúc đẩy đầu tư các hệ thống phần mềm đã tồn tại bằng cách cho phép các tiến trình/chức năng nghiệp vụ đóng gói trong giao diện dịch vụ Web.+ Tạo mối quan hệ tương tác lẫn nhau và mềm dẻo giữa các thành phần trong hệ thống, dễ dàng cho việc phát triển các ứng dụng phân tán.+ Thúc đẩy hệ thống tích hợp, giảm sự phức tạp của hệ thống, hạ giá thành hoạt động, phát triển hệ thống nhanh

Page 79: giáo trình PHP

và tương tác hiệu quả với hệ thống của các doanh nghiệp khác.

Nhược điểm:

+ Những thiệt hại lớn sẽ xảy ra vào khoảng thời gian chết của Dịch vụ Web, giao diện không thay đổi, có thể lỗi nếu một máy khách không được nâng cấp, thiếu các giao thức cho việc vận hành.+ Có quá nhiều chuẩn cho dịch vụ Web khiến người dùng khó nắm bắt.+ Phải quan tâm nhiều hơn đến vấn đề an toàn và bảo mật.

3. Kiến trúc của Dịch vụ Web

Dịch vụ Web gồm có 3 chuẩn chính: SOAP (Simple Object Access Protocol), WSDL (Web Service Description Language) và UDDI (Universal Description, Discovery, and Integration). Hình 1 mô tả chồng giao thức của dịch vụ Web, trong đó UDDI được sử dụng để đăng ký và khám phá dịch vụ Web đã được miêu tả cụ thể trong WSDL. Giao tác UDDI sử dụng SOAP để nói chuyện với UDDI server, sau đó các ứng dụng SOAP yêu cầu một dịch vụ Web. Các thông điệp SOAP được gửi đi chính xác bởi HTTP và TCP/IP.

Hình 1. Chồng giao thức của dịch vụ Web

Chồng giao thức dịch vụ Web là tập hợp các giao thức mạng máy tính được sử dụng để định nghĩa, xác định vị trí, thi hành và tạo nên dịch vụ Web tương tác với những ứng dụng hay dịch vụ khác. Chồng giao thức này có 4 thành phần chính:

- Dịch vụ vận chuyển (Service Transport): có nhiệm vụ truyền thông điệp giữa các ứng dụng mạng, bao gồm những giao thức như HTTP, SMTP, FTP, JSM và gần đây nhất là giao thức thay đổi khổi mở rộng (Blocks Extensible Exchange Protocol- BEEP).- Thông điệp XML: có nhiệm vụ giải mã các thông điệp theo định dạng XML để có thể hiểu được ở mức ứng dụng tương tác với người dùng. Hiện tại, những giao thức thực hiện nhiệm vụ này là XML-RPC, SOAP và REST.- Mô tả dịch vụ: được sử dụng để miêu tả các giao diện chung cho một dịch vụ Web cụ thể. WSDL thường được sử dụng cho mục đích này, nó là một ngôn ngữ mô tả giao tiếp và thực thi dựa trên XML. Dịch vụ Web sẽ sử dụng ngôn ngữ này để truyền tham số và các loại dữ liệu cho các thao tác và chức năng mà dịch vụ Web cung cấp.- Khám phá dịch vụ: tập trung dịch vụ vào trong một nơi được đăng ký, từ đó giúp một dịch vụ Web có thể dễ dàng khám phá ra những dịch vụ nào đã có trên mạng, tốt hơn trong việc tìm kiếm những dịch vụ khác để tương tác. Một dịch vụ Web cũng phải tiến hành đăng ký để các dịch vụ khác có thể truy cập và giao tiếp. Hiện tại, UDDI API thường được sử dụng để thực hiện công việc này.

Kiến trúc sâu hơn được mô tả trong Hình 2:

Page 80: giáo trình PHP

Trong đó, tầng giao thức tương tác dịch vụ (Service Communication Protocol) với công nghệ chuẩn là SOAP. SOAP là giao thức nằm giữa tầng vận chuyển và tầng mô tả thông tin về dịch vụ, cho phép người dùng triệu gọi một dịch vụ từ xa thông qua một thông điệp XML. Ngoài ra, để các dịch vụ có tính an toàn, toàn vẹn và bảo mật thông tin, trong kiến trúc dịch vụ Web, chúng ta có thêm các tầng Policy, Security, Transaction, Management.

4. Các thành phần của Dịch vụ Web

a) XML – eXtensible Markup Language

Là một chuẩn mở do W3C đưa ra cho cách thức mô tả dữ liệu, nó được sử dụng để định nghĩa các thành phần dữ liệu trên trang web và cho những tài liệu B2B. Về hình thức, XML hoàn toàn có cấu trúc thẻ giống như ngôn ngữ HTML nhưng HTML định nghĩa thành phần được hiển thị như thế nào thì XML lại định nghĩa những thành phần đó chứa cái gì. Với XML, các thẻ có thể được lập trình viên tự tạo ra trên mỗi trang web và được chọn là định dạng thông điệp chuẩn bởi tính phổ biến và hiệu quả mã nguồn mở.

Do dịch vụ Web là sự kết hợp của nhiều thành phần khác nhau nên nó sử dụng các tính năng và đặc trưng của các thành phần đó để giao tiếp. XML là công cụ chính để giải quyết vấn đề này và là kiến trúc nền tảng cho việc xây dựng một dịch vụ Web, tất cả dữ liệu sẽ được chuyển sang định dạng thẻ XML. Khi đó, các thông tin mã hóa sẽ hoàn toàn phù hợp với các thông tin theo chuẩn của SOAP hoặc XML-RPC và có thể tương tác với nhau trong một thể thống nhất.

b)WSDL - Web Service Description Language

WSDL định nghĩa cách mô tả dịch vụ Web theo cú pháp tổng quát của XML, bao gồm các thông tin:

- Tên dịch vụ- Giao thức và kiểu mã hóa sẽ được sử dụng khi gọi các hàm của dịch vụ Web- Loại thông tin: thao tác, tham số, những kiểu dữ liệu (có thể là giao diện của dịch vụ Web cộng với tên cho giao diện này).

Một WSDL hợp lệ gồm hai phần: phần giao diện (mô tả giao diện và phương thức kết nối) và phần thi hành mô tả thông tin truy xuất CSDL. Cả hai phần này sẽ được lưu trong 2 tập tin XML tương ứng là tập tin giao diện dịch vụ và tập tin thi hành dịch vụ. Giao diện của một dịch vụ Web được miêu tả trong phần này đưa ra cách thức làm thế nào để giao tiếp qua dịch vụ Web. Tên, giao thức liên kết và định dạng thông điệp yêu cầu để tương tác với dịch vụ Web được đưa vào thư mục của WSDL.

WSDL thường được sử dụng kết hợp với XML schema và SOAP để cung cấp dịch vụ Web qua Internet. Một client khi kết nối tới dịch vụ Web có thể đọc WSDL để xác định những chức năng sẵn có trên server. Sau đó, client có thể sử dụng SOAP để lấy ra chức năng chính xác có trong WSDL.

Page 81: giáo trình PHP

c) Universal Description, Discovery, and Integration (UDDI)

Để có thể sử dụng các dịch vụ, trước tiên client phải tìm dịch vụ, ghi nhận thông tin về cách sử dụng và biết được đối tượng nào cung cấp dịch vụ. UDDI định nghĩa một số thành phần cho biết các thông tin này, cho phép các client truy tìm và nhận những thông tin được yêu cầu khi sử dụng dịch vụ Web.

- Cấu trúc UDDI :+ Trang trắng - White pages: chứa thông tin liên hệ và các định dạng chính yếu của dịch vụ Web, chẳng hạn tên giao dịch, địa chỉ, thông tin nhận dạng… Những thông tin này cho phép các đối tượng khác xác định được dịch vụ.+ Trang vàng - Yellow pages: chứa thông tin mô tả dịch vụ Web theo những loại khác nhau. Những thông tin này cho phép các đối tượng thấy được dịch vụ Web theo từng loại với nó.+ Trang xanh - Green pages: chứa thông tin kỹ thuật mô tả các hành vi và các chức năng của dịch vụ Web.+ Loại dịch vụ - tModel:  chứa các thông tin về loại dịch vụ được sử dụng.

Những thông tin về dịch vụ Web được sử dụng và công bố lên mạng sử dụng giao thức này. Nó sẽ kích hoạt các ứng dụng để tìm kiếm thông tin của dịch vụ Web khác nhằm xác định xem dịch vụ nào sẽ cần đến nó.

d) SOAP - Simple Object Access Protocol

Chúng ta đã hiểu cơ bản dịch vụ Web như thế nào nhưng vẫn còn một vấn đề khá quan trọng. Đó là làm thế nào để truy xuất dịch vụ khi đã tìm thấy? Câu trả lời là các dịch vụ Web có thể truy xuất bằng một giao thức là Simple Object Access Protocol – SOAP. Nói cách khác chúng ta có thể truy xuất đến UDDI registry bằng các lệnh gọi hoàn toàn theo định dạng của SOAP.

SOAP là một giao thức giao tiếp có cấu trúc như XML. Nó được xem là cấu trúc xương sống của các ứng dụng phân tán được xây dựng từ nhiều ngôn ngữ và các hệ điều hành khác nhau. SOAP là giao thức thay đổi các thông điệp dựa trên XML qua mạng máy tính, thông thường sử dụng giao thức HTTP.

Một client sẽ gửi thông điệp yêu cầu tới server và ngay lập tức server sẽ gửi những thông điệp trả lời tới client. Cả SMTP và HTTP đều là những giao thức ở lớp ứng dụng của SOAP nhưng HTTP được sử dụng và chấp nhận rộng rãi hơn bởi ngày nay nó có thể làm việc rất tốt với cơ sở hạ tầng Internet.

Cấu trúc một thông điệp theo dạng SOAP

Thông điệp theo định dạng SOAP là một văn bản XML bình thường bao gồm các phần tử sau:

- Phần tử gốc - envelop: phần tử bao trùm nội dung thông điệp, khai báo văn bản XML như là một thông điệp SOAP.- Phần tử đầu trang – header: chứa các thông tin tiêu đề cho trang, phần tử này không bắt buộc khai báo trong văn bản. Header còn có thể mang những dữ liệu chứng thực, những chứ ký số, thông tin mã hóa hay cài đặt cho các giao dịch khác.- Phần tử khai báo nội dung chính trong thông điệp - body, chứa các thông tin yêu cầu và thông tin được phản hồi.- Phần tử đưa ra các thông tin về lỗi -fault, cung cấp thông tin lỗi xảy ra trong qúa trình xử lý thông điệp.

Một SOAP đơn giản trong body sẽ lưu các thông tin về tên thông điệp, tham chiếu tới một thể hiện của dịch vụ, một hoặc nhiều tham số. Có 3 kiểu thông báo sẽ được đưa ra khi truyền thông tin: request message(tham số gọi thực thi một thông điệp), respond message (các tham số trả về, được sử dụng khi yêu cầu được đáp ứng) và cuối cùng là fault message (thông báo tình trạng lỗi).

Kiểu truyền thông: Có 2 kiểu truyền thông

- Remote procedure call (RPC): cho phép gọi hàm hoặc thủ tục qua mạng. Kiểu này được khai thác bởi nhiều dịch vụ Web.- Document: được biết đến như kiểu hướng thông điệp, nó cung cấp giao tiếp ở mức trừu tượng thấp, khó hiểu và yêu cầu lập trình viên mất công sức hơn.

Page 82: giáo trình PHP

Hai kiểu truyền thông này cung cấp các định dạng thông điệp, tham số, lời gọi đến các API khác nhau nên việc sử dụng chúng tùy thuộc vào thời gian và sự phù hợp với dịch vụ Web cần xây dựng.

Cấu trúc dữ liệu: Cung cấp những định dạng và khái niệm cơ bản giống như trong các ngôn ngữ lập trình khác như kiểu dữ liệu (int, string, date…) hay những kiều phức tạp hơn như struct, array, vector… Định nghĩa cấu trúc dữ liệu SOAP được đặt trong namespace SOAP-ENC.

Mã hóa: Giả sử service rquester và service provider được phát triển trong Java, khi đó mã hóa SOAP là làm thế nào chuyển đổi từ cấu trúc dữ liệu Java sang SOAP XML và ngược lại, bởi vì định dạng cho Web Service chính là XML. Bất kỳ một môi trường thực thi SOAP nào cũng phải có một bảng chứa thông tin ánh xạ nhằm chuyển đổi từ ngôn ngữ Java sang XML và từ XML sang Java - bảng đó được gọi là SOAPMappingRegistry. Nếu một kiểu dữ liệu được sử dụng dưới một dạng mã hóa thì sẽ có một ánh xạ tồn tại trong bộ đăng ký của môi trường thực thi SOAP đó.5. An toàn cho dịch vụ Web

Dịch vụ Web liên kết và tương tác với các ứng dụng qua Internet, chính vì vậy bảo mật là một vấn đề được quan tâm khi các công ty tiến tới kết hợp ứng dụng với một dịch vụ Web. Việc đảm bảo an toàn cho dịch vụ Web là một vấn đề quan trọng, đặc biệt đối với những dịch vụ liên quan đến trao đổi tiền tệ, thông tin từ thị trường chứng khoán hay dịch vụ bán hàng qua mạng (liên quan đến trả tiền bằng tài khoản và có yêu cầu thông tin cá nhân của người dùng).

Trước khi có WS-Security (bảo mật cho dịch vụ Web) thì ý nghĩa thông thường của an toàn dịch vụ Web là bảo mật kênh truyền dữ liệu. Hiện nay, nó được thực hiện cho những SOAP/HTTP dựa trên cơ chế truyền thông điệp bằng cách sử dụng giao thức HTTPS. Không chỉ là an toàn ở mức truyền thông điệp, HTTPS còn cung cấp sự an toàn tới toàn bộ gói dữ liệu HTTP.

Mặc dù HTTPS không bao gồm tất cả các khía cạnh trong chuẩn an toàn chung cho dịch vụ Web nhưng nó đã cung cấp một lớp bảo mật khá đầy đủ với định danh, chứng thực, tính toàn vẹn thông điệp hay độ tin cậy.

- Đảm bảo an toàn cho dịch vụ Web:

Khái niệm về WS-Security: đây là một chuẩn an toàn bao trùm cho SOAP, nó được dùng khi muốn xây dựng những dịch vụ Web toàn vẹn và tin cậy. Toàn vẹn có nghĩa là khi có một giao dịch hay khi truyền thông tin, hệ thống và thông tin sẽ không bị chặn, giao dịch sẽ không bị mất cũng như không thể có người lấy cắp được dữ liệu trên đường truyền. WS-security được thiết kế mang tính mở nhằm hướng tới những mô hình an toàn khác bao gồm PKI, Kerberos và SSL. Nó cũng đưa ra nhiều hỗ trợ cho các cơ chế an toàn khác, nhiều khuôn dạng chữ ký và công nghệ mã hóa, đảm bảo sự an toàn, toàn vẹn thông điệp và tính tin cậy của thông điệp. Tuy nhiên, WS–security cũng chưa thể đảm bảo được tất cả yêu cầu về bảo mật và an toàn thông tin, nó chỉ là một trong những lớp của giải pháp an toàn cho dịch vụ Web.

Tính toàn vẹn tạo ra một chữ ký số hóa XML dựa trên nội dung của thông điệp. Nếu dữ liệu bị thay đổi bất hợp pháp, nó sẽ không còn thích hợp với chữ ký số hóa XML đó. Chữ ký này được tạo ra dựa trên khóa mà người gửi thông điệp tạo ra, do đó người nhận chỉ nhận thông điệp khi có chữ ký sử dụng và nội dung phù hợp. Ngược lại sẽ có một thông báo lỗi. Việc chứng thực được thực hiện giữa client và server là cách chứng thực rất cơ bản (sử dụng định danh người dùng và mật khẩu).

WS-security chỉ là một trong những lớp an toàn và bảo mật cho dịch vụ Web, vì vậy cần một mô hình an toàn chung lớn hơn để có thể bao quát được các khía cạnh khác. Các thành phần được thêm có thể là WS-Secure Conversation Describes,WS-Authentication Describes,WS-Policy Describes hay WS-Trust Describes. Chúng sẽ thực hiện việc đảm bảo an toàn hơn cho hệ thống khi trao đổi dữ liệu, mở và đóng các phiên làm việc cũng như quản lý dữ liệu cần chứng thực và chính sách chứng thực.

6. Xây dựng một dịch vụ Web

Có 4 giai đoạn chính để xây dựng một dịch vụ Web là xây dựng, triển khai, tiến hành và quản lý, trong đó:

- Giai đoạn xây dựng bao gồm phát triển và chạy thử ứng dụng dịch vụ Web, xây dựng các chức năng và định nghĩa dịch vụ. Có hai cách khác nhau để tiến hành trong giai đoạn này, đó là Red-path- solod và Blue-path-

Page 83: giáo trình PHP

dashed. Với Red- path-solod, chúng ta sẽ xây dựng một dịch vụ Web mới từ trạng thái ban đầu hoặc với một dịch vụ đã có sẵn. Từ đó, xây dựng định nghĩa service (WSDL) với các đối tượng, hàm chức năng mà chúng ta mong muốn. Nếu theo cách Blue-path-dashed, dịch vụ Web sẽ được xây dựng từ đầu hoặc từ một định nghĩa dịch vụ WSDL. Sử dụng WSDL này, xây dựng hoặc sửa đổi lại mã để thực hiện các yêu cầu mong muốn trong dịch vụ Web.

- Giai đoạn triển khai: công bố định nghĩa dịch vụ, xây dựng WSDL và triển khai mã thực thi của dịch vụ Web. Triển khai dịch vụ Web tới một ứng dụng phía server, sau đó sẽ công bố dịch vụ Web trên mạng Internet để các client có thể nhìn thấy. Sử dụng UDDI registry để công bố lên mạng.

- Giai đoạn tiến hành: tìm kiếm và gọi thực thi dịch vụ Web bởi những người dùng muốn sử dụng dịch vụ.

- Quản lý: Quản lý và quản trị dịch vụ, duy trì sự ổn định của dịch vụ, cập nhật thông tin mới, sửa lỗi khi nó xảy ra…

Để xây dựng một dịch vụ Web, chúng ta cần hiểu được những việc phải làm và nên bắt đầu từ đâu. Có 3 cách tiếp cận chủ yếu để xây dựng nên một dịch vụ Web, có thể từ một ứng dụng đã có (bottom-up); từ một định nghĩa dịch vụ, WSDL để phát sinh một ứng dụng mới (top-down) hoặc có thể từ một nhóm các dịch vụ Web hiện có, kết hợp lại với nhau để tạo nên các chức năng mới hoặc mở rộng thêm chức năng. Những hướng tiếp cận này dựa trên những gì mà chúng ta đã có, tùy thuộc vào yêu cầu của hệ thống, trong đó tối đa việc sử dụng lại các chức năng, các thành phần, môđun đã được xây dựng.

Qui trình xây dựng một dịch vụ Web bao gồm các bước sau:

1. Định nghĩa và xây dựng các chức năng, các dịch vụ mà dịch vụ sẽ cung cấp (sử dụng ngôn ngữ Java chẳng hạn).2. Tạo WSDL cho dịch vụ3. Xây dựng SOAP server4. Đăng ký WSDL với UDDI registry để cho phép các client có thể tìm thấy và truy xuất.5. Client nhận file WSDL và từ đó xây dựng SOAP client để có thể kết nối với SOAP server6. Xây dựng ứng dụng phía client (chẳng hạn sử dụng Java) và sau đó gọi thực hiện dịch vụ thông qua việc kết nối tới SOAP server.

Lựa chọn một ngôn ngữ, xây dựng các tiến trình nghiệp vụ và chúng ta bắt đầu tạo nên một dịch vụ Web như ý muốn. Sau đó là cung cấp dịch vụ Web này trên Internet.

7. Tích hợp dịch vụ Web theo chuẩn

Để có thể thành công với dịch vụ Web chúng ta phải quan tâm đến khá nhiều vấn đề, bao gồm việc triển khai, giám sát và tích hợp hệ thống. Doanh nghiệp không những phải phát triển một ứng dụng dịch vụ Web mới mà còn phải tích hợp các ứng dụng nghiệp vụ phụ trợ của họ trong kiến trúc Dịch vụ Web. Cùng với việc triển khai và tích hợp, những nhà kinh doanh và những người sử dụng kỹ thuật cũng cần có khả năng giám sát, triển khai toàn diện để đảm bảo hoạt động kinh doanh hiệu quả và tin cậy.

- Giám sát (monitoring): Cần hỗ trợ ở cả mức công cụ và cơ sở hạ tầng để giám sát các dịch vụ Web chạy như thế nào qua toàn bộ mạng, từ một chi nhánh con của một công ty trên mạng tới các chi nhánh khác trong công ty hay giao tiếp với doanh nghiệp khác. Kết hợp thông báo theo sự kiện với các lỗi trong luồng nghiệp vụ cho những người dùng không có kinh nghiệm giám sát dịch vụ Web và các dịch vụ kế thừa khác.

- Xác định đường đi dữ liệu (Data routing): Việc thiết lập đường đi của dữ liệu giữa những thành phần của dịch vụ Web hướng tới tối đa hóa khả năng sử dụng lại. Nếu coi một thành phần (component) là một đối tượng thì mỗi thể hiện (instance) của nó sẽ không quan tâm đến các thể hiện khác của cùng thành phần đó. Những thể hiện của cùng một thành phần có thể dễ dàng được sử dụng lại trong các ứng dụng phân tán khác bởi vì chúng hoàn toàn độc lập và không phụ thuộc lẫn nhau.

- Triển khai (Deployment): Triển khai các dịch vụ Web có khả năng nâng cấp, điều khiển và cấu hình các thành phần từ xa thông qua mạng phân tán.

Page 84: giáo trình PHP

- Quản lý (Management): Có thể xây dựng theo kiến trúc P2P (Peer-to-Peer). Các hoạt động chính như thực thi các thành phần, định tuyến dữ liệu, xử lý luồng công việc và chuyển đổi dữ liệu được thực hiện tại các điểm cuối của mạng. Server sẽ tập trung giải quyết các hoạt động khác như quản lý, điều khiển sự kiện, chứng thực bảo mật và quản trị.

- Cấu hình và quản lý phiên bản (Configuration and version management): Sử dụng các công cụ linh hoạt để quản lý các phiên bản khác nhau của dịch vụ Web, cho phép các phiên bản được nâng cấp và điều khiển từ một công cụ quản lý tập trung. Kết hợp giữa ứng dụng và mạng giúp các kỹ sư triển khai có thể điều khiển các thành phần chạy trên nền tảng hệ thống phần cứng cụ thể bên trong mạng.

- Bảo mật (Security): các chuẩn mở như HTTP, XML, SOAP, WSDL và chuẩn bảo mật JSM được sử dụng rộng rãi khiến chúng trở thành lý tưởng để xây dựng các ứng dụng web. Đầu tiên, dịch vụ Web sử dụng những công nghệ này giống như firewall, SSL và các chứng nhận số. Dịch vụ Web thế hệ sau này sẽ kết hợp với những công nghệ có khả năng bảo mật cao hơn, giống như mã hóa XML và chứng nhận số XML.

Như vậy, với một dịch vụ Web, việc giao tiếp và truyền nhận dữ liệu trở nên dễ dàng và hiệu quả hơn, đồng thời đem lại chi phí thấp hơn và tăng cường những khả năng giao tiếp thời gian thực, kết nối với mọi người trên khắp thế giới. Bản chất của nền tảng công nghệ này là kiến trúc hướng dịch vụ và sự phát triển của dịch vụ Web có tương lai rất khả quan.