SlideShare una empresa de Scribd logo
1 de 84
Descargar para leer sin conexión
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.
Để 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ữ
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)
đ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
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.


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:MySQLdata, 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:mysqlbinmysqld" --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:mysqlbinmysqld" --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:mysqlbinmysqld: ready for connections.
Version: '5.0.27-community' socket: '' port: 3306 MySQL Community Edition (GP
L)


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:MySQLbin. Để sử dụng nó, bạn tiếp tục mở 1 cửa sổ cmd thứ 2, gõ
vào "C:mysqlbinmysql" -u root, nó sẽ trông giống thế này:

Quote
C:>"c:mysqlbinmysql" -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:mysqlbinmysqladmin" -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:mysqlbinmysqld: 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:mysqlbinmysqld: 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:mysqlbinmysqld" --console.


     * File thứ 2 đặt tên là MyStop.bat có nội dung: "C:mysqlbinmysqladmin" -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:windowssystem32.


- 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


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

Code:
extension_dir = "C:phpext"


- 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:windowssystem32, copy đè php_mysql.dll và
php_mysqli.dll vào thư mục extension của php (VD: C:phpext). 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.


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>
    <?php
          echo ("hello, world");
    ?>
</BODY>
</HTML>


OK, Save lại với cái tên test.php. Copy nó vào thư mục gốc (Root Directory) mặc định của Web server. Khởi động
Web server Apache lên (nó sẽ hiển thị một cửa sổ đen ngòm, bạn cứ để đó, đừng tắt nó đi, vì nếu tắt đi thì tức là
bạn đã tắt chương trình Web server Apache đi rồi đấy).
Bây giờ mở trình duyệt ra, tại ô địa chỉ, gõ nội dung sau: "http://127.0.0.1/test.php" (nhớ bỏ hai dấu ngoặc kép
đi nhé)


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


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


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


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


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


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


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


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


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


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

Code:


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


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


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


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


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



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


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


<HTML>
<BODY>


Tiếp theo, khi thấy đoạn mã thứ nhất, nó sẽ thực thi và trả về dòng "hello, world" (Dòng này do hàm echo() của
PHP thực hiện). Sau đó, nó tiếp tục trả về các dòng


<BR>
Xin chao tat ca cac ban, day la chuong trinh PHP dau tien cua toi
Đến khi gặp đoạn PHP thứ 2, nó sẽ thực thực thi đoạn mã thứ 2 này (gọi hàm echo()) và trả về kết quả:


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


Hết đoạn mã thứ 2. Nó sẽ gửi tiếp phần còn lại của file về cho Web server. Sau đó, Web server chính thức trả
toàn bộ kết quả về cho trình duyệt.
Điều quan trọng cuối cùng: Kết thúc mỗi câu lệnh của PHP đều là một dấu chấm phẩy (";"), ngoại trừ một vài
trường hợp (các bạn sẽ được biết sau này)


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


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


III. Một số lưu ý


Dấu chú thích:


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


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


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


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


Ví dụ


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


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


Hãy chú ý đến dòng chữ sau:
My name's "CMXQ"


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


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


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


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


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


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


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


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


  <?php
  $name="Tiến Tùng";
  echo("Giá trị của biến $name là $name);
  ?>


OK. Đến bây giờ, bạn đã biết một chút về PHP rồi đấy. Hãy viết vài chương trình PHP, sử dụng hàm echo đi đã
nhé . Nhớ chú ý cách thức xử lý các kết quả trả về. Hẹn gặp lại các bạn trong bài sau.
Chúc các bạn thành công
Hằng và biến trong PHP
« 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;


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


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


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


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


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


3.Định nghĩa hằng


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


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


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


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


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


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


_FILE_and_LINE_ trả về tên của đoạn script (đoạn mã nhúng) đang được phân tích tại dòng hiện thời trong đoạn
mã script.
PHP còn cung cấp một số hàm để thông báo lỗi như E_ERROR, E_WARNING, E_PARSE và E_NOTICE.


Ngoài ra, PHP còn cung cấp một số biến cung cấp thông tin về môi trường PHP đang sử dụng. Để xem các thông
tin này,bạn có thể dùng hàm phpinfo() như sau:




<HTML>
<!-- phpinfo.php-->
<BODY>
<?php
phpinfo();
?>
</BODY>
</HTML
5. Lừa kiểu và ép kiểu dữ liệu


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


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


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


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


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


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


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


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


$a=1 //$ a là một số nguyên
$b= 1.0 //$b là số thực
$c=$a+$b //$c là kiểu số thực , = 2.0
$d = $c+"6th" //$d là kiểu số thực = 8.0


Ép kiểu dữ liệu


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


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


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


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


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


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


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


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


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


- Hàm isset($ten_bien) được sử dụng để xác định xem biến $ten_bien đã đặt một giá trị nào đó hay chưa. Nếu
biến đó đã có giá trị, hàm trả về true. Trong truờng hợp ngược lại, hàm trả về giá trị false;
- Hàm unset($ten_bien) được sử dụng để huỷ bỏ biến $ten_bien, giải phóng bộ nhớ bị chiếm dụng của biến đó
Các câu lệnh gán và rẽ nhánh trong PHP
« 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)
Bước 2: Khi còn chưa hết chai thì nhày sang bước 3:
Bước 3: Mỗi thằng một chén, trăm phần trăm
Bước 4: Nếu thằng nào xỉn, thì loại nó ra khỏi trận chiến (lệnh rẽ nhánh)
Bước 5: Nếu tất cả đều xỉn: tàn cuộc (lệnh rẽ nhánh), còn nếu không thì tiếp tục
Bước 6: Nếu hết một chai thì nhảy về bước 1 (Lệnh lặp)


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


1. Lệnh gán


Lệnh này đã được học ở bài trước:
Cú pháp:
$ten_bien = gia_tri;
Ví dụ:


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


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


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


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


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


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


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


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


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


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


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


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


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


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


Chúng ta có thể sử dụng các toán tử &&, || hay xor để kết nối các điều kiện với nhau như bạn thấy ở trên


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


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


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


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


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


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


Ví dụ:


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


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


switch ($bien){
Case gia_tri 1:
    doan_lenh_1;
Case gia_tri 2:
    doan_lenh_2;
Case gia_tri n:
    doan_lenh_n;
default:
    doan_lenh_khac;
}
Ví dụ:


switch ($thu){
case 2:
    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;
}
?>


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


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


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


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


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


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


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


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


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


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


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


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


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


c) Vòng lặp for.


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


for ( $biến = giá_trị_đầu; $biến < (hay <=) giá_trị_kết_thúc; tăng_biến_đếm)
{
// Khối câu lệnh
}


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


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


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


for (bieu_thuc_1; bieu_thuc_2; bieu_thuc_3):
// Khối câu lệnh
endfor;


Ví dụ:


<?php
for ($i=1; $i<=10;++$i)


?>
<TR><TD> <INPUT type="text"> </TD></TR>
<?php
endfor
?>


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


