1. Trang chủ
  2. » Luận Văn - Báo Cáo

Giáo trình: Lập trình PHP

7 2 0

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Nội dung

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

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

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

Ngày đăng: 09/03/2021, 03:43

w