Nếu nhờ một lập trình viên có kinh nghi ệm sửa chương trình của bạn, họ thường thích viết lại toàn bộ Đoạn mã không đọc được sẽ không mở rộng được. An An An[r]
(1)………… o0o…………
Giáo trình
(2)PHP programming dynamic web for ewreybody
21 Fatal errors in programming with PHP – Collect from writting of Sterling Hughes
1
ài viết dành cho lập trình viên PHP quan tâm đến việc tránh lỗi thường gặp sử dụng PHP Người đọc phải biết cú pháp PHP, nên biết công dụng hàm PHP
Một điểm mạnh PHP vô tình trở thành điểm yếu nó: ttt
t
ííí
í
nh nh nh
nh
d d d
d
ễ ễ ễ
ễ
s s s
s
ử ử ử
ử
d d d
d
ụ ụ ụ
ụ
ng ng ng
ng
Nhi ếu người chọn PHP tính dễ sử dụng, khơng nhận rằng: sử dụng đúngPHPPHPPHP
PHP
c c c
c
ò ò ò
ò
n n n
n
kh kh kh
kh
ó ó ó
ó
h h h
h
ơ ơ ơ
ơ
n n n
n
c c c
c
á á á
á
c c c
c
ng ng ng
ng
ô ô ô
ô
n n n
n
ng ng ng
ng
ữ ữ ữ
ữ
kh kh kh
kh
á á á
á
c c c
c
Trong loạt nêu 21 lỗi, từ sai lầm giáo khoa (làm script trở nên chậm kh ó quản lí) đến sai lầm chết người - xem nguồn gốc sai lầm sơ đẳng
PHẦN 1: LỖI GIÁO KHOA
21. 21. 21.
21.
S S S
S
ử ử ử
ử
d d d
d
ụ ụ ụ
ụ
ng ng ng
ng
printf() printf() printf()
printf()
kh kh kh
kh
ô ô ô
ô
ng ng ng
ng
th th th
th
ííí
í
ch ch ch
ch
h h h
h
ợ ợ ợ
ợ
p p p
p
Hàm printf () dùng để in li ệu có định dạng
Nó dùng, thí dụ, bạn in số kiểu double với số lẻ, tình bạn mu ốn thay đổi định dạng trước in
Thí dụ minh hoạ cách dùng printf (): định dạng số Pi với độ xác theo ý mu ốn
M M M
M
ã ã ã
ã
lll
l
ệ ệ ệ
ệ
nh nh nh
nh
(PHP)
<?
/* The three faces of Π */
printf ("Pi is: %.2f\n<br>\n", M_PI);
printf ("Pi is also: %.3f\n<br>\n", M_PI);
printf ("Pi is also: %.4f\n<br>\n", M_PI);
?>
Ch Ch Ch
Ch
ú ú ú
ú
ý ý ý
ý
.
Tôi gặp người sợ dùng printf (), thay vào lại dùng hàm định dạng tự viết, dài đến 30- 40 dịng, câu printf () làm thứ mong mu ốn
Nhi ếu lập trình viên dùng sai printf (): in biến, giá trị trả hàm thỉnh thoảng, liệu thông thường Thường xảy hai tình huống:
Câu lệnh print() thích hợp
Hi ển thị giá trị trả hàm
1. 1. 1.
1.
Khi Khi Khi
Khi
n n n
n
à à à
à
o o o
o
print() print() print()
print()
th th th
th
ííí
í
ch ch ch
ch
h h h
h
ợ ợ ợ
ợ
p p p
p
h h h
h
ơ ơ ơ
ơ
n? n? n?
n?
Các lập trình viên thường sử dụng printf () print() đủ Xét thí dụ sau:
<?
$name = 'Nguyen Anh Khoa';
$nghenghiep = 'Sinh vien';
$diachi = 'Phong 204.B5 – KTX – DHSP Dong Thap';
$email = 'khoa_computer2004@yahoo.com';
printf ("Ten cua tui la: %s\n<br>\n Hien dang la: %s, %s\n<br>\n
Lien he voi toi qua Email: %s\n<br>\n",
$name, $nghenghiep, $diachi, $email);
?>
Hàm print()print()print()
print()
có thể dùng thay cho printf () sau:
(3)PHP programming dynamic web for ewreybody
21 Fatal errors in programming with PHP – Collect from writting of Sterling Hughes
2
print print print
"Ten cua tui la: $name\n\n\n
\n
<br>\n\n\n
\n
Hien dang la: $nghenghiep, $diachi\n\n\n
\n
<br>\n\n\n
\n
Lien he voi toi qua Email: $email\n\n\n
\n
<br>\n\n\n
\n
";;;
;
Khi không cần định dạng sử liệu, dùng print() thay cho printf () có lợi ích sau:
ThiThiThi
Thi
h h h
h
à à à
à
nh nh nh
nh
nhanh nhanh nhanh
nhanh
h h h
h
ơ ơ ơ
ơ
n: n: n:
n:
hàm printf() định dạng liệu bạn trước hiển thị, nó chậm print() echo()
MMM
M
ã ã ã
ã
s s s
s
á á á
á
ng ng ng
ng
s s s
s
ủ ủ ủ
ủ
a: a: a:
a:
hãy xem, dùng hàm printf() làm cho người đọc bị lẫn lộn (tất nhiên trừ họ có tảng C) Nó địi hỏi ki ến thức cú pháp printf() (thí dụ, %s thay cho chuỗi %d số) kiểu biến
2. 2. 2.
2.
D D D
D
ù ù ù
ù
ng ng ng
ng
printf() printf() printf()
printf()
để để để
để
xu xu xu
xu
ấ ấ ấ
ấ
ttt
t
d d d
d
ữ ữ ữ
ữ
li li li
li
ệ ệ ệ
ệ
u u u
u
tr tr tr
tr
ả ả ả
ả
v v v
v
ề ề ề
ề
ttt
t
ừ ừ ừ
ừ
g g g
g
ọ ọ ọ
ọ
iii
i
h h h
h
à à à
à
m m m
m
Một lỗi thường gặp khác dùn printf () để xu ất liệu trả từ gọi hàm, thí dụ hàm đếm đây:
Khi xuất giá trị hàm trả về, toán tử nên dùng để nối print(), đây:
Dùng toán tử nhanh việc dùng printf ()
20. 20. 20.
20.
Á Á Á
Á
p p p
p
d d d
d
ụ ụ ụ
ụ
ng ng ng
ng
sai sai sai
sai
ng ng ng
ng
ữ ữ ữ
ữ
ngh ngh ngh
ngh
ĩĩĩ
ĩ
a a a
a
(semantics) (semantics) (semantics)
(semantics)
Nhi ều lập trình viên sử dụng PHP mà kh ơng biết đến điểm tinh tế ngôn ngữ Một điểm kh ác cú pháp (syntax) ngữ nghĩa (semantics)
CCC
C
ú ú ú
ú
ph ph ph
ph
á á á
á
p: p: p:
p:
những quy tắc định nghĩa phần tử Thí dụ: dấu $ để trước dùng định nghĩa biến, dùng dấu () tham số định nghĩa hàm
NgNgNg
Ng
ữ ữ ữ
ữ
ngh ngh ngh
ngh
ĩĩĩ
ĩ
a: a: a:
a:
những quy tắc áp dụng cú pháp Thí dụ: hàm có biến định nghĩa cú pháp nó, hai biến có kiểu string - ngữ nghĩa.
Trong ngơn ngữ lỏng lẻo PHP, bạn có nhi ều lựa chọn để viết lệnh Các biến không cần có kiểu xác định
Thí dụ sau mở tập tin in dịng:
Thí dụ tạo lỗi:
Warning: Warning: Warning:
Warning:
Supplied Supplied Supplied
Supplied
argument argument argument
argument
is is is
is
not not not
not
a a a
a
valid valid valid
valid
File-Handle File-Handle File-Handle
File-Handle
resource resource resource
resource
in in in
in
C:\Inetpub\wwwroot\tst.php C:\Inetpub\wwwroot\tst.php C:\Inetpub\wwwroot\tst.php
C:\Inetpub\wwwroot\tst.php
on on on
on
line line line
line
4. 4. 4.
4.
<?
printf printf printf
printf
("%d occurrences of %s found.",
count($truyvan), $search_term);
?>
<?
print print print
count($truyvan)
"occurrences of $search_term found.";
?>
<?
$fp = @fopen ('vanban.txt', 'r')
or die ('Khong the mo file vanban.txt');
while ($line = @fgets ("$fp", 1024)) // Loi {
print $line;
}
@fclose ("$fp") // Loi
or die ('Khong the dong vanban.txt');
(4)PHP programming dynamic web for ewreybody
21 Fatal errors in programming with PHP – Collect from writting of Sterling Hughes
3
Đó biến $fp đặt dấu nháy kép nên chuyển thành chuỗi Thế mà hàm fopen() nhận định danh tài nguy ên (resource identif ier) tham số đầu nó, không nhận chuỗi Để giải quy ết vấn đề, bạn đơn giản bỏ dấu nháy kép
1. 1. 1.
1.
C C C
C
ó ó ó
ó
th th th
th
ể ể ể
ể
tr tr tr
tr
á á á
á
nh nh nh
nh
vi vi vi
vi
ệ ệ ệ
ệ
c c c
c
á á á
á
p p p
p
d d d
d
ụ ụ ụ
ụ
ng ng ng
ng
sai sai sai
sai
ng ng ng
ng
ữ ữ ữ
ữ
ngh ngh ngh
ngh
ĩĩĩ
ĩ
a? a? a?
a?
Our example above generated an error statement But PHP enables you to customize your scripts to fit a unique scenario or output requirement So, it is at least theoretically possible to "get away" with misapplying a semantic Tôi không hiểu, dịch khơng?
Thí dụ tạo thông báo lỗi Nhưng PHP cho phép bạn tuỳ biến script để thích hợp với kịch khác thường với địi hỏi thơng tin Do đó, lí thuyết, bạn có kh ả tránh việc áp dụng sai ngữ nghĩa
Vậy, bạn cần biết hậu có (possible outcomes) bạn quy ết định học ngữ nghĩa Áp dụng sai dẫn đến lỗi tinh vi bạn kh ông ý
Nếu bạn mu ốn tuỳ biến script, bạn cần hiểu chủ đề sau:
KiKiKi
Ki
ể ể ể
ể
u: u: u:
u:
trong PHP, biến có kiểu xác định thời điểm xác định, cho dù bạn tự chuy ển đổi ki ểu biến Nói cách kh ác, kh ơng có biến nào lại khơng kèm theo tính chất kiểu PHP có kiểu bản: boolean, resource, integer, doubl e, string, array object.
TTT
T
ầ ầ ầ
ầ
m m m
m
v v v
v
ự ự ự
ự
c: c: c:
c:
trong PHP, biến có tầm vực riêng Tầm vực biến quy định biến có thể truy cập từ đâu, tồn thời gian Hiểu sai khái niệm bản về "tầm vực" dẫn đến lỗi sai tinh tế lỗi lớn.
php.ini:php.ini:php.ini:
php.ini:
khi viết script chạy nhiều môi trường kh ác nhau, cần biết rằng không phải cấu hình PHP Do đó, cần thiết lệnh kiểm tra để đảm bảo script bạn chạy tốt cấu hình PHP người khác.
19. 19. 19.
19.
Thi Thi Thi
Thi
ế ế ế
ế
u u u
u
ghi ghi ghi
ghi
ch ch ch
ch
ú ú ú
ú
Theo ý tôi, mã ngu ồn thiếu ghi nguy ên lập trình ích kỉ Nó dẫn tới hiệu chỉnh sai lầm, hiểu sai ý nghĩa làm người đọc mệt mỏi Nói chung, lập trình ghi (inline documentation) người khẳng nhận điều tốt, tồn
Một vấn đề khác nhiều ghi Dù gặp, làm cho đoạn mã bị cắt vụn, gây khó theo dõi Dưới thí dụ:
<?
// Bat dau ma PHP
$age = 18; // Gan 18 den $age
$age++; // Tang $age len don vi // IN doan text thong bao:
print "You are now 19, which means you have been:";
print "\n<br>\n<br>\n";
// Vong lap for in tat ca tuoi truoc
for ($idx = 0; $idx < $age; $idx++) {
<?
$fp = @fopen ('vanban.txt', 'r')
or die (‘Khong the mo file tailieuphp.txt');
while ($line = @fgets ($fp, 1024)) {
print $line;
}
@fclose ($fp)
or die (Khong the dong file vanban.txt ');
(5)PHP programming dynamic web for ewreybody
21 Fatal errors in programming with PHP – Collect from writting of Sterling Hughes
4
// In tuoi ca nhan
print "$idx years old\n<br>\n"; } // Ket thuc ma PHP
?>
1. 1. 1.
1.
Bao Bao Bao
Bao
nhi nhi nhi
nhi
ê ê ê
ê
u u u
u
ghi ghi ghi
ghi
ch ch ch
ch
ú ú ú
ú
th th th
th
ììì
ì
đủ đủ đủ
đủ
? ? ?
?
Nhi ếu đến mức nào, điều tuỳ thuộc ngân sách bạn, vào sách công ty vào độ phức tạp chương trình Tuy nhi ên, có vài gợi ý cho bạn
Ln có mơ tả ngắn mục đích hàm trước định ngh ĩa hàm đó
Thêm ghi vào chỗ bị hack, chỗ tưởng sai nhưng lại chạy đúng
Nếu đoạn mã gây nhầm lẫn, thêm ghi mục đích đoạn Sau bạn thấy lợi ích nó
Dùng ki ểu ghi quán, /*/*/*
/*
*/ */ */
*/
hoặc là //////
//
(tr (tr (tr
(tr
á á á
á
nh nh nh
nh
d d d
d
ù ù ù
ù
ng ng ng
ng
#) #) #)
#)
Dưới thí dụ ghi tốt:
<?
// Random_Numbers.lib
// Generate different types of random numbers
mt_srand((double)microtime()*1000000);
// mixed random_element(array elements[, array weights]) // Extract a random element from elements Weights is // the relative probability that each element will be // selected
function random_element ($elements, $weights=array()) {
// There must be exactly the same amount of elements as // there are weights for this algorithm to work properly
if (count ($weights) == count ($elements)) {
foreach ($elements as $element) {
foreach ($weights as $idx) {
// Note: we don't use $idx, since we // don't want to override elements
$randomAr[] = $element;
} }
} else {
$randomAr = $elements;
}
$random_element = mt_rand (0, count ($randomAr)-1);
return $randomAr[$random_element];
}
?>
18. 18. 18.
18.
Nhi Nhi Nhi
Nhi
ề ề ề
ề
u u u
u
bi bi bi
bi
ế ế ế
ế
n, n, n,
n,
ttt
t
ố ố ố
ố
n n n
n
nhi nhi nhi
nhi
ề ề ề
ề
u u u
u
th th th
th
ờ ờ ờ
ờ
iii
i
gian gian gian
gian
(6)PHP programming dynamic web for ewreybody
21 Fatal errors in programming with PHP – Collect from writting of Sterling Hughes
26
PHẦN 3: LỖI CHẾT NGƯỜI
7. 7. 7. 7. Ch Ch Ch Ch é é é é p p p p v v v v à à à à d d d d á á á á n: n: n: n: kh kh kh kh ô ô ô ô ng ng ng ng ph ph ph ph ả ả ả ả iii i h h h h ướ ướ ướ ướ ng ng ng ng đ đ đ đ iii i ttt t ố ố ố ố ttt t
Tôi gặp nhiều tay lập trình vào nghề chép đoạn mã (thí dụ kiểm tra địa e-mail, gửi e-mail, lấy giá trị từ form để soạn e-mail) Họ thường dán chúng vào chương trình kết đống câu lệnh gửi form kh ông an toàn
Dù đoạn mã chạy điều kiện tối ưu, thường gặp lỗi kiểm tra "m ã tốt" Công việc chắp vá khkhkh
kh ô ơ ơ ơ ng ng ng ng
có ưu điểm sau:
MMM
M ở ở ở ở r r r r ộ ộ ộ ộ ng ng ng ng đượ đượ đượ đượ c: c: c: c:
đoạn mã trông mảnh riêng rẽ ráp vá vào Nếu nhờ một lập trình viên có kinh nghi ệm sửa chương trình bạn, họ thường thích viết lại tồn bộ Đoạn mã khơng đọc không mở rộng được.
AnAnAn
An to to to to à à à à n: n: n: n:
bạn chép mã người khác vào chương trình mà lại khơng hiểu rõ ràng đoạn mã Hãy tưởng tưởng xem Nếu đoạn mã có lỗi làm xố tồn đĩa bạn Hơn nữa, đoạn mã tính an tồn kh ơng giống hệ thống kh ác Cuối cùng, chương trình bạn kế thừa lỗi người khác.
Nhanh:Nhanh:Nhanh:
Nhanh:
khi cắt dán đoạn mã, kết thường chạy khơng nhanh, chúng khơng có tiến trình chung hợp lí (đây điều quan trọng viết chương trình nhanh) 1. 1. 1. 1. L L L L à à à à m m m m đú đú đú đú ng ng ng ng ph ph ph ph ươ ươ ươ ươ ng ng ng ng ph ph ph ph á á á á p: p: p: p: ttt t ììì ì m m m m hi hi hi hi ể ể ể ể u u u u tr tr tr tr ướ ướ ướ ướ c, c, c, c, sao sao sao sao ch ch ch ch é é é é p p p p sau sau sau sau
Nghi ên cứu mã người kh ác kĩ lưỡng trước chép Phân tích xem làm Chỉ đoạn mã đọc được, qn với logic chương trình bạn, khơng có lỗi, thì nên chép Tiến hành lúc giúp bạn chỉnh sửa phù hợp với phần cịn lại chương trình cách thoải mái
2. 2. 2. 2. C C C C á á á á c c c c th th th th ư ư ư ư vi vi vi vi ệ ệ ệ ệ n n n n r r r r ấ ấ ấ ấ ttt t ttt t ố ố ố ố ttt t
Chỉ dùng thư viện PHP từ ngu ồn tin cậy PEAR kho lớp PHP (PHP Classes Repository) Với gói API có sẵn, việc dùng hàm kh ơng thành vấn đề Thực ra, bạn tìm thư viện viết sẵn ngu ồn tin cậy, thường lựa chọn tốt để dùng cho chương trình (thay tự viết lấy)
6. 6. 6. 6. Kh Kh Kh Kh ô ô ô ô ng ng ng ng c c c c ó ó ó ó đườ đườ đườ đườ ng ng ng ng lll l ố ố ố ố iii i ( ( ( (
guidelines)))
) cho cho cho cho đồ đồ đồ đồ á á á á n n n n
(7)PHP programming dynamic web for ewreybody
21 Fatal errors in programming with PHP – Collect from writting of Sterling Hughes
27
1. 1. 1.
1.
M M M
M
ộ ộ ộ
ộ
ttt
t
th th th
th
ííí
í
d d d
d
ụ ụ ụ
ụ
m m m
m
ẫ ẫ ẫ
ẫ
u u u
u
v v v
v
ề ề ề
ề
đườ đườ đườ
đườ
ng ng ng
ng
lll
l
ố ố ố
ố
iii
i
5. 5. 5.
5.
Kh Kh Kh
Kh
ô ô ô
ô
ng ng ng
ng
xem xem xem
xem
x x x
x
é é é
é
ttt
t
lll
l
ạ ạ ạ
ạ
iii
i
m m m
m
ã ã ã
ã
4. 4. 4.
4.
V V V
V
á á á
á
lll
l
ỗ ỗ ỗ
ỗ
iii
i
khi khi khi
khi
thi thi thi
thi
ế ế ế
ế
ttt
t
k k k
k
ế ế ế
ế
3. 3. 3.
3.
Kh Kh Kh
Kh
ô ô ô
ô
ng ng ng
ng
quan quan quan
quan
ttt
t
â â â
â
m m m
m
đế đế đế
đế
n n n
n
ng ng ng
ng
ườ ườ ườ
ườ
iii
i
d d d
d
ù ù ù
ù
ng ng ng
ng
khi khi khi
khi
thi thi thi
thi
ế ế ế
ế
ttt
t
k k k
k
ế ế ế
ế
2. 2. 2.
2.
Kh Kh Kh
Kh
ô ô ô
ô
ng ng ng
ng
theo theo theo
theo
s s s
s
á á á
á
ttt
t
k k k
k
ế ế ế
ế
ho ho ho
ho
ạ ạ ạ
ạ
ch ch ch
ch
c c c
c
ủ ủ ủ
ủ
a a a
a
đồ đồ đồ
đồ
á á á
á
n n n
n
1. 1. 1.
1.
Ph Ph Ph
Ph
ííí
í
th th th
th
ờ ờ ờ
ờ
iii
i
gian gian gian