<?
// 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
$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
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"]
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 »
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
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ố
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


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


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":
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)
{
     $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.


Để 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 »
Giao trinh-php
Giao trinh-php
Giao trinh-php
Giao trinh-php
Giao trinh-php
Giao trinh-php
Giao trinh-php
Giao trinh-php
Giao trinh-php
Giao trinh-php
Giao trinh-php
Giao trinh-php
Giao trinh-php
Giao trinh-php
Giao trinh-php
Giao trinh-php
Giao trinh-php
Giao trinh-php
Giao trinh-php
Giao trinh-php
Giao trinh-php
Giao trinh-php
Giao trinh-php
Giao trinh-php
Giao trinh-php
Giao trinh-php
Giao trinh-php
Giao trinh-php
Giao trinh-php
Giao trinh-php
Giao trinh-php
Giao trinh-php
Giao trinh-php
Giao trinh-php
Giao trinh-php
Giao trinh-php
Giao trinh-php
Giao trinh-php
Giao trinh-php
Giao trinh-php
Giao trinh-php
Giao trinh-php
Giao trinh-php
Giao trinh-php
Giao trinh-php
Giao trinh-php
Giao trinh-php
Giao trinh-php

Más contenido relacionado

La actualidad más candente

Như lai thiền
Như lai thiềnNhư lai thiền
Như lai thiền
Đỗ Bình
 
Bai04 quan ly tien trinh
Bai04   quan ly tien trinhBai04   quan ly tien trinh
Bai04 quan ly tien trinh
Vũ Sang
 
Vượt qua trì hoãn
Vượt qua trì hoãnVượt qua trì hoãn
Vượt qua trì hoãn
Khai Nguyễn
 

La actualidad más candente (20)

Luận văn: Lý thuyết đồ thị với các bài toán phổ thông, HAY, 9đ
Luận văn: Lý thuyết đồ thị với các bài toán phổ thông, HAY, 9đLuận văn: Lý thuyết đồ thị với các bài toán phổ thông, HAY, 9đ
Luận văn: Lý thuyết đồ thị với các bài toán phổ thông, HAY, 9đ
 
GIÁO ÁN HOẠT ĐỘNG TRẢI NGHIỆM 11 - CÁNH DIỀU - KÌ 1 THEO CÔNG VĂN 5512 (WORD ...
GIÁO ÁN HOẠT ĐỘNG TRẢI NGHIỆM 11 - CÁNH DIỀU - KÌ 1 THEO CÔNG VĂN 5512 (WORD ...GIÁO ÁN HOẠT ĐỘNG TRẢI NGHIỆM 11 - CÁNH DIỀU - KÌ 1 THEO CÔNG VĂN 5512 (WORD ...
GIÁO ÁN HOẠT ĐỘNG TRẢI NGHIỆM 11 - CÁNH DIỀU - KÌ 1 THEO CÔNG VĂN 5512 (WORD ...
 
Tài liệu tìm hiểu jQuery dành cho người mới bắt đầu
Tài liệu tìm hiểu jQuery dành cho người mới bắt đầuTài liệu tìm hiểu jQuery dành cho người mới bắt đầu
Tài liệu tìm hiểu jQuery dành cho người mới bắt đầu
 
Đệ Quy, Quay Lui, Nhánh Cận
Đệ Quy, Quay Lui, Nhánh CậnĐệ Quy, Quay Lui, Nhánh Cận
Đệ Quy, Quay Lui, Nhánh Cận
 
Quá trình và thiết bị tiệt trùng nước dứa năng suất 1000 lít sảm phẩm h
Quá trình và thiết bị tiệt trùng nước dứa năng suất 1000 lít sảm phẩm hQuá trình và thiết bị tiệt trùng nước dứa năng suất 1000 lít sảm phẩm h
Quá trình và thiết bị tiệt trùng nước dứa năng suất 1000 lít sảm phẩm h
 
Như lai thiền
Như lai thiềnNhư lai thiền
Như lai thiền
 
4 ĐỀ KHẢO SÁT CHẤT LƯỢNG ĐẦU NĂM MÔN TOÁN LỚP 5
4 ĐỀ KHẢO SÁT CHẤT LƯỢNG ĐẦU NĂM MÔN TOÁN LỚP 54 ĐỀ KHẢO SÁT CHẤT LƯỢNG ĐẦU NĂM MÔN TOÁN LỚP 5
4 ĐỀ KHẢO SÁT CHẤT LƯỢNG ĐẦU NĂM MÔN TOÁN LỚP 5
 
Công nghệ tính toán hiệu năng cao với bộ xử lý đồ họa GPU, 9đ
 Công nghệ tính toán hiệu năng cao với bộ xử lý đồ họa GPU, 9đ Công nghệ tính toán hiệu năng cao với bộ xử lý đồ họa GPU, 9đ
Công nghệ tính toán hiệu năng cao với bộ xử lý đồ họa GPU, 9đ
 
TÀI LIỆU POWERPOINT BÀI TẬP BỔ TRỢ TIẾNG ANH PHONICS SMART LỚP 3 - CẢ NĂM (CÓ...
TÀI LIỆU POWERPOINT BÀI TẬP BỔ TRỢ TIẾNG ANH PHONICS SMART LỚP 3 - CẢ NĂM (CÓ...TÀI LIỆU POWERPOINT BÀI TẬP BỔ TRỢ TIẾNG ANH PHONICS SMART LỚP 3 - CẢ NĂM (CÓ...
TÀI LIỆU POWERPOINT BÀI TẬP BỔ TRỢ TIẾNG ANH PHONICS SMART LỚP 3 - CẢ NĂM (CÓ...
 
BÀI TẬP BỔ TRỢ 4 KĨ NĂNG TIẾNG ANH LỚP 11 (CẢ NĂM) - FRIENDS GLOBAL - NĂM HỌC...
BÀI TẬP BỔ TRỢ 4 KĨ NĂNG TIẾNG ANH LỚP 11 (CẢ NĂM) - FRIENDS GLOBAL - NĂM HỌC...BÀI TẬP BỔ TRỢ 4 KĨ NĂNG TIẾNG ANH LỚP 11 (CẢ NĂM) - FRIENDS GLOBAL - NĂM HỌC...
BÀI TẬP BỔ TRỢ 4 KĨ NĂNG TIẾNG ANH LỚP 11 (CẢ NĂM) - FRIENDS GLOBAL - NĂM HỌC...
 
Bai04 quan ly tien trinh
Bai04   quan ly tien trinhBai04   quan ly tien trinh
Bai04 quan ly tien trinh
 
60 Admin Tips
60 Admin Tips60 Admin Tips
60 Admin Tips
 
BỘ ĐỀ KIỂM TRA CUỐI KÌ 2 VẬT LÝ 11 - KẾT NỐI TRI THỨC - THEO CẤU TRÚC ĐỀ MIN...
BỘ ĐỀ KIỂM TRA CUỐI KÌ 2 VẬT LÝ 11 - KẾT NỐI TRI THỨC - THEO CẤU TRÚC ĐỀ MIN...BỘ ĐỀ KIỂM TRA CUỐI KÌ 2 VẬT LÝ 11 - KẾT NỐI TRI THỨC - THEO CẤU TRÚC ĐỀ MIN...
BỘ ĐỀ KIỂM TRA CUỐI KÌ 2 VẬT LÝ 11 - KẾT NỐI TRI THỨC - THEO CẤU TRÚC ĐỀ MIN...
 
Vượt qua trì hoãn
Vượt qua trì hoãnVượt qua trì hoãn
Vượt qua trì hoãn
 
WIMAX-THUYET-TRINH.pptx
WIMAX-THUYET-TRINH.pptxWIMAX-THUYET-TRINH.pptx
WIMAX-THUYET-TRINH.pptx
 
Tài liệu lập trình PHP từ căn bản đến nâng cao
Tài liệu lập trình PHP từ căn bản đến nâng caoTài liệu lập trình PHP từ căn bản đến nâng cao
Tài liệu lập trình PHP từ căn bản đến nâng cao
 
BÀI TẬP DẠY THÊM TOÁN 11 - KẾT NỐI TRI THỨC - CẢ NĂM - CHƯƠNG 1 - HÀM SỐ LƯỢN...
BÀI TẬP DẠY THÊM TOÁN 11 - KẾT NỐI TRI THỨC - CẢ NĂM - CHƯƠNG 1 - HÀM SỐ LƯỢN...BÀI TẬP DẠY THÊM TOÁN 11 - KẾT NỐI TRI THỨC - CẢ NĂM - CHƯƠNG 1 - HÀM SỐ LƯỢN...
BÀI TẬP DẠY THÊM TOÁN 11 - KẾT NỐI TRI THỨC - CẢ NĂM - CHƯƠNG 1 - HÀM SỐ LƯỢN...
 
Họ vi xử lí 8086 intel
Họ vi xử lí 8086 intelHọ vi xử lí 8086 intel
Họ vi xử lí 8086 intel
 
Toán lớp 6 cơ bản và nâng cao theo sách mới Kết nối tri thức với cuộc sống
Toán lớp 6 cơ bản và nâng cao theo sách mới Kết nối tri thức với cuộc sốngToán lớp 6 cơ bản và nâng cao theo sách mới Kết nối tri thức với cuộc sống
Toán lớp 6 cơ bản và nâng cao theo sách mới Kết nối tri thức với cuộc sống
 
Ktmt chuong 5
Ktmt chuong 5Ktmt chuong 5
Ktmt chuong 5
 

Destacado

Thomas Corporate Presentation
Thomas Corporate PresentationThomas Corporate Presentation
Thomas Corporate Presentation
lloydf
 
Africananimals 110517215651-phpapp01
Africananimals 110517215651-phpapp01Africananimals 110517215651-phpapp01
Africananimals 110517215651-phpapp01
Geraldine Salazar
 
Codes and conventions of a horror
Codes and conventions of a horror Codes and conventions of a horror
Codes and conventions of a horror
Janet Lunkusé
 
icabihal sayi 2
icabihal sayi 2icabihal sayi 2
icabihal sayi 2
kolormatik
 
icabihal sayi 6
icabihal sayi 6icabihal sayi 6
icabihal sayi 6
kolormatik
 
Gasteizko irteera 2D NAPY
Gasteizko irteera 2D NAPYGasteizko irteera 2D NAPY
Gasteizko irteera 2D NAPY
arbelar
 
Gasteizko irteera 2A TERRAS
Gasteizko irteera 2A TERRASGasteizko irteera 2A TERRAS
Gasteizko irteera 2A TERRAS
arbelar
 
Final exam mrs craig 4
Final exam mrs craig 4Final exam mrs craig 4
Final exam mrs craig 4
cmhagc
 
Digital footprint & teaching ethics of digital media
Digital footprint & teaching ethics of digital mediaDigital footprint & teaching ethics of digital media
Digital footprint & teaching ethics of digital media
holleyambrose
 
Medent97 course-4 a-laboratory+medicine-notes-2011-11_14-5
Medent97 course-4 a-laboratory+medicine-notes-2011-11_14-5Medent97 course-4 a-laboratory+medicine-notes-2011-11_14-5
Medent97 course-4 a-laboratory+medicine-notes-2011-11_14-5
Ronan Hans Hsieh
 

Destacado (20)

Changing the world
Changing the worldChanging the world
Changing the world
 
Thomas Corporate Presentation
Thomas Corporate PresentationThomas Corporate Presentation
Thomas Corporate Presentation
 
Africananimals 110517215651-phpapp01
Africananimals 110517215651-phpapp01Africananimals 110517215651-phpapp01
Africananimals 110517215651-phpapp01
 
Orqubit Business Intelligence
Orqubit Business IntelligenceOrqubit Business Intelligence
Orqubit Business Intelligence
 
Advance Information Management Through eTMF and CTMS Convergence
Advance Information Management Through eTMF and CTMS ConvergenceAdvance Information Management Through eTMF and CTMS Convergence
Advance Information Management Through eTMF and CTMS Convergence
 
Codes and conventions of a horror
Codes and conventions of a horror Codes and conventions of a horror
Codes and conventions of a horror
 
Grant Thornton/ICAEW Business Confidence Monitor Q2 2014
Grant Thornton/ICAEW Business Confidence Monitor Q2 2014Grant Thornton/ICAEW Business Confidence Monitor Q2 2014
Grant Thornton/ICAEW Business Confidence Monitor Q2 2014
 
Газовый напольный котел Buderus Logano G124-32 WS "RU"
Газовый напольный котел Buderus Logano G124-32 WS "RU"Газовый напольный котел Buderus Logano G124-32 WS "RU"
Газовый напольный котел Buderus Logano G124-32 WS "RU"
 
icabihal sayi 2
icabihal sayi 2icabihal sayi 2
icabihal sayi 2
 
Future Of Agriculture
Future Of AgricultureFuture Of Agriculture
Future Of Agriculture
 
icabihal sayi 6
icabihal sayi 6icabihal sayi 6
icabihal sayi 6
 
Embedded Service Oriented Monitoring for the Energy Aware Factory
Embedded Service Oriented Monitoring for the Energy Aware Factory Embedded Service Oriented Monitoring for the Energy Aware Factory
Embedded Service Oriented Monitoring for the Energy Aware Factory
 
Gasteizko irteera 2D NAPY
Gasteizko irteera 2D NAPYGasteizko irteera 2D NAPY
Gasteizko irteera 2D NAPY
 
Gasteizko irteera 2A TERRAS
Gasteizko irteera 2A TERRASGasteizko irteera 2A TERRAS
Gasteizko irteera 2A TERRAS
 
Final exam mrs craig 4
Final exam mrs craig 4Final exam mrs craig 4
Final exam mrs craig 4
 
Pitchstar inspiration presentation The Hague University
Pitchstar inspiration presentation The Hague UniversityPitchstar inspiration presentation The Hague University
Pitchstar inspiration presentation The Hague University
 
Digital footprint & teaching ethics of digital media
Digital footprint & teaching ethics of digital mediaDigital footprint & teaching ethics of digital media
Digital footprint & teaching ethics of digital media
 
Medent97 course-4 a-laboratory+medicine-notes-2011-11_14-5
Medent97 course-4 a-laboratory+medicine-notes-2011-11_14-5Medent97 course-4 a-laboratory+medicine-notes-2011-11_14-5
Medent97 course-4 a-laboratory+medicine-notes-2011-11_14-5
 
алескерова
алескероваалескерова
алескерова
 
Overview of Virgin Islands Energy Issues
Overview of Virgin Islands Energy IssuesOverview of Virgin Islands Energy Issues
Overview of Virgin Islands Energy Issues
 

Similar a Giao trinh-php

Báo cáo thực tập - Huỳnh Anh Tuấn
Báo cáo thực tập - Huỳnh Anh TuấnBáo cáo thực tập - Huỳnh Anh Tuấn
Báo cáo thực tập - Huỳnh Anh Tuấn
Huỳnh Tuấn
 
Cài đặt web server (linux)-Pham Hoang Phuc-Athena
Cài đặt web server (linux)-Pham Hoang Phuc-AthenaCài đặt web server (linux)-Pham Hoang Phuc-Athena
Cài đặt web server (linux)-Pham Hoang Phuc-Athena
Hoàng Phúc Phạm
 
Học lập trình php bằng tiếng việt
Học lập trình php bằng tiếng việtHọc lập trình php bằng tiếng việt
Học lập trình php bằng tiếng việt
kentvu
 
Chuong 1 qttk_website.html
Chuong 1 qttk_website.htmlChuong 1 qttk_website.html
Chuong 1 qttk_website.html
Heo Mọi
 
Cấu hình modem alcatel speed touch để xem camera
Cấu hình modem alcatel speed touch để xem cameraCấu hình modem alcatel speed touch để xem camera
Cấu hình modem alcatel speed touch để xem camera
Thien Binh
 

Similar a Giao trinh-php (20)

Báo cáo thực tập tuần - VPS
Báo cáo thực tập tuần - VPSBáo cáo thực tập tuần - VPS
Báo cáo thực tập tuần - VPS
 
Vps server internet
Vps server internetVps server internet
Vps server internet
 
Bao cao thuc tap vps
Bao cao thuc tap vpsBao cao thuc tap vps
Bao cao thuc tap vps
 
Co Ban Ve Internet
Co Ban Ve InternetCo Ban Ve Internet
Co Ban Ve Internet
 
Bài giảng thiết kế website - truongkinhtethucpham.com
Bài giảng thiết kế website - truongkinhtethucpham.comBài giảng thiết kế website - truongkinhtethucpham.com
Bài giảng thiết kế website - truongkinhtethucpham.com
 
Báo cáo thực tập doanh nghiệp-Athena
Báo cáo thực tập doanh nghiệp-AthenaBáo cáo thực tập doanh nghiệp-Athena
Báo cáo thực tập doanh nghiệp-Athena
 
Bao cao web cake php
Bao cao web cake phpBao cao web cake php
Bao cao web cake php
 
Báo cáo thực tập - Huỳnh Anh Tuấn
Báo cáo thực tập - Huỳnh Anh TuấnBáo cáo thực tập - Huỳnh Anh Tuấn
Báo cáo thực tập - Huỳnh Anh Tuấn
 
Phan 6
Phan 6Phan 6
Phan 6
 
PHP có thể làm gì? 9 Thứ thú vị có thể làm với PHP
PHP có thể làm gì?  9 Thứ thú vị có thể làm với PHPPHP có thể làm gì?  9 Thứ thú vị có thể làm với PHP
PHP có thể làm gì? 9 Thứ thú vị có thể làm với PHP
 
GIỚI THIỆU CÁC DẠNG MÁY CHỦ SERVER
GIỚI THIỆU CÁC DẠNG MÁY CHỦ SERVERGIỚI THIỆU CÁC DẠNG MÁY CHỦ SERVER
GIỚI THIỆU CÁC DẠNG MÁY CHỦ SERVER
 
Cài đặt web server (linux)-Pham Hoang Phuc-Athena
Cài đặt web server (linux)-Pham Hoang Phuc-AthenaCài đặt web server (linux)-Pham Hoang Phuc-Athena
Cài đặt web server (linux)-Pham Hoang Phuc-Athena
 
Đề tài: Tìm hiểu mail server dựa trên phần mềm mã nguồn mở Zimbra
Đề tài: Tìm hiểu mail server dựa trên phần mềm mã nguồn mở ZimbraĐề tài: Tìm hiểu mail server dựa trên phần mềm mã nguồn mở Zimbra
Đề tài: Tìm hiểu mail server dựa trên phần mềm mã nguồn mở Zimbra
 
Wordpress
WordpressWordpress
Wordpress
 
Học lập trình php bằng tiếng việt
Học lập trình php bằng tiếng việtHọc lập trình php bằng tiếng việt
Học lập trình php bằng tiếng việt
 
TÀI LIỆU ĐÁP ÁN VÀ CÂU HỎI KIỂM TRA, SÁT HẠCH KIẾN THỨC CHUYÊN NGÀNH.Tuyển dụ...
TÀI LIỆU ĐÁP ÁN VÀ CÂU HỎI KIỂM TRA, SÁT HẠCH KIẾN THỨC CHUYÊN NGÀNH.Tuyển dụ...TÀI LIỆU ĐÁP ÁN VÀ CÂU HỎI KIỂM TRA, SÁT HẠCH KIẾN THỨC CHUYÊN NGÀNH.Tuyển dụ...
TÀI LIỆU ĐÁP ÁN VÀ CÂU HỎI KIỂM TRA, SÁT HẠCH KIẾN THỨC CHUYÊN NGÀNH.Tuyển dụ...
 
Chuong 1 qttk_website.html
Chuong 1 qttk_website.htmlChuong 1 qttk_website.html
Chuong 1 qttk_website.html
 
Cấu hình modem alcatel speed touch để xem camera
Cấu hình modem alcatel speed touch để xem cameraCấu hình modem alcatel speed touch để xem camera
Cấu hình modem alcatel speed touch để xem camera
 
chương 4 - TCP/IP - mạng máy tính
chương 4 - TCP/IP - mạng máy tínhchương 4 - TCP/IP - mạng máy tính
chương 4 - TCP/IP - mạng máy tính
 
Bao cao thuc tap tuan 5
Bao cao thuc tap tuan 5Bao cao thuc tap tuan 5
Bao cao thuc tap tuan 5
 

Más de hieusy

Thảo luận logic học
Thảo luận logic họcThảo luận logic học
Thảo luận logic học
hieusy
 
Tcs p2
Tcs p2Tcs p2
Tcs p2
hieusy
 
Tcs p1
Tcs p1Tcs p1
Tcs p1
hieusy
 
Ngan hang de thi (du thao)
Ngan hang de thi (du thao)Ngan hang de thi (du thao)
Ngan hang de thi (du thao)
hieusy
 
Logic tl(01 k5)
Logic tl(01 k5)Logic tl(01 k5)
Logic tl(01 k5)
hieusy
 
Logic chuong5
Logic chuong5Logic chuong5
Logic chuong5
hieusy
 
Logic chuong4
Logic chuong4Logic chuong4
Logic chuong4
hieusy
 
Logic chuong3
Logic chuong3Logic chuong3
Logic chuong3
hieusy
 
Logic chuong2
Logic chuong2Logic chuong2
Logic chuong2
hieusy
 
Logic chuong1
Logic chuong1Logic chuong1
Logic chuong1
hieusy
 
Logic hoc dai cuong (vuong tat dat)
Logic hoc dai cuong (vuong tat dat)Logic hoc dai cuong (vuong tat dat)
Logic hoc dai cuong (vuong tat dat)
hieusy
 
Giao trinh logic dc(trần văn toàn)
Giao trinh logic dc(trần văn toàn)Giao trinh logic dc(trần văn toàn)
Giao trinh logic dc(trần văn toàn)
hieusy
 
Giao trinh logic dc(trần väƒn toă n)
Giao trinh logic dc(trần väƒn toă n)Giao trinh logic dc(trần väƒn toă n)
Giao trinh logic dc(trần väƒn toă n)
hieusy
 
Giao trinh logic (bui thanh quat)
Giao trinh logic (bui thanh quat)Giao trinh logic (bui thanh quat)
Giao trinh logic (bui thanh quat)
hieusy
 
Giai thuat va lap trinh
Giai thuat va lap trinhGiai thuat va lap trinh
Giai thuat va lap trinh
hieusy
 
De cuong on tap (form)
De cuong on tap (form)De cuong on tap (form)
De cuong on tap (form)
hieusy
 
Thảo luận logic học
Thảo luận logic họcThảo luận logic học
Thảo luận logic học
hieusy
 
Ngan hang de thi (du thao)
Ngan hang de thi (du thao)Ngan hang de thi (du thao)
Ngan hang de thi (du thao)
hieusy
 
Logic tl(01 k5)
Logic tl(01 k5)Logic tl(01 k5)
Logic tl(01 k5)
hieusy
 

Más de hieusy (20)

Thảo luận logic học
Thảo luận logic họcThảo luận logic học
Thảo luận logic học
 
Tcs p2
Tcs p2Tcs p2
Tcs p2
 
Tcs p1
Tcs p1Tcs p1
Tcs p1
 
Ngan hang de thi (du thao)
Ngan hang de thi (du thao)Ngan hang de thi (du thao)
Ngan hang de thi (du thao)
 
Logic tl(01 k5)
Logic tl(01 k5)Logic tl(01 k5)
Logic tl(01 k5)
 
Logic chuong5
Logic chuong5Logic chuong5
Logic chuong5
 
Logic chuong4
Logic chuong4Logic chuong4
Logic chuong4
 
Logic chuong3
Logic chuong3Logic chuong3
Logic chuong3
 
Logic chuong2
Logic chuong2Logic chuong2
Logic chuong2
 
Logic chuong1
Logic chuong1Logic chuong1
Logic chuong1
 
Logic hoc dai cuong (vuong tat dat)
Logic hoc dai cuong (vuong tat dat)Logic hoc dai cuong (vuong tat dat)
Logic hoc dai cuong (vuong tat dat)
 
Giao trinh logic dc(trần văn toàn)
Giao trinh logic dc(trần văn toàn)Giao trinh logic dc(trần văn toàn)
Giao trinh logic dc(trần văn toàn)
 
Giao trinh logic dc(trần väƒn toă n)
Giao trinh logic dc(trần väƒn toă n)Giao trinh logic dc(trần väƒn toă n)
Giao trinh logic dc(trần väƒn toă n)
 
Giao trinh logic (bui thanh quat)
Giao trinh logic (bui thanh quat)Giao trinh logic (bui thanh quat)
Giao trinh logic (bui thanh quat)
 
Giai thuat va lap trinh
Giai thuat va lap trinhGiai thuat va lap trinh
Giai thuat va lap trinh
 
De cuong on tap (form)
De cuong on tap (form)De cuong on tap (form)
De cuong on tap (form)
 
Ctdl1
Ctdl1Ctdl1
Ctdl1
 
Thảo luận logic học
Thảo luận logic họcThảo luận logic học
Thảo luận logic học
 
Ngan hang de thi (du thao)
Ngan hang de thi (du thao)Ngan hang de thi (du thao)
Ngan hang de thi (du thao)
 
Logic tl(01 k5)
Logic tl(01 k5)Logic tl(01 k5)
Logic tl(01 k5)
 

Giao trinh-php

  • 1. 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.
  • 2. Để 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ữ
  • 3. 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)
  • 4. đ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
  • 5. 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 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.
  • 6. - 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. 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:MySQLdata, 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:mysqlbinmysqld" --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:mysqlbinmysqld" --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
  • 7. 061204 22:50:42 [Note] C:mysqlbinmysqld: ready for connections. Version: '5.0.27-community' socket: '' port: 3306 MySQL Community Edition (GP L) 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:MySQLbin. Để sử dụng nó, bạn tiếp tục mở 1 cửa sổ cmd thứ 2, gõ vào "C:mysqlbinmysql" -u root, nó sẽ trông giống thế này: Quote C:>"c:mysqlbinmysql" -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:mysqlbinmysqladmin" -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:mysqlbinmysqld: 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:mysqlbinmysqld: 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:mysqlbinmysqld" --console. * File thứ 2 đặt tên là MyStop.bat có nội dung: "C:mysqlbinmysqladmin" -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:windowssystem32. - 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 đó:
  • 8. Code: ;extension=php_mysql.dll ;extension=php_mysqli.dll * Khai báo đường dẫn đến thư mục chứa extension của PHP: Code: extension_dir = "C:phpext" - 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:windowssystem32, copy đè php_mysql.dll và php_mysqli.dll vào thư mục extension của php (VD: C:phpext). 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.
  • 9. - Nếu chương trình triệu gọi gây ra lỗi truy cập, nó có thể dẫn đến tình trạng server bị treo tắc tử. - Và cuối cùng: khi đã được dịch ra các file DLL, công việc gỡ lỗi cũng như bảo trì mã lệnh trở nên vất vả hơn bao giờ hết. Kỹ thuật Web mới nhất của Microsoft, kết hợp HTML, các đoạn Script, các thành phần xử lý phía server trong cùng một file, được gọi là ASP (Active Server Pages), với phiên bản mới nhất hiện nay là ASP.Net. ASP được triệu gọi bởi một thư viện liên kết động gắn với các Web server của Microsoft. Về bản chất, ta có thể coi ASP như là một ngôn ngữ thông dịch vậy. Một trang ASP có thể sử dụng HTML, JScript và VBScript. Qua các đoạn mã nhúng này, ASP có thể truy cập đến các thành phần phía server. Các thành phần này có thể được viết trên bất kỳ ngôn ngữ nào hỗ trợ các thành phần COM của Microsoft. Và đây chính là sức mạnh của ASP: Nó có thể làm được bất kỳ cái gì mà máy chủ có thể làm được với các thành phần COM. Sau khi được thi hành, ASP sẽ sản sinh ra một trang Web có khuôn dạng HTML và trả nó về cho Web server. Một bất lợi lớn đối với ASP là nó chỉ có thể hoạt động trên các họ Web server của Microsoft (bao gồm PWS trên Win9x hay IIS trên WinNT/2000/XP). Các nhà phát triển đang hướng đến những môi trường khác như Unix/Linux (hiện đã có bản Chili! ASP chạy trên các môi trường này), nhưng kết quả thì còn phải đợi thêm một thời gian nữa Trước khi đi vào tìm hiểu lịch sử của PHP, có lẽ chúng ta cũng phải nhắc đến một tên tuổi khác là Java Server Pages. hay JSP. Giống như ASP, trang JSP cho phép chứa HTML, các đoạn mã Java và các thành phần Java Bean và chúng sẽ thực hiện các công việc để sản sinh ra một trang Web để gửi về Client. Bất lợi chính của loại này là phải đi kèm với "máy ảo Java", vốn không được coi là nhanh về mặt tốc độ. Lịch sử PHP PHP - viết tắt của PHP Hypertext Preprocessor - một định nghĩa đệ quy khó hiểu! Vào khoảng năm 1994, Rasmus Lerdorf đưa một số đoạn Perl Script vào trang Web để theo dõi xem ai đang đọc tài liệu của ông ta. Dần dần, người ta bắt đầu thích các đoạn Script này và sau đó đã xuất bản một gói công cụ có tên là "Personal Home Pages" (nghĩa đầu tiên của PHP). Ông ta đã viết một cơ chế nhúng và kết hợp với một số công cụ khác để phân tích đầu vào từ các mẫu biểu HTML: FI, Form Interpreter hay Phiên dịch mẫu biểu, được tạo ra theo cách đó và được đặt tên là PHP/FI hay PHP2. Nó được hoàn thành vào khoảng giữa năm 1995. Sau đó, người ta bắt đầu sử dụng các công cụ này để xây dựng những thứ rắc rối hơn, và đội ngũ phát triển đã thay đổi từ một người duy nhất thành một nhóm các nhà phát triển nòng cốt trong dự án, và nó đã được tổ chức hoá. Đó là sự bắt đầu của PHP3. Đội ngũ các nhà phát triển (Rasmus Lerdorf, Andi Gutmans, Zeev Suraski, Stig Bakken, Shane Caraveo và Jim Winstead) đã cải tiến và mở rộng bộ máy nhúng và bổ sung thêm một số hàm API đơn giản cho phép các lập trình viên khác tự do bổ sung nhiều tính năng vào ngôn ngữ bằng cách viết các module cho nó. Cấu trúc của ngôn ngữ đã được tinh chế, được kết cấu thân thiện hơn đối với những người đến từ các ngôn ngữ hướng đối tượng hay các ngôn ngữ hướng thủ tục. Nếu bạn đã biết một vài ngôn ngữ lập trình khác thì khi đến với PHP, bạn sẽ không cảm thấy khó khăn. Phiên bản mới nhất cho đến thời điểm này là PHP 5.0.1. Các bạn có thể tham khảo chi tiết tại trang web http://www.php.net. Chương trình PHP đầu tiên: Hello, World « 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:
  • 10. Code: <HTML> <BODY> <?php echo ("hello, world"); ?> </BODY> </HTML> OK, Save lại với cái tên test.php. Copy nó vào thư mục gốc (Root Directory) mặc định của Web server. Khởi động Web server Apache lên (nó sẽ hiển thị một cửa sổ đen ngòm, bạn cứ để đó, đừng tắt nó đi, vì nếu tắt đi thì tức là bạn đã tắt chương trình Web server Apache đi rồi đấy). Bây giờ mở trình duyệt ra, tại ô địa chỉ, gõ nội dung sau: "http://127.0.0.1/test.php" (nhớ bỏ hai dấu ngoặc kép đi nhé) Nó sẽ hiển thị ra cửa sổ trình duyệt với duy nhất dòng chữ hello, world Chắc bạn thất vọng lắm hả? Vâng, nó chỉ có mỗi dòng chữ "hello, world" trên màn hình trình duyệt, mà bạn có thể làm nó đơn giản hơn rất nhiều, chẳng cần đến cái PHP kia. OK. Đừng thất vọng vội. Chương trình này hoạt động như thế nào? Trước tiên chúng ta hãy tìm hiểu cách thức hoạt động của hệ trình duyệt (Web Client) và máy chủ cung cấp dịch vụ Web (Web server ) đã nhé: Bước 1: Trình duyệt gửi một yêu cầu HTTP đến máy chủ, yêu cầu một file nào đó Bước 2: Máy chủ sẽ chuyển yêu cầu này đến chương trình xử lý tương ứng, chính là chương trình Web server. Bước 3: Web server phân tích chuỗi yêu cầu nhận được, kiểm tra xem trình duyệt ở máy khách yêu cầu gì. Nếu đó là các file bình thường (không phải là các file chứa các đoạn mã script thực thi phía máy chủ), nó sẽ tìm kiếm file đó và trả về cho trình duyệt ở máy khách. Còn nếu đó là các file chứa các đoạn mã script thực thi phía máy chủ (các chương trình CGI, hay các file thư viện liên kết động ISAPI, hoặc các file *.asp hay *.php), nó sẽ triệu gọi chương trình thực thi các đoạn mã này. Chương trình này sẽ chịu trách nhiệm chạy các đoạn mã, trả chúng về cho Web server dưới khuôn dạng của HTML. Sau đó, Web server mới trả kết quả lấy được cho trình duyệt. Như vậy, chương trình của bạn phải được thực thi trên máy chủ, sau đó mới được trả về cho trình duyêt. Và đây chính là cái gọi là "Trang Web động". Không như các trang web tĩnh, trang web động cho phép bạn có sự tương tác với máy chủ thông qua các đoạn script thực thi phía server. Nhờ có sự tương tác này, bạn có thể truy xuất cơ sở dữ liệu, lấy thông tin người sử dụng, điều khiển các hoạt động khác... OK. Bây giờ chắc bạn đã có được chút ít kiến thức với các hệ thống điều khiển Web Client - Server rồi. Đến lượt chúng ta bắt đầu phân tích chương trình đầu tiên kia. II. Phân tích chương trình Quay trở về đoạn mã trên: Code: <HTML> <BODY> <?php echo ("hello, world");
  • 11. ?> </BODY> </HTML> Điều đầu tiên các bạn cần phải biết, đó là các đoạn mã thực thi PHP luôn luôn được đặt trong thẻ <?php .... ?>. Chương trình xử lý phía máy chủ sẽ chỉ thực thi các đoạn mã nằm trong thẻ này. Tất cả các đoạn mã khác nằm ngoài thẻ trên đều không được xử lý trực tiếp trên server mà được đưa về trình duyệt. <?php // Đoạn mã PHP đặt ở đây ?> Điều thứ 2 bạn cần biết là chương trình của bạn phải được đặt trong các file *.php. Nếu bạn đặt nó vào file khác, thì đừng mong nó chạy nhé, vì nguyên tắc của chương trình Web server là chỉ triệu gọi các chương trình xử lý tương ứng với các file có đuôi xác định trước. Điều thứ 3 bạn cần biết là trong file *.php của bạn, ngoài các đoạn script PHP, bạn có thể đặt bất kỳ cái gì theo khuôn dạng HTML, kể cả các đoạn JavaScript chạy trên máy khách. Tức là ngoại trừ các đoạn script PHP ra thì nó không khác gì một file HTML thông thường Điều thứ 4 các bạn cần biết, là chúng ta có thể đặt nhiều đoạn mã xử lý PHP khác nhau trong cùng một file PHP. Các đoạn mã PHP này sẽ được thực thi lần lượt từ đầu file xuống dưới. Hãy xem ví dụ sau: Code: <HTML> <BODY> <?php echo ("hello, world"); ?> <BR> Xin chao tat ca cac ban, day la chuong trinh PHP dau tien cua toi <?php echo ("<p align=right> CMXQ </p>") ?> </BODY> </HTML> Khởi đầu, chương trình xử lý phía Web server sẽ phân tích file PHP này, trả về đoạn mã <HTML> <BODY> Tiếp theo, khi thấy đoạn mã thứ nhất, nó sẽ thực thi và trả về dòng "hello, world" (Dòng này do hàm echo() của PHP thực hiện). Sau đó, nó tiếp tục trả về các dòng <BR> Xin chao tat ca cac ban, day la chuong trinh PHP dau tien cua toi Đến khi gặp đoạn PHP thứ 2, nó sẽ thực thực thi đoạn mã thứ 2 này (gọi hàm echo()) và trả về kết quả: "<p align=right> CMXQ </p>" Hết đoạn mã thứ 2. Nó sẽ gửi tiếp phần còn lại của file về cho Web server. Sau đó, Web server chính thức trả toàn bộ kết quả về cho trình duyệt.
  • 12. Điều quan trọng cuối cùng: Kết thúc mỗi câu lệnh của PHP đều là một dấu chấm phẩy (";"), ngoại trừ một vài trường hợp (các bạn sẽ được biết sau này) Bây giờ tôi xin giải thích cách sử dụng hàm duy nhất trong bài này: echo() Hàm echo được sử dụng để trả về nội dung của các biến, hằng, chuỗi... cho trình duyệt. Ở ví dụ trên, hàm echo trả về chuỗi "hello, world" và chuỗi "<p align=right> Le Nguyen Sinh </p>". Các thẻ HTML trong chuỗi sẽ được giữ nguyên khi nó được đưa về trình duyệt, và nó sẽ được xử lý như các thẻ HTML khác. III. Một số lưu ý Dấu chú thích: Các đoạn chú thích rất hữu dụng trong các chương trình của bạn (chẳng hạn muốn chú thích câu lệnh này làm gì, đoạn chương trình này làm gì...). Khi phân tích mã PHP, các đoạn chú thích sẽ bị bỏ qua, nhưng một lập trình viên thì không bao giờ bỏ qua chúng Chúng ta có thể sử dụng một số dấu chú thích sau trong PHP: // dòng văn bản chú thích (chỉ áp dụng trên một dòng) /* Đoạn văn bản chú thích */ (nằm trong cặp /* và */ Lưu ý rằng các dấu chú thích này chỉ có hiệu lực trong các đoạn mã nhúng PHP thôi đấy nhé Ví dụ <?php echo("Tôi là một oan hồn vô danh"); // Hiển thị lời giới thiệu lên màn hình echo (" Sơ yếu lý lịch"); /* Hiển thị bản sơ yếu lý lịch Copyright © by CMXQ */ echo ("Tên đầy đủ: XXXXXXX"); echo ("Ngày sinh: XXXX"); ?> Ký tự giải phóng Hãy chú ý đến dòng chữ sau: My name's "CMXQ" Để in nó ra màn hình, chắc các bạn sẽ làm như sau: <?php echo("My name's ""CMXQ""); ?> Rất tiếc là bạn đã nhầm. PHP có quy định một số ký tự đặc biệt (Dấu ngoặc kép (") là một trong các ký tự đó). Một vài phiên bản của web server khi gặp lỗi này đã không thực hiện nữa, và thông báo lỗi đến người dùng. Còn trong một vài phiên bản khác, nó sẽ tự động chèn một dấu sượt chéo (/) trước ký tự gây lỗi này. Một dấu gạch chéo () trước ký tự gây lỗi khiến cho nó được đối xử như là một ký tự thông thường, không phải là ký tự đặc
  • 13. biệt. Ký tự này () được gọi là ký tự giải phóng (Escaping character). Đoạn mã đúng như sau: <?php echo ("My name's: "CMXQ""); ?> Dưới đây là một số các ký tự đặc biệt mà có thể được chỉ rõ với ký tự giải phóng gạch chéo Ký tự nối tiếp Nghĩa ' Dấu móc lửng (') " Dấu móc kép (") Dấu gạch chéo () $ Dấu $ n Ký tự tạo dòng mới r Ký tự về đầu dòng t Ký tự Tab Hãy xem ví dụ dưới đây (yêu cầu bạn tự tìm hiểu và phân tích mã nguồn) <?php $name="Tiến Tùng"; echo("Giá trị của biến $name là $name); ?> OK. Đến bây giờ, bạn đã biết một chút về PHP rồi đấy. Hãy viết vài chương trình PHP, sử dụng hàm echo đi đã nhé . Nhớ chú ý cách thức xử lý các kết quả trả về. Hẹn gặp lại các bạn trong bài sau. Chúc các bạn thành công Hằng và biến trong PHP « 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.
  • 14. Để gán giá trị cho các biến, bạn sử dụng câu lệnh gán như sau: $tên_biến = giá trị cần gán; Ví dụ: $nam_sinh=1980; $ho_ten="CMXQ"; Các bạn chú ý đến 2 ví dụ tôi nhập dữ liệu: một cái thì nằm trong cặp dấu ngoặc kép chỉ thị biến đó chứa dữ liệu theo kiểu xâu, còn một cái thì không nằm trong cặp dấu ngoặc kép chỉ thị biến đó chứa dữ liệu kiểu số. Bạn sẽ biết chi tiết hơn ở ngay sau đây: 2. Các kiểu dữ liệu trong PHP PHP có 3 kiểu dữ liệu cơ bản: Integer, double và string. Ngoài ra còn một số kiểu dữ liệu khác, đượ xây dựng dựa trên các kiểu dữ liệu cơ bản trên, như mảng, object, mà chúng ta sẽ đề cập đến sau. Tất cả các biến đều được chỉ định kiểu dữ liệu, và như chúng ta đã nói ở trên, giá trị của chúng có thể bị thay đổi trong quá trình sử dụng. Kiểu giá trị Integer sử dụng 4 byte của bộ nhớ. Đây là kiểu giá trị nguyên (không phải là số thực) và có giá trị nằm trong khoảng từ -2 tỷ đến 2 tỷ. Kiểu dữ liệu double là kiểu dữ liệu số thực, cho phép chứa các số thưc. Kiểu String được sử dụng để chứa các dữ liệu như là các ký tự văn bản, ký tự đặc biệt và các chữ số. Dữ liệu kiểu string được đặt trong cặp dấu ngoặc kép ("") chỉ định một xâu (hay còn gọi là chuỗi ký tự). Ví dụ: 2: Kiểu integer; 2.0: kiểu double "2": Kiểu xâu "2 gio": Kiểu xâu 3.Định nghĩa hằng Hàm define() được sử dụng để tạo một hằng số: Hàm này có cấu trúc sau: define ("tên_hằng","giá trị của hằng"); Ví dụ: define ("COMPANY","NS Co.Ltd");// Định nghĩa hằng COMPANY với giá trị là "NS Co Ltd" define ("diem_so",4.5);// định nghĩa hằng diem_so với giá trị là 4.5 (hic... thi lại ); Sau khi một hằng số được tạo ra, ta có thể sử dụng chúng thay cho giá trị của chúng: echo ("Tên công ty: ".COMPANY); Điều này tương đương với echo ("Tên công ty: NS Co Ltd"); 4. Một số hằng xây dựng sẵn (built in constant) PHP có chứa một số hằng được xây dựng sẵn. TRUE và FALSE là 2 hằng đã được dựng sẵn với chỉ định true (1) và false (=0 hoặc một xâu rỗng) Hằng số PHP_VERSION chỉ định phiên bản của bộ phân tích PHP mà bạn đang dùng hiện tại. Hằng PHP_OS chỉ định hệ điều hành server mà trình phân tích PHP đang chạy. echo (PHP_OS); // in ra màn hình "Linux" (ví dụ) _FILE_and_LINE_ trả về tên của đoạn script (đoạn mã nhúng) đang được phân tích tại dòng hiện thời trong đoạn mã script.
  • 15. PHP còn cung cấp một số hàm để thông báo lỗi như E_ERROR, E_WARNING, E_PARSE và E_NOTICE. Ngoài ra, PHP còn cung cấp một số biến cung cấp thông tin về môi trường PHP đang sử dụng. Để xem các thông tin này,bạn có thể dùng hàm phpinfo() như sau: <HTML> <!-- phpinfo.php--> <BODY> <?php phpinfo(); ?> </BODY> </HTML 5. Lừa kiểu và ép kiểu dữ liệu Như chúng ta đã biết, tất cả các biến PHP đều có kiểu dữ liệu riêng. Kiểu dữ liệu của biến sẽ được tự động xác định bởi giá trị đặt vào biến $a=1 // $a là kiểu integer $a=1.2 // Bây giờ, nó là kiểu double $a="1" // Và bây giờ nó là kiểu string a) Chuyển kiểu chuỗi và lừa kiểu dữ liệu Nếu bạn làm các thao tác tính toán số trên một chuỗi, PHP sẽ tính toán chuỗi như là một số. Điều này được biết đến với cái tên gọi là "chuyển kiểu chuối (String conversion), mặc dù giá trị chuỗi của nó có thể không cần phải thay đổi. Trong đoạn ví dụ sau, biến $str được xác định là một chuỗi: $str="756300 không có"; Nếu chúng ta cố cộng thêm một giá trị nguyên là 3 vào biến $str, biến $str sẽ tự động tính với số nguyên 756300: $x=4+$str;//$x =756304 Nhưng bản thân giá trị của biến $str không thay đổi echo ($str); // In ra màn hình chuỗi "756300 không có" Chuyển kiểu chuỗi phải tuân theo 2 nguyên tắc sau: - Chỉ những chuỗi bắt đầ là một xâu các chữ số. Nếu chuỗi bắt đầu bằng một giá trị số hợp lệ, chuỗi này sẽ được xác định như giá trị của nó, trong trường hợp khác, nó sẽ trả về 0. VD: chuỗi "35 tuổi" sẽ được ước lượng là 35, nhưng chuỗi "tuổi 35" sẽ chỉ xác định giá trị 0. - Một chuỗi sẽ chỉ được xác định như là một giá trị kiểu double nếu giá trị kiểu double được miêu tả bao gồm toàn bộ chuỗi. Chuỗi "3.4", "-4.2" sẽ được ước lượng như giá trị thực 3.4 và -4.2. Nếu một ký tự không phải là ký tự kiểu số thực được đưa vào chuỗi, giá trị của chuỗi đó sẽ được ước lượng như là một số nguyên. Chuỗi "3.4 dollar" sẽ thành số nguyên 3. Trong việc cộng với chuỗi chuyển kiểu, PHP sẽ thực hiện "lừa kiểu" giữa 2 kiểu số. Nếu bạn thực hiện một phép toán số học giữa kiểu thực và kiểu nguyên, giá trị sẽ là số thực $a=1 //$ a là một số nguyên
  • 16. $b= 1.0 //$b là số thực $c=$a+$b //$c là kiểu số thực , = 2.0 $d = $c+"6th" //$d là kiểu số thực = 8.0 Ép kiểu dữ liệu Ép kiểu dữ liệu cho phép bạn thay đổi kiểu dữ liệu của biến $a=11.2// $a là kiểu thực $a=(int)$a// Bây giờ, $ a là kiểu nguyên, giá trị = 11 $a= (double) $a// Bây giờ $a lại trở về kiểu thực = 11.0 $b= (string)$a// $b là giá trị kiểu chuỗi ="11" Ngoài ra, chúng ta còn được phép ép kiểu (array) và (object) (integer) tương đương với (int); (fload) và (real) tương đương với (double) 6. Một số hàm tiện ích khác PHP có một số hàm hỗ trợ làm việc với các biến - Hàm gettype($ten_bien) xác định kiểu của biến. Nó sẽ trả về một trong các giá trị: "integer", "double", "string", "array", "object", "class", "unknown type" (Chúng ta sẽ tìm hiểu kỹ hơn vể mảng (array) và kiểu đối tượng (object) ở các bài sau. Ví dụ: echo(gettype($name)); - Hàm settype($ten_bien,"kieu_du_lieu") sẽ đặt kiểu dữ liệu cho biến $ten_bien. Kiểu dữ liệu được viết dưới dạng một chuỗi, và có thể có một trong các kiểu sau: "integer", "double", "string", "array", "object". Nếu kiểu dữ liệu không được đặt, giá trị false sẽ được trả về, còn nếu thành công, nó sẽ trả về giá trị true. VD: $a=7.5; //$a là kiểu thực settype($a,"integer"); // bây giờ nó là một số nguyên có giá trị 7 - Hàm isset($ten_bien) được sử dụng để xác định xem biến $ten_bien đã đặt một giá trị nào đó hay chưa. Nếu biến đó đã có giá trị, hàm trả về true. Trong truờng hợp ngược lại, hàm trả về giá trị false; - Hàm unset($ten_bien) được sử dụng để huỷ bỏ biến $ten_bien, giải phóng bộ nhớ bị chiếm dụng của biến đó Các câu lệnh gán và rẽ nhánh trong PHP « 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.
  • 17. Ví dụ: Hãy tưởng tượng bạn đang ... nhậu Bước 0: chưa có ai say rượu Bước 1: Kêu chủ quán cho một chai "cuốc lủi" (tạm thời là lệnh gán) Bước 2: Khi còn chưa hết chai thì nhày sang bước 3: Bước 3: Mỗi thằng một chén, trăm phần trăm Bước 4: Nếu thằng nào xỉn, thì loại nó ra khỏi trận chiến (lệnh rẽ nhánh) Bước 5: Nếu tất cả đều xỉn: tàn cuộc (lệnh rẽ nhánh), còn nếu không thì tiếp tục Bước 6: Nếu hết một chai thì nhảy về bước 1 (Lệnh lặp) OK, đến giờ thì chắc bạn đã hiểu qua một chút. Bây giờ chúng ta sẽ ứng dụng chúng vào PHP. Phần về các câu lệnh cơ bản trong PHP được chia làm 2 bài là Các câu lệnh rẽ nhánh và các câu lệnh lặp. Bài này tập trung vào việc xử lý câu lệnh gán và rẽ nhánh. 1. Lệnh gán Lệnh này đã được học ở bài trước: Cú pháp: $ten_bien = gia_tri; Ví dụ: $ngay_sinh="1/4/1980"; $que_quan="Thanh Hoa"; $luong=300000; 2. Các câu lệnh rẽ nhánh Trong PHP có 2 dạng rẽ nhánh: rẽ hai nhánh (if) và rẽ nhiều nhánh. Lệnh rẽ nhánh là một trong những câu lệnh quan trọng nhất của tất cả các ngôn ngữ lập trình. Nó cho phép bạn thực thi một đoạn mã khi mà điều kiện chỉ định là đúng. Trong PHP, lệnh rẽ nhánh có dạng sau: if (điều kiện) { công việc cần làm } Ví dụ: if ($name="Sinh") { echo ("Good morning, my boss"); } Nếu khối câu lệnh cần làm chỉ bao gồm duy nhất một dòng lệnh, ta có thể bỏ cặp dấu {} : if ($name="Sinh") echo ("Good morning, my boss"); Nhưng nếu nhiều hơn một dòng lệnh, ta phải đưa chúng vào cặp dấu ngoặc {}: if ($name=="Sinh") { echo ("Good morning, my boss"); echo ("Have a romantic day!");
  • 18. } Đoạn lệnh trên sẽ kiểm tra nếu điều kiện biến $name = "Sinh" thì nó sẽ hiển thị lời chào. Còn nếu không thì nó không làm gì cả! Điều kiện đặt vào có thể là đúng, có thể là sai, có thể là tổng hợp của nhiều điều kiện. Hãy xem ví dụ sau: if ("false" ) echo ("Khong co gi ca"); if (($name=="sinh") && ($pass=="test")) echo ($name. "đã nhập đúng password"); Đoạn lệnh trên có thể viết tương đương với: if ($name=="sinh") { if ($pass=="test") echo ($name. "đã nhập đúng password"); } Như bạn thấy ở trên, trong một câu lệnh, chúng ta có thể chèn nhiều đoạn lệnh khác, người ta gọi đó là cấu trúc khối, tức là trong một khối lệnh, có thể có chứa nhiều khối lệnh con khác. Nếu bạn phải đọc mã nguồn của người khác, hi vọng bạn không bị hoa mắt vì hàng chục khối lệnh chen chúc vào nhau như vậy. Chúng ta có thể sử dụng các toán tử &&, || hay xor để kết nối các điều kiện với nhau như bạn thấy ở trên Câu lệnh rẽ nhánh đầy đủ: Nếu điều kiện kiểm tra trả về false (sai), PHP cho phép chúng ta chỉ định thực thi một khối mã lệnh khác bằng từ khoá else Ví dụ: if (($name=="sinh") && ($pass=="test")) { echo ("Good day, ".$name); } else { echo {"Sai mat khau!") } Chú ý đến một ngoại lệ sau: Trước từ khoá else không bao giờ có dấu chấm phẩy (. Lệnh rẽ nhiều nhánh: Với câu lệnh if, PHP cho phép chúng ta rẽ nhiều nhánh thông qua từ khoá elseif: if (dieu_kien1) { doan_lenh_1; } elseif (dieu_kien_2)
  • 19. { doan_lenh_2 } elseif (dieu_kien_3) } // bao nhiêu từ khoá elseif cũng được else { doan_lenh_n } Ví dụ: if ($thu==2) { echo ("Chao co, van, su, ly"); } elseif ($thu==3) { echo (" Hoa, Sinh, Dia, GDCD"); } elseif ($thu==4) { echo ("KTCN, Van, Toan, Tieng Anh"); } elseif ($thu==5) { echo (" Hoa, Toan, Van, Tin"); } elseif ($thu==6) { echo ("Toan, Van, Anh, Sinh hoat"); } else { echo ("Duoc di choi"); } Trong ví dụ trên, chúng ta đã lặp đi lặp lại thao tác kiểm tra giá trị của biến $thu, mặc dù nó không thay đổi qua các dòng. Để khắc phục sự dài dòng này, PHP cho phép ta sử dụng câu lệnh switch. Câu lệnh này sẽ được sử dụng để kiểm tra khi muốn xem xét qua nhiều giá trị của một biến: switch ($bien){ Case gia_tri 1: doan_lenh_1; Case gia_tri 2: doan_lenh_2; Case gia_tri n: doan_lenh_n; default: doan_lenh_khac; }
  • 20. Ví dụ: switch ($thu){ case 2: 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;
  • 21. while ($i<=5) { $tong=$tong+$i; $i+=1; } ?> Ví dụ 2: Đoạn mã sau sẽ hiển thị trên trình duyệt 3 ô textbox (Với điều kiện bạn phải save nó dưới một file *.php : <HTML> <TABLE> <BODY> <?php $i=1; while ($i<=3) { ?> <TR><TD> <INPUT type="text"> </TD></TR> <?php $i+=1; } ?> </table> </body> </html> b. Vòng lặp do...while Vòng lặp này giống như vòng lặp while, nhưng thay vì kiểm tra điều kiện vào lúc đầu của đoạn lệnh cần lặp, thì nó lại kiểm tra giá trị điều kiện vào cuối vòng lặp. Điều này có nghĩa là nó luôn luôn thực hiện đoạn lệnh cần lặp ít nhất một lần. Cấu trúc của nó như sau: do { Đoạn (khối) câu lệnh cần lặp } while (điều kiện); Ví dụ: <HTML> <TABLE> <BODY> <?php $i=1; do { ?> <TR><TD> <INPUT type="text"> </TD></TR> <?php $i+=1; }while ($i<=3);
  • 22. ?> </table> </body> </html> Để xác định lại sự khác nhau của 2 câu lệnh trên, đơn giản bạn chỉ việc thay điều kiện $i<=3 thành $i<1, bạn sẽ thấy hai kết quả khác nhau liền . Phần này dành cho bạn tự ngồi nghĩ. OK??? Quên mất, lúc nãy tôi đề cập đến lệnh break, nhưng chưa cho ví dụ, bây giờ chúng ta hãy xem xét ví dụ sau: Các bạn biết rằng giai thừa là một con số lớn kinh khủng, và chương trình của chúng ta sẽ tính toán n giai thừa, với số n được gửi đến theo địa chỉ url: http://dia_chi_trang_web_cua_ban/giaithua.php?n=xx (ở đó x là một số do người dùng tự nhập) Do giai thừa là một con số cực kỳ lớn, nên chúng ta chỉ cho phép người dùng tính đến tối đa là 8 giai thừa chẳng hạn. Nếu họ nhập lớn hơn 8 thì sao? Hãy xem đây: <HTML> <?php // Ghi lai voi ten file la giaithua.php $giaithua=1; $i=1; while ( $i<=$n) { $giaithua*=$i; $i+=1; if ($i>8 ) { echo ("Chi tinh den 8! <BR>"); break; } } echo ("Ket qua la: ".$giaithua); ?> </HTML> Đoạn mã trên chỉ cho phép tính đến 8 giai thừa, nếu người dùng nhập một con số lớn hơn 8 thì máy sẽ hiển thị 8 giai thừa, còn nếu nhỏ hơn thì vẫn chạy tốt. c) Vòng lặp for. Vòng lặp for, với ý nghĩa đầu tiên là lặp với số lần định trước, có cấu trúc như sau: for ( $biến = giá_trị_đầu; $biến < (hay <=) giá_trị_kết_thúc; tăng_biến_đếm) { // Khối câu lệnh } Biểu thức $biến=giá_trị_đầu, đảm bảo biến được gán một giá trị khởi đầu (1) Biểu thức $biến< (hay <=) giá_trị_kết_thúc, sẽ xác định xem biến đã đạt đến giá trị kết thúc (tức là điều kiện lặp không còn đúng nữa) chưa (2) Biểu thức tính toán tăng_biến_đếm đảm bảo để sau một số lần lặp nào đó thì biểu thức xác định điều kiện (2) sẽ
  • 23. dẫn đến kết quả sai (để thoát khỏi vòng lặp). Ví dụ: for ( $i = 1; $i <10; ++$i) { echo ("Giá trị của biến $i là: ".$i); } Một biến dạng khác của vòng lặp for, gần giống như lệnh rẽ nhánh if và while: for (bieu_thuc_1; bieu_thuc_2; bieu_thuc_3): // Khối câu lệnh endfor; Ví dụ: <?php for ($i=1; $i<=10;++$i) ?> <TR><TD> <INPUT type="text"> </TD></TR> <?php endfor ?> OK, Như vậy các bạn đã học qua các lệnh cơ bản nhất của php, và cũng là các lệnh cơ bản của tất cả các ngôn ngữ lập trình (gán, rẽ nhánh và lặp). Sau này nếu phải triển khai trên các ngôn ngữ lập trình khác, cách viết các lệnh này có thể khác nhau, nhưng bản chất của chúng thì mãi mãi không bao giờ thay đổi. 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:
  • 24. $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: <? // 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>
  • 25. <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 $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ủ đó.
  • 26. Trong Cookie có một số thông số sau: - Địa chỉ URL mà trình duyệt sẽ gửi cookie tới - Thời gian hết hạn của cookie - Các cặp biến:giá trị được lưu trữ liên tục Người ta thường dùng cookies để lưu trữ các thông tin có liên quan đến nhiều "phiên" làm việc khác nhau. Vi giao thức HTTP là giao thức không lưu trạng thái (Mỗi khi xử lý xong một yêu cầu từ máy khách là nó phủi tay tự ngắt kết nối luôn và chẳng thèm quan tâm đến máy khách làm gì ), nên cookies được sinh ra để làm nhiệm vụ lưu trữ một số biến trạng thái để khắc phục nhược điểm này. Khác với dữ liệu gửi từ form (Post hay Get) thì cookies sẽ được trình duyệt tự động gửi đi theo mỗi lần truy cập lên máy chủ. Trong quá trình làm việc, cookie có thể bị thay đổi giá trị. Cookie sẽ bị vô hiệu hoá nếu cửa sổ trình duyệt điều khiển cookie đóng lại và cookie hết thời gian có hiệu lực. Theo mặc định, thời gian "sống" của cookies là tồn tại cho đến khi cửa sổ trình duyệt sử dụng cookies bị đóng. Tuy nhiên người ta có thể thiết lập tham số thời gian để cookie có thể sống lâu hơn (6 tháng chẳng hạn). Ví dụ như chế độ Remember ID & Password của 1 số trang web. Cách ghi thông tin vào cookie và gửi xuống trình duyệt Trong PHP, để gửi cookie xuống trình duyệt, ta có thể sử dụng hàm setcookie: setcookie ( string name [, string value [, int expire [, string path [, string domain [, int secure]]]]]) Trong đó: - string name: Chuỗi mang tên của cookie - string value: Chuỗi mang giá trị của cookie tương ứng với tên đã cho - int expire: Thời gian hết hạn của cookie - string path: Đường dẫn của cookie (đến 1 thư mục nào đó trên máy chủ. Tham số này cho biết cookie sẽ chỉ được truyền đi nếu như trang web mà trình duyệt yêu cầu nằm trên thư mục đó, thay vì lúc nào cũng phải gửi đi tới bất kỳ khu vực nào). - string domain: cookie này sẽ được gửi tới domain nào? - int secure: Chế độ bảo mật. Các tham số trong cặp dấu ngoặc vuông là tuỳ chọn Ví dụ: setcookie ("ten_truy_cap","lan gio vo tinh"); Chú ý: Hàm setcookie phải được gọi trước khi bạn gửi bất kỳ một nội dung nào xuống trình duyệt: VD: Cách dùng đúng: // 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.
  • 27. 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"] 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.
  • 28. $_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 » 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
  • 29. đượ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 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
  • 30. 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ố 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
  • 31. =>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 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
  • 32. 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() ->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.
  • 33. 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. 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,
  • 34. - 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": 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: <?
  • 35. function viet_o ($noidung,$dinhdang) { $td_tmp="<td " . $dinhdang . ">" . $noidung . "</td>"; return $td_tmp; } function viet_cot ($noidung,$dinhdang) { $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
  • 36. 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. Để 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 »