Một đoạn trích từ PHP & MySQL Novice to Ninja, 7th Edition, một hướng dẫn thực tế để tìm hiểu tất cả các công cụ, nguyên tắc và kỹ thuật cần thiết để tạo một ứng dụng web chất lượng, được cung cấp bên dưới. Bạn sẽ tìm hiểu các nguyên tắc cơ bản của PHP trong hướng dẫn thứ hai này trong loạt bài này, bao gồm các câu lệnh, biến, toán tử, nhận xét và cấu trúc điều khiển
- Sử dụng Docker để thiết lập môi trường phát triển PHP của bạn
- Hướng dẫn cho người mới bắt đầu về PHP
- Giới thiệu MySQL. Hướng dẫn cho người mới bắt đầu
- Sử dụng MySQL để hiển thị dữ liệu trên web. Một lời giới thiệu
Đã đến lúc tạo tập lệnh PHP đầu tiên của bạn khi máy chủ của bạn đang hoạt động. PHP là ngôn ngữ phía máy chủ. Đặc biệt nếu bạn chỉ từng tạo trang web bằng các ngôn ngữ phía máy khách như HTML, CSS và JavaScript, khái niệm này có thể hơi khó hiểu
Sự khác biệt chính giữa JavaScript và PHP là giai đoạn mã được thực thi. Ngôn ngữ phía máy chủ tương tự như JavaScript ở chỗ nó cho phép bạn nhúng nội dung được tạo động vào mã HTML của trang web, cho phép bạn kiểm soát nhiều hơn những gì xuất hiện trong cửa sổ trình duyệt so với chỉ HTML có thể.
Ngược lại, các ngôn ngữ phía máy chủ như PHP được chạy bởi máy chủ web trước khi trang web được gửi tới trình duyệt, trong khi các ngôn ngữ phía máy khách như JavaScript được trình duyệt web đọc và thực thi sau trang web [bao gồm cả các chương trình nhúng và tất cả] . Các ngôn ngữ phía máy chủ cho phép bạn tạo các trang tùy chỉnh ngay lập tức trước khi chúng được gửi tới trình duyệt, trong khi các ngôn ngữ phía máy khách chỉ cho phép bạn kiểm soát cách một trang hoạt động sau khi nó được trình duyệt hiển thị
Khi một trình duyệt nhận được một trang, tất cả những gì nó thấy là mã HTML tiêu chuẩn vì mã PHP được nhúng trong trang đã được thực thi bởi máy chủ web và đã thay thế nó. Bởi vì công việc của nó được thực hiện trên máy chủ, PHP được gọi là "ngôn ngữ phía máy chủ". "
Ấn bản đầu tiên của cuốn sách này đã được xuất bản vào những ngày đầu của Web. — Trước khi các công nghệ như Ajax ra đời, JavaScript là ngôn ngữ kịch bản phía máy khách được sử dụng chủ yếu trong các trình duyệt. Mặc dù những cách sử dụng JavaScript mới này mang lại những khả năng thú vị, nhưng PHP vẫn có chỗ đứng, vì cuốn sách này nhằm mục đích chỉ ra. gần đây hơn, JavaScript đã được sử dụng cả trong trình duyệt và trên máy chủ để tạo các ứng dụng dựa trên cơ sở dữ liệu
Giống như hầu hết các thẻ HTML, PHP có thẻ bắt đầu và thẻ kết thúc và được sử dụng để viết mã. Mọi thứ chứa trong các thẻ PHP này được hiểu là mã PHP và được thực thi trên máy chủ [lần lượt là ______01 và
echo 'rand[1, 10]';
2]Khi ai đó kết nối với máy chủ và yêu cầu nó tải một tệp có phần mở rộng
echo 'rand[1, 10]';
3, thì máy chủ sẽ thực thi tệp đó dưới dạng tập lệnh PHP. Máy chủ web sẽ không chạy bất kỳ mã PHP nào nếu bạn bao gồm các thẻ PHP trong một tệp có phần mở rộng khác với echo 'rand[1, 10]';
3; Hãy kiểm tra một tập lệnh PHP
Thí dụ. PHP-RandomNumber
_16Lưu mã này dưới dạng
echo 'rand[1, 10]';
7 trong thư mục echo 'rand[1, 10]';
8 và chuyển đến echo 'rand[1, 10]';
9 để chạy mãChỉ dòng giữa
echo 'rand[1, 10]';
1 và echo 'rand[1, 10]';
2 chứa mã PHP; . Trước khi gửi trang web đến trình duyệt yêu cầu, máy chủ web được yêu cầu diễn giải mọi thứ giữa hai dấu phân cách này và chuyển đổi nó thành mã HTML thông thường. echo 'rand[1, 10]';
1 đánh dấu sự bắt đầu của tập lệnh PHP được nhúng và echo 'rand[1, 10]';
2 đánh dấu sự kết thúc của nó. Bạn có thể thấy rằng trình duyệt được hiển thị giống như thế này nếu bạn nhấp chuột phải vào bên trong trình duyệt và chọn Xem nguồn [nhãn có thể khác nhau tùy thuộc vào trình duyệt bạn đang sử dụng]echo 'rand[1, 10]';
4HTML này được tạo động trên máy chủ trước khi được gửi tới trình duyệt;
Mã PHP đã được sử dụng để tạo một số ngẫu nhiên, nhưng tất cả dấu vết của mã PHP đã biến mất khi xem mã nguồn trong trình duyệt. Hãy thử chạy tập lệnh một vài lần và quan sát số thay đổi như thế nào. Ví dụ này minh họa một số lợi ích của kịch bản phía máy chủ bằng cách thay thế nó bằng đầu ra tập lệnh trông giống hệt như HTML thông thường
- Bảo vệ. Trong ví dụ trước, chúng tôi đã thêm một số được tạo ngẫu nhiên từ máy chủ web vào trang web. Số này sẽ được tạo trong trình duyệt nếu chúng tôi chèn nó bằng JavaScript và ai đó có thể đã thay đổi mã để chèn một số khác
- Không cần lo lắng về việc liệu các tính năng ngôn ngữ bạn đang sử dụng có được trình duyệt của khách truy cập hỗ trợ hay không vì các tập lệnh PHP chỉ được máy chủ web diễn giải
- truy cập vào các tài nguyên phía máy chủ, vì mã của máy chủ hoàn toàn linh hoạt; HTML kết quả có thể là đầu ra của một phép tính, chẳng hạn như thêm nội dung của giỏ hàng của người dùng hoặc nó có thể được tạo từ tệp Excel hoặc cơ sở dữ liệu
- JavaScript có thể làm chậm đáng kể việc hiển thị trang web [đặc biệt là trên thiết bị di động], làm tăng lượng khách hàng. Với mã phía máy chủ, gánh nặng này được chuyển đến máy chủ web, mà bạn có thể tạo mạnh mẽ như ứng dụng của mình yêu cầu [và ví của bạn có thể đáp ứng được], vì trình duyệt phải tải xuống và chạy tập lệnh trước khi có thể hiển thị trang web
- Khi viết mã để trình duyệt thực thi, trình duyệt phải có khả năng thực thi mã được cung cấp cho nó. Bạn phải sử dụng một trong những ngôn ngữ này để tạo mã chạy trong trình duyệt hiện đại, bao gồm HTML, CSS và JavaScript. Bạn có thể chọn từ nhiều ngôn ngữ để chạy mã trên máy chủ tạo HTML, với PHP là một trong số đó
Cú pháp và câu lệnh cơ bản
Bất kỳ ai có kiến thức về JavaScript, C, C++, C#, Objective-C, Java, Perl hoặc bất kỳ ngôn ngữ có nguồn gốc C nào khác sẽ thấy cú pháp PHP rất quen thuộc, nhưng nếu những ngôn ngữ này không quen thuộc với bạn hoặc nếu bạn
Một tập lệnh PHP được tạo thành từ một số lệnh hoặc câu lệnh, mỗi lệnh là một lệnh mà máy chủ web phải thực hiện trước khi chuyển sang lệnh tiếp theo. Tương tự như các ngôn ngữ đã đề cập trước đó, các câu lệnh PHP luôn được kết thúc bằng dấu chấm phẩy [
echo 'rand[1, 10]';
404]Tuyên bố này là điển hình cho PHP
echo 'rand[1, 10]';
6Đây là một câu lệnh
echo 'rand[1, 10]';
405, chèn văn bản được cung cấp vào mã HTML của trang tại vị trí đặt tập lệnh PHP để tạo nội dung [thường là mã HTML] để gửi tới trình duyệtTrong trường hợp này, chúng tôi đã yêu cầu xuất một chuỗi văn bản. Điều quan trọng cần lưu ý là chuỗi văn bản chứa các thẻ HTML [
echo 'rand[1, 10]';
408 và echo 'rand[1, 10]';
409], điều này có thể chấp nhận đượcĐây là mã sẽ được tạo nếu chúng ta sử dụng câu lệnh này để tạo một trang web đầy đủ
Thí dụ. PHP-Echo
echo 'rand[1, 10]';
2Trình duyệt của bạn sẽ nhận được mã HTML này nếu bạn tải tệp này lên máy chủ web của mình và yêu cầu nó từ đó
echo 'rand[1, 10]';
3Ví dụ về
echo 'rand[1, 10]';
7 trước đó có câu lệnh echo 'rand[1, 10]';
405 phức tạp hơn một chútecho 'rand[1, 10]';
6PHP cố gắng đọc bất kỳ thứ gì tồn tại bên ngoài dấu ngoặc kép như một hướng dẫn mà nó phải tuân theo. Bạn sẽ nhận thấy rằng, trong ví dụ đầu tiên, PHP được cung cấp một số văn bản để in trực tiếp, trong khi ở ví dụ thứ hai, PHP được cung cấp hướng dẫn để thực hiện theo. PHP không diễn giải các chuỗi dưới dạng hướng dẫn phải tuân theo; . Bạn có thể làm mọi việc với chúng, chẳng hạn như gửi chúng tới trình duyệt, nhưng PHP không xử lý chuỗi này khác với chuỗi khác;
Kết quả là đoạn mã bên dưới sẽ gửi lệnh
echo 'rand[1, 10]';
405 chuỗi echo 'rand[1, 10]';
407echo 'rand[1, 10]';
6PHP sẽ nhận ra
echo 'rand[1, 10]';
414 đầu tiên là phần đầu của chuỗi và tìm echo 'rand[1, 10]';
414 tiếp theo và sử dụng nó làm phần cuối của chuỗi vì một chuỗi được biểu thị bằng dấu ngoặc kép bắt đầu và dấu ngoặc kép kết thúcPhần sau chứa mã không hợp lệ và được coi là một chuỗi lệnh để chạy
echo 'rand[1, 10]';
2Do các dấu ngoặc kép bị xóa, PHP sẽ cố gắng thực thi các lệnh
echo 'rand[1, 10]';
416, echo 'rand[1, 10]';
417, echo 'rand[1, 10]';
418, v.v., không lệnh nào trong số đó là lệnh hợp lệ trong PHP, vì vậy đoạn mã trên sẽ dẫn đến lỗi. Hãy nhớ gửi kèm theo bất cứ điều gì bạn muốn được coi là văn bản trong dấu ngoặc képMặt khác, đoạn mã sau sẽ thực thi một lệnh hợp pháp—"hàm"
echo 'rand[1, 10]';
419 tích hợp sẵn—để tạo một số ngẫu nhiên, sau đó chuyển kết quả cho lệnh echoecho 'rand[1, 10]';
6Chức năng là một loại lệnh đặc biệt thực hiện một nhiệm vụ cụ thể; . Hàm
echo 'rand[1, 10]';
419 sẽ tạo ra một số ngẫu nhiên trong trường hợp này, nhưng các hàm khác nhau phục vụ các mục đích khác nhauPHP có nhiều hàm dựng sẵn cho phép bạn thực hiện tất cả mọi thứ, chẳng hạn như gửi email và làm việc với dữ liệu được lưu trữ trong nhiều loại cơ sở dữ liệu khác nhau, vì vậy bạn có thể nhanh chóng biết liệu một hàm nào đó có phải là hàm hay không vì theo sau nó là dấu ngoặc đơn
Hàm
echo 'rand[1, 10]';
419 sẽ không chạy trong đoạn mã sau vì PHP sẽ không cố chạy bất kỳ thứ gì có trong một chuỗi_10Điều quan trọng là phải hiểu sự khác biệt giữa một chuỗi và mã bởi vì
echo 'rand[1, 10]';
422 sẽ được PHP hiểu là một chuỗi và sẽ dẫn đến việc trình duyệt nhận được văn bản echo 'rand[1, 10]';
423, đây có thể không phải là điều bạn muốn làm. Mọi thứ bên trong dấu ngoặc kép là một chuỗi và là dữ liệu mà PHP sẽ làm việc với. PHP sẽ xem bất kỳ văn bản nào bên ngoài dấu ngoặc kép dưới dạng một loạt lệnh mà nó phải tuân theoCác chuỗi có thể chứa bất kỳ ký tự nào theo bất kỳ thứ tự nào vì PHP không cố gắng hiểu chúng. Mã, về cơ bản là một loạt các hướng dẫn, phải tuân theo một cấu trúc nghiêm ngặt để máy tính hiểu được mã đó
Điều quan trọng cần lưu ý là việc sử dụng trình soạn thảo mã có tô sáng cú pháp giúp dễ dàng xác định xem thứ gì đó là chuỗi hay mã. Các chuỗi và mã yêu cầu xử lý sẽ có các màu khác nhau
Đánh dấu mã đơn giản trong trình chỉnh sửa Visual Studio Code được hiển thị trong hình bên dưới
Đối với hầu hết các mục đích, PHP hỗ trợ cả dấu ngoặc đơn [
echo 'rand[1, 10]';
414] và dấu ngoặc kép [echo 'rand[1, 10]';
425] để bao quanh các chuỗi. Vì mã HTML thường sử dụng dấu ngoặc đơn thay vì dấu ngoặc kép nên các nhà phát triển PHP có xu hướng thích chúng hơn. Ví dụecho 'rand[1, 10]';
40Để nói với PHP rằng câu trích dẫn sau
echo 'rand[1, 10]';
426 không phải là phần cuối của chuỗi, chúng ta cần chèn một echo 'rand[1, 10]';
427 [a. k. a. một ký tự thoát] trước nó. Chúng tôi cũng cần phải làm tương tự cho bất kỳ dấu ngoặc kép bổ sung nàoecho 'rand[1, 10]';
41Đây là lý do tại sao dấu ngoặc đơn được các nhà phát triển PHP ưa thích hơn, mặc dù có một số khác biệt giữa dấu ngoặc đơn và dấu ngoặc kép cho mục đích của chúng tôi ở đây
Bạn có thể hướng dẫn PHP chạy chức năng bằng cách sử dụng tên của nó [chẳng hạn như
echo 'rand[1, 10]';
419 trong ví dụ của chúng tôi trước đó] theo sau là dấu ngoặc đơn. Một chức năng có thể được coi là một chương trình thu nhỏ trong chương trình của bạn. Chạy một hàm còn được gọi phổ biến hơn là gọi một hàm và lệnh echo 'rand[1, 10]';
423 hướng dẫn PHP thực thi hàm có tên echo 'rand[1, 10]';
419Khi một hàm trong PHP được gọi, nó thường trả về một giá trị và sau đó, PHP hoạt động như thể bạn chỉ cần nhập giá trị được trả về vào mã của mình. Câu lệnh
echo 'rand[1, 10]';
405 trong ví dụ echo 'rand[1, 10]';
431 gọi hàm echo 'rand[1, 10]';
419 trả về một số ngẫu nhiên dưới dạng một chuỗi văn bản, sau đó xuất giá trị được trả về bởi lệnh gọi hàmHàm
echo 'rand[1, 10]';
419 nhận hai đối số, cho phép bạn thay đổi cách hoạt động của nó một chút. Mỗi chức năng trong PHP có thể chấp nhận một hoặc nhiều đối số. Bạn có thể sửa đổi hành vi của hàm bằng cách thay đổi các giá trị được truyền cho hàm, bao gồm số ngẫu nhiên tối thiểu và tối đa. Chẳng hạn, bạn có thể sử dụng mã này để tạo một số ngẫu nhiên trong khoảng từ 1 đến 50echo 'rand[1, 10]';
42echo 'rand[1, 10]';
419 là một hàm mà bạn muốn gọi, vì vậy chúng tôi đặt các đối số trong ngoặc đơn [echo 'rand[1, 10]';
436] vì hai lý do. Hàm echo 'rand[1, 10]';
419 yêu cầu bạn cung cấp giá trị tối thiểu và tối đa, đồng thời chúng đóng vai trò là phần đầu và phần cuối của danh sách đối số — câu lệnh PHP — mà bạn muốn cung cấp để hướng dẫn hàm phải làm gì. Có một dấu phẩy ngăn cách các giá trị nàyChúng ta sẽ kiểm tra các hàm chấp nhận các loại đối số khác nhau sau này, cũng như các hàm không chấp nhận đối số nào cả. Mặc dù không có gì được nhập vào giữa chúng, các hàm này vẫn yêu cầu dấu ngoặc đơn
Biến, toán tử và nhận xét
Biến
Đối với những người không quen biết, một biến có thể được coi là một cái tên được đặt cho một chiếc hộp hư cấu mà bất kỳ giá trị nào cũng có thể được đặt vào đó; . Dòng tiếp theo khai báo một biến có tên là
echo 'rand[1, 10]';
439 [tất cả các biến trong PHP đều có tên bắt đầu bằng ký hiệu đô la] và đặt giá trị của nó là echo 'rand[1, 10]';
440echo 'rand[1, 10]';
43Bởi vì PHP là ngôn ngữ được gõ lỏng lẻo, một biến duy nhất có thể lưu trữ bất kỳ loại dữ liệu nào trong suốt vòng đời của nó, bao gồm số, chuỗi văn bản và các loại giá trị khác. Biến
echo 'rand[1, 10]';
439, trước đây chứa một số, bây giờ sẽ chứa một chuỗi văn bản nếu bạn nhập câu lệnh sau vào sau câu lệnh được hiển thị trước đó_echo 'rand[1, 10]';
44Lệnh
echo 'rand[1, 10]';
405 từ trước đó có thể được sử dụng để gửi dữ liệu tới trình duyệt sau khi nó đã được lưu trữ trong một biếnecho 'rand[1, 10]';
45Số "3" sẽ được gửi đến trình duyệt khi mã này thực thi để nó có thể được nhìn thấy trên trang
Bạn có thể lưu trữ đầu ra của hàm và sử dụng nó sau này trong tập lệnh ngoài các chuỗi hoặc số cụ thể
_echo 'rand[1, 10]';
46nhà điều hành
[Có một cách khác để thực sự biểu thị "bằng" trong PHP, như chúng ta sẽ thấy bên dưới. ] Dấu bằng chúng ta đã sử dụng trong hai câu lệnh trước được gọi là toán tử gán vì nó được dùng để gán giá trị cho các biến. ] Các phép toán khác nhau có thể được thực hiện trên các giá trị bằng cách sử dụng các toán tử khác
echo 'rand[1, 10]';
47Bạn có thể suy ra từ những ví dụ này rằng
echo 'rand[1, 10]';
444 đại diện cho toán tử cộng, echo 'rand[1, 10]';
445 đại diện cho phép trừ, echo 'rand[1, 10]';
446 đại diện cho phép nhân và echo 'rand[1, 10]';
447 đại diện cho phép chia. Tất cả đều được gọi là toán tử số học vì chúng thực hiện phép tính số học trên các sốMỗi dòng số học trong ví dụ trên có một "chú thích" sau dấu chấm phẩy. Bằng cách chèn văn bản giải thích vào mã của bạn mà trình thông dịch PHP sẽ bỏ qua, nhận xét cho phép bạn giải thích mã của bạn đang làm gì
Chú thích một dòng có thể nằm trên dòng riêng của nó hoặc, như trong ví dụ trên, chú thích có thể được đặt ở cuối dòng mã. Nhận xét một dòng bắt đầu bằng
echo 'rand[1, 10]';
448Trình thông dịch PHP sẽ bỏ qua mọi thứ nằm giữa hai dấu phân cách này, vì vậy nếu bạn muốn một nhận xét trải rộng trên nhiều dòng, hãy bắt đầu bằng
echo 'rand[1, 10]';
449 và kết thúc bằng echo 'rand[1, 10]';
450. Trong suốt phần còn lại của cuốn sách này, tôi sẽ sử dụng các chú thích để giải thích thêm một số đoạn mã mà tôi trình bày.Toán tử nối chuỗi là một thao tác nối các chuỗi văn bản
echo 'rand[1, 10]';
48Hãy xem xét chuỗi câu lệnh này để minh họa cách các biến có thể được sử dụng ở hầu hết mọi nơi bạn sử dụng một giá trị
echo 'rand[1, 10]';
49Nếu bạn đặt một biến bên trong dấu ngoặc đơn, nó sẽ in tên thay vì nội dung của biến; . Ngược lại, khi sử dụng dấu ngoặc kép, biến trong chuỗi sẽ bị thay đổi để phản ánh nội dung của biến
Bạn nên làm quen với cách thực hành nối [hiển thị ở dòng thứ ba từ dòng cuối cùng], vì việc đặt các biến bên trong dấu ngoặc kép chỉ hoạt động trong các tình huống đơn giản và chúng tôi sẽ không sử dụng mã đơn giản như vậy cho phần lớn .
echo 'rand[1, 10]';
451]Cấu trúc điều khiển
Nếu bạn đã từng viết chương trình bằng các ngôn ngữ khác [như JavaScript, Objective-C, Ruby hoặc Python], bạn sẽ biết rằng các chương trình thực tế hiếm khi đơn giản như vậy.
Giống như bất kỳ ngôn ngữ lập trình nào khác, PHP có các tính năng cho phép bạn thay đổi cách mọi thứ diễn ra, bao gồm các câu lệnh đặc biệt cho phép bạn thay đổi thứ tự thực thi lần lượt từng thứ đã thống trị các ví dụ của chúng tôi cho đến thời điểm này. Bạn vẫn chưa hiểu cấu trúc điều khiển là gì? Một vài trường hợp sẽ chứng minh rõ điều này
câu lệnh if
Câu lệnh
echo 'rand[1, 10]';
452 là cấu trúc điều khiển cơ bản và được sử dụng thường xuyên nhất, và dòng chảy của một chương trình thông qua một câu lệnh có thể được nhìn thấy trong hình minh họa bên dướiĐây là một ví dụ về câu lệnh PHP
echo 'rand[1, 10]';
452echo 'rand[1, 10]';
60Cấu trúc điều khiển này cho phép chúng tôi hướng dẫn PHP chỉ thực thi một nhóm câu lệnh khi một yêu cầu cụ thể được đáp ứng
Cuộn xúc xắc có thể được lập mô hình bằng cách sử dụng chức năng
echo 'rand[1, 10]';
455 mà chúng tôi đã sử dụng trước đây, đặt mức tối thiểu và tối đa từ 1 đến 6, chẳng hạn, nếu chúng tôi muốn tạo một trò chơi trong đó bạn phải đổ sáu để giành chiến thắngecho 'rand[1, 10]';
61Nếu người chơi tung được sáu và thắng, bạn có thể sử dụng câu lệnh
echo 'rand[1, 10]';
452 để in ra một tin nhắnThí dụ. PHP-DiceRoll
echo 'rand[1, 10]';
62Sử dụng một
echo 'rand[1, 10]';
458 duy nhất, được sử dụng để gán và không thể được sử dụng để so sánh, hoàn toàn khác với việc sử dụng toán tử bằng, được biểu thị bằng echo 'rand[1, 10]';
457 trong điều kiện trênBạn có thể đặt bao nhiêu dòng mã tùy thích giữa các dấu ngoặc nhọn trong câu lệnh
echo 'rand[1, 10]';
452, sử dụng chúng để đặt mã bạn muốn chạy chỉ khi điều kiện được thỏa mãn. Sau dấu ngoặc đóng [echo 'rand[1, 10]';
461], tất cả mã được thực thi liên tụcecho 'rand[1, 10]';
63Xin lưu ý rằng phải nhập dấu bằng kép [
echo 'rand[1, 10]';
457]. Các lập trình viên PHP mới bắt đầu thường mắc lỗi khi nhập một điều kiện như thế này với một dấu bằng duy nhất_echo 'rand[1, 10]';
64Bởi vì điều kiện này sử dụng toán tử gán [
echo 'rand[1, 10]';
458] thay vì toán tử bằng [echo 'rand[1, 10]';
457], nó sẽ thực sự đặt giá trị của echo 'rand[1, 10]';
466 thành echo 'rand[1, 10]';
467 thay vì so sánh nó với số đó. ỐiThậm chí tệ hơn, bất kể giá trị ban đầu của
echo 'rand[1, 10]';
466 là gì, mã điều kiện của câu lệnh echo 'rand[1, 10]';
452 sẽ luôn được thực thi vì nó sẽ sử dụng thao tác này như một điều kiện mà nó sẽ coi là đúng.Bạn có thể thấy số ngẫu nhiên được tạo bằng cách chạy mã và lưu dưới dạng
echo 'rand[1, 10]';
473. Nếu bạn chạy nó cho đến khi bạn giành chiến thắng, bạn có thể thấy điều này trong trình duyệt_echo 'rand[1, 10]';
65Điều này không hấp dẫn lắm, nhưng vì PHP tạo HTML, bạn có thể định dạng đầu ra bằng cách thêm một số thẻ đoạn văn
Thí dụ. Định dạng PHP-DiceRoll
echo 'rand[1, 10]';
66Bạn có thể thấy rằng điều này hiện được in trong trình duyệt khi bạn chạy mã cập nhật
_echo 'rand[1, 10]';
67Điều này thân thiện với người dùng hơn nhiều, nhưng bạn có thể muốn hiển thị một thông báo khác cho những người không tung được 6 và không giành chiến thắng để làm cho trò chơi trở nên thân thiện hơn với người dùng. Một câu lệnh
echo 'rand[1, 10]';
474 có thể được sử dụng để thực hiện điều này; Thí dụ. PHP-DiceRoll-Khác
echo 'rand[1, 10]';
68Cần lưu ý rằng từ
echo 'rand[1, 10]';
477 cần được "thoát" vì nó chứa một dấu nháy đơn. PHP được hướng dẫn không coi dấu gạch chéo ngược trước của trích dẫn đơn [echo 'rand[1, 10]';
427] là kết thúc của chuỗi bằng cách làm như vậyMột [và chỉ một. ] của hai khối mã sẽ chạy nếu có câu lệnh khác. Nếu điều kiện được thỏa mãn, mã trong khối
echo 'rand[1, 10]';
452 sẽ chạy hoặc mã trong khối echo 'rand[1, 10]';
474 sẽ chạyMột câu lệnh
echo 'rand[1, 10]';
452 có thể chứa nhiều điều kiện. Các điều kiện có thể phức tạp hơn một lần kiểm tra tính bình đẳng. Cân nhắc thay đổi câu lệnh echo 'rand[1, 10]';
452 thành câu sau nếu trò chơi đã được thay đổi để cả echo 'rand[1, 10]';
484 và echo 'rand[1, 10]';
467 đều là số trúng thưởngThí dụ. PHP-DiceRoll-Hoặc
echo 'rand[1, 10]';
69Điều kiện trên bây giờ được thỏa mãn nếu một trong hai điều kiện là đúng [toán tử ống kép [
echo 'rand[1, 10]';
487] có nghĩa là "hoặc"]. Nếu bạn tung được 6 hoặc 5, bạn có thể hiểu điều này là "Nếu bạn tung. "Tuy nhiên, có nhiều cách khác để diễn đạt điều này thậm chí còn hiệu quả hơn việc sử dụng toán tử bằng [
echo 'rand[1, 10]';
457] trong câu lệnh echo 'rand[1, 10]';
452. Câu lệnh echo 'rand[1, 10]';
452 ở trên cũng có thể được thực hiện với một biểu thức duy nhất bằng cách sử dụng các toán tử lớn hơn [echo 'rand[1, 10]';
490] và nhỏ hơn [echo 'rand[1, 10]';
491] trong toán họcThí dụ. PHP-DiceRoll-Greater
echo 'rand[1, 10]';
20Nếu chúng tôi muốn 4, 5 và 6 là số chiến thắng, chúng tôi có thể thay đổi điều kiện thành
echo 'rand[1, 10]';
496; Chúng tôi có thể mở rộng trò chơi để bao gồm hai viên xúc xắc và yêu cầu người chơi tung hai mặt sáu để giành chiến thắng;
Thí dụ. PHP-Dice Roll-Hai con xúc xắc
echo 'rand[1, 10]';
21Người chơi phải đổ 6 trên cả hai viên xúc xắc để thắng trò chơi vì điều kiện
echo 'rand[1, 10]';
498 chỉ có thể được thỏa mãn nếu echo 'rand[1, 10]';
499 đúng và echo 'rand[1, 10]';
600. Người chơi sẽ thắng nếu họ đổ được 6 hoặc 1 hoặc [echo 'rand[1, 10]';
487] thay vì 1 và [echo 'rand[1, 10]';
601], tương đương với _______0603Hiện tại, hiểu biết chung về các câu lệnh
echo 'rand[1, 10]';
604 là đủ và chúng tôi sẽ xem xét các điều kiện phức tạp hơn khi có nhu cầuLưu ý rằng PHP cũng cho phép thay thế
echo 'rand[1, 10]';
605 cho echo 'rand[1, 10]';
487 và echo 'rand[1, 10]';
607 cho echo 'rand[1, 10]';
601. Ví dụecho 'rand[1, 10]';
22Nói chung, hãy tránh các toán tử "đánh vần" vì có một số khác biệt nhỏ giữa hoạt động của
echo 'rand[1, 10]';
605 và echo 'rand[1, 10]';
487 có thể dẫn đến hành vi không mong muốn. Có thể tránh được nhiều lỗi khó hiểu bằng cách sử dụng ống kép [echo 'rand[1, 10]';
487] và dấu và kép [echo 'rand[1, 10]';
601]vòng lặp
"Vòng lặp" là một loại cấu trúc điều khiển cực kỳ hữu ích khác cho phép bạn chạy lặp đi lặp lại cùng một dòng mã. Chúng ta hãy xem xét kỹ hơn hai loại vòng lặp quan trọng. Vòng lặp
echo 'rand[1, 10]';
613 và vòng lặp echo 'rand[1, 10]';
614Đối với vòng lặp
Hình ảnh bên dưới mô tả quy trình của vòng lặp
echo 'rand[1, 10]';
613 và được sử dụng khi bạn biết trước số lần bạn cần chạy cùng một đoạn mãĐây là cách nó sẽ xuất hiện trong mã
_echo 'rand[1, 10]';
23Câu lệnh
echo 'rand[1, 10]';
618 được kiểm tra mỗi khi vòng lặp được chạy trước khi các câu lệnh trong phần thân được thực thi và câu lệnh echo 'rand[1, 10]';
617 chỉ được thực hiện một lần ở đầu vòng lặp. Sau các câu lệnh trong phần thân, câu lệnh echo 'rand[1, 10]';
619 được thực thi mỗi lần qua vòng lặpSử dụng mã bên dưới để sử dụng vòng lặp
echo 'rand[1, 10]';
613 để đếm đến mười_echo 'rand[1, 10]';
24Điều này có vẻ khá đáng sợ vì có quá nhiều thứ đang diễn ra, nhưng hãy để tôi giải thích
- Bạn đã quen thuộc với mã
621. Một biến có tên làecho 'rand[1, 10]';
622 đang được tạo và giá trị của nó đang được đặt thànhecho 'rand[1, 10]';
623echo 'rand[1, 10]';
- Đây là hoàn cảnh.
624. Tiếp tục lặp trong khiecho 'rand[1, 10]';
622 nhỏ hơn hoặc bằng 10 là cách diễn giảiecho 'rand[1, 10]';
- Điều này tiểu bang. "Thêm 1 vào quầy mỗi lần"
626Cũng giống nhưecho 'rand[1, 10]';
627echo 'rand[1, 10]';
- Điều này hiển thị giá trị của bộ đếm theo sau là một khoảng trắng.
628echo 'rand[1, 10]';
Toán tử
echo 'rand[1, 10]';
629 được sử dụng trong điều kiện này; . Các toán tử echo 'rand[1, 10]';
631 [lớn hơn hoặc bằng] và echo 'rand[1, 10]';
632 [không bằng] là các tùy chọn bổ sungMặc dù thoạt nhìn, mã có vẻ khó đọc hơn một chút, nhưng việc đặt tất cả mã liên quan đến việc kiểm soát vòng lặp vào cùng một vị trí thực sự giúp bạn dễ hiểu hơn một khi bạn đã quen với cú pháp. Bạn sẽ có nhiều cơ hội để
Hãy xem cách thêm
echo 'rand[1, 10]';
440 mỗi khi bạn có thể thay đổi vòng lặp echo 'rand[1, 10]';
613 bằng cách thay đổi phần cuối cùng hoặc bạn có thể thay đổi từng phần của vòng lặp echo 'rand[1, 10]';
613 để có các kết quả khác nhauDòng cuối cùng của vòng lặp,
echo 'rand[1, 10]';
626, là phiên bản rút gọn của echo 'rand[1, 10]';
627 và hướng dẫn người dùng thêm 1 vào giá trị của echo 'rand[1, 10]';
622Vòng lặp for có thể được sử dụng để đếm ba phần bằng cách thay đổi
echo 'rand[1, 10]';
626 thành echo 'rand[1, 10]';
642Thí dụ. PHP-Dành cho
echo 'rand[1, 10]';
25Kết quả là, điều sau đây sẽ xảy ra
echo 'rand[1, 10]';
26Để thực hiện các hành động cụ thể trên mỗi lần lặp, vòng lặp
echo 'rand[1, 10]';
613 có thể được kết hợp với các câu lệnh khác, chẳng hạn như câu lệnh echo 'rand[1, 10]';
452. Chẳng hạn, thay vì làm mới trang trên trò chơi súc sắc của chúng tôi mỗi lần, chúng tôi có thể muốn tung xúc xắc mười lần và in kết quảThí dụ. PHP-DiceRoll-ManyDice
_echo 'rand[1, 10]';
27Việc sử dụng một vòng lặp về mặt chức năng tương đương với việc sao chép và dán mã mười lần và sẽ dẫn đến kết quả chính xác như sau, cho phép chúng ta tung xúc xắc mười lần mà không cần phải làm mới trang mỗi lần
_echo 'rand[1, 10]';
28Cho dù bạn sao chép và dán hay sử dụng vòng lặp, máy tính không quan tâm. Nó sẽ đơn giản thực thi mã, nhưng với tư cách là nhà phát triển, bạn sẽ nhanh chóng hiểu rằng vòng lặp là một lựa chọn tốt hơn. Sử dụng một vòng lặp, bạn có thể thay đổi mã ở một nơi và nó sẽ có tác động đến tất cả các lần lặp lại của vòng lặp, không giống như thay đổi mã ở mười nơi khác nhau để cho phép
echo 'rand[1, 10]';
484 làm số chiến thắng. Nếu bạn thấy mình đang sao chép và dán mã, hầu như luôn có cách tốt hơn để hoàn thành mục tiêu của bạnLưu ý rằng bạn có thể bắt đầu lập trình cho chính mình ngay bây giờ khi bạn đã quen thuộc với các vòng lặp. Bạn có thể vượt qua những trở ngại này?
- In mọi số lẻ từ 21 đến 99 trong Task 1
- In bảng chín lần lên tới 12 x 9 [
646, v.v. ] trong thử thách 2. ] mà không sử dụng câu lệnhecho 'rand[1, 10]';
452 hoặc toán tử nhân [echo 'rand[1, 10]';
446]echo 'rand[1, 10]';
- 3. Bảng chín lần nên được in ở định dạng này.
29echo 'rand[1, 10]';
Bạn phải sử dụng toán tử nhân lần này
Vòng lặp While
Vòng lặp
echo 'rand[1, 10]';
614, một cấu trúc điều khiển phổ biến khác của PHP, cho phép chúng ta sử dụng một điều kiện để quyết định số lần chúng ta sẽ thực thi lặp đi lặp lại một tập hợp các câu lệnh, trái ngược với câu lệnh echo 'rand[1, 10]';
604, cho phép chúng ta quyết định có thực thi một tập hợp hay không Hoạt động của vòng lặp
echo 'rand[1, 10]';
614 được mô tả trong hình bên dướiĐây là một ví dụ về vòng lặp
echo 'rand[1, 10]';
614 trong mãecho 'rand[1, 10]';
30Sự khác biệt giữa vòng lặp
echo 'rand[1, 10]';
614 và câu lệnh echo 'rand[1, 10]';
452 xảy ra khi điều kiện đúng và [các] câu lệnh được thực thi. Nếu điều kiện vẫn đúng, [các] câu lệnh được thực hiện lần thứ hai và lần thứ ba, và sẽ tiếp tục được thực hiện chừng nào điều kiện còn đúng [thay vì tiếp tục thực hiện với câu lệnh theo sau dấu ngoặc nhọn . Việc thực thi ngay lập tức chuyển sang câu lệnh xuất hiện sau vòng lặp echo 'rand[1, 10]';
614, sau dấu ngoặc nhọn đóng, nếu điều kiện được đánh giá là sai lần đầu tiên [cho dù đó là lần đầu tiên nó được kiểm tra hay lần thứ một trăm]Bộ đếm tạo ra kết quả tương tự như kết quả của vòng lặp
echo 'rand[1, 10]';
613 có thể được tạo bằng vòng lặp echo 'rand[1, 10]';
614Thí dụ. PHP-WhileCount
_echo 'rand[1, 10]';
31Mã này có vẻ hơi đáng sợ, tôi biết, nhưng hãy để tôi hướng dẫn bạn từng dòng một. Điều này hoạt động theo cách chính xác giống như vòng lặp
echo 'rand[1, 10]';
613 và bạn sẽ nhận thấy rất nhiều câu lệnh giống nhau ở những nơi khác nhau- Dòng đầu tiên khai báo một biến có tên
622 và đặt cho nó giá trịecho 'rand[1, 10]';
623echo 'rand[1, 10]';
- Dòng thứ hai bắt đầu một vòng lặp
614, với yêu cầu giá trị củaecho 'rand[1, 10]';
622 phải nhỏ hơn hoặc bằng [echo 'rand[1, 10]';
629] 10 [echo 'rand[1, 10]';
664]echo 'rand[1, 10]';
- Dấu ngoặc mở báo hiệu bắt đầu khối mã điều kiện cho vòng lặp
614. Miễn là điều kiện còn đúng, mã điều kiện này, thường được gọi là phần thân của vòng lặp, sẽ được thực thi lặp đi lặp lạiecho 'rand[1, 10]';
- Giá trị của
622 được xuất đầy đủ trên dòngecho 'rand[1, 10]';
628, theo sau là khoảng trắngecho 'rand[1, 10]';
- Dòng thứ tư tăng giá trị của dòng thứ ba lên _______0623 để mang lại _______0672. Viết tắt của
627 làecho 'rand[1, 10]';
675; . Nếuecho 'rand[1, 10]';
678 ở trước tên biến, bộ đếm sẽ tăng lên trước khi giá trị được đọc, nếu không thì việc đặtecho 'rand[1, 10]';
678 ở đâu không quan trọng. Hãy thận trọng khi sử dụngecho 'rand[1, 10]';
678 vì đặt nó ở vị trí không chính xác có thể dẫn đến lỗi. Nếuecho 'rand[1, 10]';
622 bằng 0, mãecho 'rand[1, 10]';
681 sẽ in raecho 'rand[1, 10]';
623, trong khiecho 'rand[1, 10]';
683 sẽ in raecho 'rand[1, 10]';
684echo 'rand[1, 10]';
- Dấu đóng ngoặc chỉ ra rằng phần thân của vòng lặp
614 đã kết thúcecho 'rand[1, 10]';
Kết quả là khi mã này được chạy, điều kiện chắc chắn là đúng vì giá trị của
echo 'rand[1, 10]';
622 là echo 'rand[1, 10]';
623 trong lần đầu tiên nó được kiểm tra. Điều kiện vẫn đúng khi điều kiện được kiểm tra lần thứ hai, vì vậy giá trị của echo 'rand[1, 10]';
622 [echo 'rand[1, 10]';
623] được xuất ra và echo 'rand[1, 10]';
622 được cung cấp giá trị mới là echo 'rand[1, 10]';
693 và giá trị mới của echo 'rand[1, 10]';
440 được gán. Cuối cùng, echo 'rand[1, 10]';
622 được cho một giá trị là echo 'rand[1, 10]';
205 và điều kiện được xác định là sai, kết thúc vòng lặp. Quá trình này tiếp tục, xuất ra các giá trị echo 'rand[1, 10]';
440, echo 'rand[1, 10]';
495, echo 'rand[1, 10]';
484, echo 'rand[1, 10]';
467, echo 'rand[1, 10]';
200, echo 'rand[1, 10]';
201, echo 'rand[1, 10]';
202 và echo 'rand[1, 10]';
203Hình ảnh tiếp theo hiển thị kết quả tổng thể của mã
Mặc dù bạn có thể tạo bộ đếm bằng vòng lặp
echo 'rand[1, 10]';
614, vòng lặp thường được sử dụng để tiếp tục chạy mã cho đến khi có điều gì đó xảy ra, chứ không phải bộ đếm đơn giản như thế này. Ví dụ, khi viết mã, không có cách nào để dự đoán số lần xúc xắc sẽ cần tung trước khi chúng ta nhận được số 6. Bạn có thể tung xúc xắc theo vòng lặp echo 'rand[1, 10]';
614 vì có thể cần một hoặc hàng trăm lần tung để có được sáuThí dụ. PHP-DiceRoll-While
echo 'rand[1, 10]';
32Sẽ có một số lần tung khác nhau mỗi lần bạn chạy mã trước khi giành chiến thắng và xúc xắc sẽ tiếp tục tung cho đến khi con số 6 được tung ra
Biến
echo 'rand[1, 10]';
466 cần được đặt thành một giá trị cho phép so sánh ban đầu để câu lệnh while thực thi vòng lặp echo 'rand[1, 10]';
614. Câu lệnh while sử dụng điều kiện echo 'rand[1, 10]';
209. Dòng echo 'rand[1, 10]';
212 phía trên vòng lặp echo 'rand[1, 10]';
614 phục vụ mục đích này bằng cách đặt giá trị ban đầu thành 0. Bằng cách đó, lần đầu tiên vòng lặp echo 'rand[1, 10]';
614 thực thi, điều kiện echo 'rand[1, 10]';
209 được thỏa mãn vì echo 'rand[1, 10]';
466 bằng 0 chứ không phải 6 và vòng lặp sẽ bắt đầu. Bạn sẽ gặp sự cố nếu biến echo 'rand[1, 10]';
466 không được tạo trước khi vòng lặp bắt đầu vì nó chưa được gán giá trị trước khi được sử dụngTrong những tình huống như thế này, một biến thể của vòng lặp
echo 'rand[1, 10]';
614 có tên là echo 'rand[1, 10]';
220 cho phép bạn chạy một số mã mà không cần điều kiện và sau đó chạy lại mã đó nếu điều kiện không được đáp ứng. Điều này có cấu trúc tiếp theo_echo 'rand[1, 10]';
33Bạn có thể bỏ qua dòng đầu tiên trong ví dụ tung xúc xắc trước đó bằng cách thực hiện điều này
Thí dụ. PHP-DiceRoll-DoWhile
_echo 'rand[1, 10]';
34Lần này do điều kiện ở dưới cùng nên khi câu lệnh
echo 'rand[1, 10]';
614 thực hiện thì biến echo 'rand[1, 10]';
466 đã có giá trị nên bạn không cần khởi tạo giá trị cho nó bằng 0 để vòng lặp thực hiện câu lệnh echo 'rand[1, 10]';
614Lưu ý rằng PHP bỏ qua khoảng trắng và không quan tâm mã của bạn được định dạng như thế nào. Đây là cách bạn có thể đã viết ví dụ trước
echo 'rand[1, 10]';
35Các lập trình viên khác nhau có các kiểu ưa thích khác nhau, chẳng hạn như sử dụng các tab hoặc dấu cách để thụt đầu dòng hoặc định vị dấu ngoặc mở trên cùng một dòng với câu lệnh hoặc sau nó, nhưng bất kể những lựa chọn này là gì, tập lệnh sẽ luôn hoạt động theo cùng một cách. Tuy nhiên, máy tính không quan tâm liệu một dấu ngoặc nằm trên cùng một dòng hay dòng tiếp theo, vì vậy hãy sử dụng bất kỳ kiểu nào bạn cảm thấy thoải mái nhất. Thậm chí còn có các hướng dẫn về kiểu mã hóa chỉ định vị trí đặt dấu ngoặc nhọn và dấu ngoặc đơn và cách định dạng mã
Mảng
Nếu bạn coi một biến như một chiếc hộp chứa một giá trị, thì một mảng có thể được coi như một chiếc hộp có nhiều ngăn mà mỗi ngăn có khả năng lưu trữ một giá trị khác nhau
Sử dụng dấu ngoặc vuông [
echo 'rand[1, 10]';
223 và echo 'rand[1, 10]';
224] trong PHP để tạo một mảng, sau đó phân tách các giá trị bạn muốn lưu trữ bằng dấu phẩy_echo 'rand[1, 10]';
36Lưu ý rằng PHP cũng cho phép định nghĩa mảng bằng từ khóa
echo 'rand[1, 10]';
225. Ký hiệu dấu ngoặc vuông ở trên tương đương với mã xuất hiện sau_echo 'rand[1, 10]';
37Các nhà phát triển PHP thích sử dụng ký hiệu dấu ngoặc vuông, được giới thiệu trong PHP 5. 4, vì nó yêu cầu gõ ít hơn và làm cho dấu ngoặc tròn dễ thấy hơn trong các cấu trúc điều khiển như câu lệnh
echo 'rand[1, 10]';
452 và vòng lặp echo 'rand[1, 10]';
614Ba giá trị được tạo trong mảng
echo 'rand[1, 10]';
228 bởi đoạn mã này. echo 'rand[1, 10]';
229, echo 'rand[1, 10]';
693 và echo 'rand[1, 10]';
231. Khoảng trống thứ nhất và thứ ba trong mảng này được điền bằng các chuỗi, trong khi khoảng trống thứ hai được điền bằng số, giống như một biến thông thườngThông thường, mảng sử dụng các số làm chỉ số để trỏ đến các giá trị mà chúng chứa, bắt đầu bằng số 0, vì vậy khi bạn muốn truy cập một giá trị được lưu trữ trong một mảng, bạn cần biết chỉ số của nó. Chỉ số của phần tử thứ n của mảng là n-1 vì giá trị [hoặc phần tử] đầu tiên của mảng có chỉ số 0, phần tử thứ hai có chỉ số 1, phần tử thứ ba có chỉ số 2, v.v. Bạn có thể truy xuất một giá trị bằng cách đặt chỉ số của giá trị mà bạn quan tâm vào giữa các dấu ngoặc vuông sau tên của biến mảng
_echo 'rand[1, 10]';
38Bạn có thể thêm các phần tử mới vào một mảng bằng cách sử dụng một khóa được đặt trong dấu ngoặc vuông hoặc bạn có thể gán giá trị mới cho các phần tử mảng hiện có
_echo 'rand[1, 10]';
39Sử dụng toán tử gán như bình thường, bạn cũng có thể thêm các phần tử vào cuối mảng trong khi để trống dấu ngoặc vuông sau tên biến
echo 'rand[1, 10]';
60Tuy nhiên, mảng có thể được sử dụng để giải quyết các vấn đề mà các biến thông thường không làm được, và trong nhiều trường hợp, quyết định sử dụng một mảng hay nhiều biến sẽ phụ thuộc vào sở thích của người lập trình.
Nhớ trò chơi súc sắc từ phần trước? . "
Điều này có thể được thực hiện với một loạt các câu lệnh
echo 'rand[1, 10]';
452, có thể được sử dụng để dịch từ một số sang từ tiếng Anh cho số đóThí dụ. PHP-DiceRoll-English-If
echo 'rand[1, 10]';
61Thay vào đó, bạn có thể sử dụng một mảng để lưu trữ từng giá trị cuộn, cách này hiệu quả hơn và tránh phải viết câu lệnh
echo 'rand[1, 10]';
452 cho mỗi lần tung xúc xắc tiềm năngecho 'rand[1, 10]';
62Khi xây dựng một mảng, bạn có thể chỉ định cả khóa và giá trị bằng cách sử dụng ký hiệu
echo 'rand[1, 10]';
234 [còn được gọi là toán tử mũi tên kép]echo 'rand[1, 10]';
63Mặc dù thực tế là chúng giống hệt nhau, mã bắt buộc của ký hiệu tốc ký gõ nhanh hơn nhiều và thậm chí có thể dễ đọc hơn
Mảng đã được tạo và giờ có thể đọc được từng từ tiếng Anh từ mảng đó
echo 'rand[1, 10]';
64Điều này cũng có thể xảy ra với các khóa mảng trong PHP, trong đó một số như
echo 'rand[1, 10]';
440 có thể được thay thế bằng một biến chứa giá trị đó. Ví dụecho 'rand[1, 10]';
65Bằng cách đọc giá trị thích hợp từ mảng bằng cách sử dụng biến
echo 'rand[1, 10]';
466, chúng ta có thể đặt mọi thứ lại với nhau và sửa đổi trò chơi xúc xắc để nó hiển thị từ tiếng Anh của trò tung xúc xắcThí dụ. PHP-DiceRoll-English-Array
_echo 'rand[1, 10]';
66Như bạn có thể thấy, điều này gọn gàng và có tổ chức hơn nhiều so với một danh sách dài các câu lệnh
echo 'rand[1, 10]';
452Trước hết, việc thêm vào mảng thay vì thêm một câu lệnh
echo 'rand[1, 10]';
452 bổ sung cho mỗi số sẽ đơn giản hơn rất nhiều nếu bạn muốn biểu diễn một con súc sắc mười mặtThứ hai, bạn có thể sử dụng lại mảng thay vì phải lặp lại tất cả các câu lệnh
echo 'rand[1, 10]';
452 cho mỗi lần gieo xúc xắc trong phiên bản có hai viên xúc xắcThí dụ. PHP-DiceRoll-English-If-TwoDice
_echo 'rand[1, 10]';
67Thay vào đó, cả hai cuộn có thể được thực hiện bằng cách sử dụng mảng
Thí dụ. PHP-DiceRoll-English-Array-TwoDice
_echo 'rand[1, 10]';
68Mặc dù số là lựa chọn phổ biến nhất cho chỉ số mảng, nhưng bạn cũng có thể sử dụng chuỗi để tạo mảng được gọi là mảng kết hợp. Trong ví dụ này, chúng tôi liên kết một ngày [ở dạng chuỗi] với từng tên trong số ba tên; . nó liên kết các giá trị với các chỉ số có ý nghĩa
_echo 'rand[1, 10]';
69Bạn có thể sử dụng ký hiệu tốc ký cho các mảng kết hợp giống như bạn có thể sử dụng cho các chỉ mục số
echo 'rand[1, 10]';
60Bây giờ, chúng tôi tra cứu nó bằng cách sử dụng tên làm chỉ mục nếu chúng tôi muốn biết ngày sinh của Kevin
echo 'rand[1, 10]';
61Như chúng ta sẽ thấy trong giây lát, loại mảng này rất quan trọng khi nói đến tương tác của người dùng trong PHP. Tôi cũng sẽ chỉ cho bạn cách sử dụng mảng theo những cách khác trong suốt cuốn sách này
Dấu nháy đơn [trích dẫn đơn] trong
echo 'rand[1, 10]';
241 phải được thoát bằng một echo 'rand[1, 10]';
427 để PHP coi nó như một phần của chuỗi chứ không phải là phần cuối của chuỗi vì nếu không thì PHP sẽ hiểu đây là phần cuối của chuỗiTương tác người dùng và biểu mẫu
Các trang web dựa trên cơ sở dữ liệu thường cần cung cấp một số mức độ tương tác, ngay cả khi đó chỉ là một hộp tìm kiếm, ngoài việc tạo động các trang từ dữ liệu cơ sở dữ liệu
Các ngôn ngữ kịch bản phía máy chủ như PHP có phạm vi hạn chế hơn khi hỗ trợ tương tác người dùng so với JavaScript vì mã JavaScript có thể tồn tại trong trình duyệt. Tương tác của người dùng chỉ diễn ra theo cách qua lại vì mã PHP chỉ được kích hoạt khi có yêu cầu đến máy chủ. người dùng gửi yêu cầu đến máy chủ và máy chủ phản hồi động với các trang được tạo
Hóa ra PHP làm cho việc gửi thông tin về tương tác của người dùng trở nên khá đơn giản, cùng với yêu cầu về một trang web mới, đây là chìa khóa để tạo tương tác với nó
Lưu ý rằng giống như Web đã phát triển, các tùy chọn để kết nối mặt trước và mặt sau của ứng dụng web cũng vậy. Khung JavaScript như Vue cho phép giao tiếp với mặt sau mà không cần tải lại trang. Chẳng hạn, js có thể tương tác với các framework PHP như Laravel, nhưng vì mục đích của cuốn sách này, chúng ta sẽ tập trung vào khả năng của chính PHP.
Truyền biến trong liên kết
Chuỗi truy vấn URL là cách đơn giản nhất để gửi dữ liệu với yêu cầu trang; . Ví dụ: nếu bạn tiến hành tìm kiếm "SitePoint" trên Google, thì bạn sẽ được chuyển đến một trang có URL sau làm kết quả tìm kiếm
echo 'rand[1, 10]';
62Thông tin đang được gửi cùng với yêu cầu cho
echo 'rand[1, 10]';
244, được biểu thị bằng dấu chấm hỏi trong URLTạo một tệp HTML thông thường có tên là
echo 'rand[1, 10]';
245 [không cần phần mở rộng tên tệp echo 'rand[1, 10]';
3 vì sẽ không có mã PHP trong tệp này] và thêm liên kết sauecho 'rand[1, 10]';
63Biến được chuyển dưới dạng một phần của chuỗi truy vấn, là phần của URL xuất hiện sau dấu chấm hỏi và nó liên kết tới một tệp có tên là
echo 'rand[1, 10]';
247, nhưng bạn cũng đang chuyển biến cùng với yêu cầu trang. Bạn đã tạo một liên kết tải echo 'rand[1, 10]';
247 và cho mã PHP trong tệp đó biết rằng biến, có tên echo 'rand[1, 10]';
248 và giá trị echo 'rand[1, 10]';
249, bằng với giá trị đóTạo một tệp mới,
echo 'rand[1, 10]';
247, với phần mở rộng tên tệp echo 'rand[1, 10]';
3 và kiểm tra nó để hiểu đầy đủ tác động của liên kết này. Trong nội dung của trang web mới này, hãy nhập nội dung sau để thông báo cho máy chủ web rằng nó sẽ dự đoán việc diễn giải một số mã PHP trong tệpThí dụ. PHP-NHẬN
_echo 'rand[1, 10]';
64Bây giờ, hãy lưu hai tệp sau [
echo 'rand[1, 10]';
245 và echo 'rand[1, 10]';
247] vào thư mục echo 'rand[1, 10]';
8 và mở tệp đầu tiên trong số các tệp này trong trình duyệt của bạn [URL của nó phải là echo 'rand[1, 10]';
258]. Để yêu cầu tập lệnh PHP, hãy nhấp vào liên kết trên trang đầu tiên đó. Trang tiếp theo sẽ là "Chào mừng đến với trang web của chúng tôi, Tom. "như mô tả trong hình dưới đâyĐây là dòng quan trọng nhất trong mã kích hoạt tính năng này, vì vậy hãy xem xét nó chi tiết hơn
_echo 'rand[1, 10]';
65Bạn có thể xác định chức năng của dòng này bằng cách sử dụng thông tin từ phần "Mảng" ở trên. Nó gán giá trị có trong phần tử
echo 'rand[1, 10]';
259 của mảng có tên là echo 'rand[1, 10]';
260 cho một biến mới có tên là echo 'rand[1, 10]';
261. Tuy nhiên, mảng echo 'rand[1, 10]';
260 bắt nguồn từ đâu?PHP tạo
echo 'rand[1, 10]';
260 dưới dạng một biến mảng chứa bất kỳ giá trị nào được truyền trong chuỗi truy vấn URL, đây hóa ra là một trong số các biến mà PHP tự động tạo khi nhận được yêu cầu từ trình duyệt. Tập lệnh echo 'rand[1, 10]';
247 của bạn gán giá trị này cho một biến PHP thông thường [echo 'rand[1, 10]';
261], sau đó sử dụng câu lệnh echo 'rand[1, 10]';
405 để hiển thị nó dưới dạng một phần của chuỗi văn bản. Bởi vì echo 'rand[1, 10]';
260 là một mảng kết hợp, giá trị của biến echo 'rand[1, 10]';
248 được truyền trong chuỗi truy vấn có thể được truy cập dưới dạng echo 'rand[1, 10]';
267echo 'rand[1, 10]';
66Sử dụng toán tử nối chuỗi [
echo 'rand[1, 10]';
272] mà chúng ta đã xem xét trong phần "Biến, Toán tử và Nhận xét", giá trị của biến echo 'rand[1, 10]';
261 được thêm vào chuỗi đầu raNhưng hãy cẩn thận, mã này có lỗ hổng bảo mật. Mặc dù PHP là một ngôn ngữ lập trình đơn giản để học, nhưng hóa ra nếu bạn không biết nên thực hiện các biện pháp bảo mật nào, thì việc đưa các vấn đề bảo mật vào các trang web sử dụng PHP lại đặc biệt đơn giản. Trước khi chúng ta tiếp tục với ngôn ngữ này, tôi muốn đảm bảo rằng bạn có thể phát hiện và khắc phục vấn đề bảo mật cụ thể này vì đây có thể là vấn đề phổ biến nhất trên Web hiện nay
Mặc dù biến
echo 'rand[1, 10]';
261 thường sẽ nhận giá trị của nó từ chuỗi truy vấn URL trong liên kết trên trang echo 'rand[1, 10]';
245, nhưng người dùng ác ý có thể chỉnh sửa URL để gửi một giá trị khác cho biến echo 'rand[1, 10]';
248. Vấn đề bảo mật ở đây phát sinh từ thực tế là tập lệnh echo 'rand[1, 10]';
247 đang tạo một trang chứa nội dung nằm dưới sự kiểm soát của người dùng — trong trường hợp này là biến echo 'rand[1, 10]';
261Khi bạn nhìn thấy trang kết quả [với thông báo chào mừng có tên "Tom"], hãy xem URL trên thanh địa chỉ của trình duyệt để xem trang này sẽ hoạt động như thế nào. Nó phải giống như thế này
_echo 'rand[1, 10]';
67Chỉnh sửa URL để thêm các thẻ _12280 trước tên và
echo 'rand[1, 10]';
279 sau tênecho 'rand[1, 10]';
68Khi URL mới này đã được tải, hãy lưu ý rằng tên của trang hiện được in đậm như trong hình ảnh sau
Lưu ý rằng mặc dù một số trình duyệt có thể tự động chuyển đổi các ký tự
echo 'rand[1, 10]';
491 và echo 'rand[1, 10]';
490 thành các chuỗi thoát URL [lần lượt là ______0283 và echo 'rand[1, 10]';
284], PHP vẫn sẽ được cung cấp cùng một giá trị trong cả hai trường hợpNếu mã vô hại như thẻ
echo 'rand[1, 10]';
279 thì sẽ không có vấn đề gì, nhưng người dùng ác ý có thể bao gồm mã JavaScript tinh vi để thực hiện một số nhiệm vụ tầm thường như đánh cắp mật khẩu của người dùng. Kẻ tấn công thậm chí có thể nhúng liên kết vào email và gửi cho người dùng của bạn; . Mã của kẻ tấn công sẽ được thêm vào trang của bạn và bẫy sẽ được đặt nếu một trong những người dùng của bạn nhấp vào liên kếtVì bạn chỉ mới học PHP, tôi xin lỗi đã làm bạn sợ khi nói về tin tặc độc hại tấn công người dùng của bạn bằng cách sử dụng mã PHP của riêng bạn để chống lại bạn, nhưng sự thật là lỗ hổng lớn nhất của ngôn ngữ PHP là nó quá đơn giản để sử dụng. . Bạn càng sớm tiếp xúc với những vấn đề này, bạn càng sớm quen với việc tránh chúng và chúng sẽ càng ít trở ngại cho bạn trong tương lai, mặc dù một số người có thể tranh luận rằng bạn dành nhiều năng lượng để học viết PHP.
Vậy làm cách nào để chúng tôi tạo một trang có tên người dùng trên đó mà không để nó bị tấn công?
Mở lại tệp
echo 'rand[1, 10]';
247 của bạn và sửa đổi mã PHP trong đó để giống với mã được hiển thị bên dướiThí dụ. PHP-GET-Sát trùng
echo 'rand[1, 10]';
69Hãy để tôi chia nhỏ mã này cho bạn vì có rất nhiều thứ đang diễn ra ở đó. Dòng đầu tiên giống như trước đó, gán giá trị của phần tử
echo 'rand[1, 10]';
259 từ mảng echo 'rand[1, 10]';
260 cho echo 'rand[1, 10]';
261. Tuy nhiên, câu lệnh echo 'rand[1, 10]';
405 xuất hiện sau nó thì khác vì thay vì chỉ kết xuất biến echo 'rand[1, 10]';
261 vào nó, như chúng ta đã làm trước đây, phiên bản mã này sử dụng hàm PHP tích hợp sẵn echo 'rand[1, 10]';
294 để thực hiện một chuyển đổi quan trọngecho 'rand[1, 10]';
294 chuyển đổi "các ký tự HTML đặc biệt" như echo 'rand[1, 10]';
491 và echo 'rand[1, 10]';
490 thành các thực thể ký tự HTML như echo 'rand[1, 10]';
300 và echo 'rand[1, 10]';
301, ngăn trình duyệt hiểu chúng là mã HTML. Hãy nhớ rằng lỗ hổng bảo mật tồn tại bởi vì, trong echo 'rand[1, 10]';
247, mã HTML trong biến echo 'rand[1, 10]';
261 được đổ trực tiếp vào mã của trang được tạo và do đó có thể làm bất cứ điều gì mà mã HTML có thể làm. Tôi sẽ chỉ cho bạn cách làm điều này ngay sau đâyLệnh gọi hàm
echo 'rand[1, 10]';
294 là phiên bản đầu tiên của một hàm PHP nhận nhiều hơn một đối số trong cuốn sách này, vì vậy, trước tiên chúng ta hãy xem kỹ mã mới này. Cuộc gọi chức năng được hiển thị ở đây bởi chính nóecho 'rand[1, 10]';
20Văn bản được chuyển đổi là đối số đầu tiên, cùng với "hằng" PHP0304 hướng dẫn
echo 'rand[1, 10]';
294 chuyển đổi dấu ngoặc đơn và dấu ngoặc kép cũng như các ký tự đặc biệt khácLưu ý rằng hằng số PHP giống như một biến có giá trị không thể thay đổi. PHP bao gồm một số hằng số dựng sẵn, chẳng hạn như
echo 'rand[1, 10]';
304 được sử dụng để kiểm soát các hàm dựng sẵn, chẳng hạn như echo 'rand[1, 10]';
294, nhưng các hằng số không bắt đầu bằng ký hiệu đô laChuỗi
echo 'rand[1, 10]';
308, tham số thứ ba, hướng dẫn PHP sử dụng mã hóa ký tự nào khi diễn giải văn bản mà bạn cung cấp cho nóLưu ý rằng phần tử meta sau xuất hiện gần đầu mỗi trang HTML mẫu trong cuốn sách này
echo 'rand[1, 10]';
21Phần tử này thông báo cho trình duyệt rằng mã HTML của trang này được mã hóa bằng văn bản UTF-8
Nếu bạn tò mò muốn tìm hiểu thêm về mã hóa ký tự, hãy xem "Hướng dẫn cơ bản về mã hóa ký tự web. " UTF-8 là một trong nhiều tiêu chuẩn để biểu thị văn bản dưới dạng một chuỗi các số 1 và 0 trong bộ nhớ máy tính
Bằng cách mã hóa các trang của bạn dưới dạng UTF-8, người dùng của bạn có thể gửi văn bản chứa hàng nghìn ký tự nước ngoài mà trang web của bạn không thể xử lý nếu không [chúng ta sẽ chuyển sang phần "Chuyển biến trong biểu mẫu" trong một vài trang]
Vì nhiều hàm dựng sẵn của PHP, chẳng hạn như
echo 'rand[1, 10]';
294, giả sử bạn đang sử dụng mã hóa ký tự ISO-8859-1 [hoặc Latin-1] đơn giản hơn nhiều theo mặc định, bạn phải thông báo cho họ rằng bạn đang sử dụng UTF-8 khi Chỉ cần thiết nếu bạn muốn nhập các ký tự nâng cao [như dấu ngoặc kép hoặc dấu gạch ngang] hoặc ký tự nước ngoài [như "é"] vào mã HTML hoặc PHP của mình, bạn cũng nên hướng dẫn trình soạn thảo văn bản của mình lưu tệp HTML và PHP dưới dạng UTF-8 . Để an toàn, mã trong cuốn sách này sử dụng các tham chiếu thực thể HTML [chẳng hạn như
echo 'rand[1, 10]';
310 cho một trích dẫn cong bên phải], mã này sẽ luôn hoạt độngThông báo "Chào mừng đến với trang web của chúng tôi, Tom" sẽ xuất hiện một lần nữa khi bạn mở
echo 'rand[1, 10]';
245 trong trình duyệt của mình và nhấp vào liên kết hiện dẫn đến echo 'rand[1, 10]';
247 đã cập nhật của bạn. Như bạn đã làm trước đây, thay đổi URL để thêm các thẻ echo 'rand[1, 10]';
279 và echo 'rand[1, 10]';
280 của tênecho 'rand[1, 10]';
68Lần này, khi bạn nhấn enter, văn bản bạn thực sự đã nhập sẽ xuất hiện thay vì tên được in đậm trên trang, như thể hiện trong hình dưới đây
Điều này ngăn người dùng độc hại đưa mã không mong muốn vào trang web của bạn; . Nếu họ làm điều đó, mã sẽ được hiển thị vô hại trên trang dưới dạng văn bản thuần túy
Không cần quá lo lắng nếu bạn đang gặp khó khăn trong việc hiểu chi tiết về cách sử dụng hàm
echo 'rand[1, 10]';
294 ngay bây giờ; . Hiện tại, chúng ta hãy xem xét một số phương thức phức tạp hơn để truyền giá trị cho các tập lệnh PHP khi chúng ta yêu cầu chúng. Chẳng bao lâu, bạn sẽ thấy việc sử dụng nó trở thành bản chất thứ haiThật tuyệt khi chỉ chuyển một biến trong chuỗi truy vấn, nhưng hóa ra bạn có thể chuyển nhiều giá trị nếu muốn. Chúng ta hãy xem một phiên bản phức tạp hơn một chút của ví dụ trước. Mở lại tài liệu
echo 'rand[1, 10]';
245 của bạn và cập nhật liên kết để trỏ tới echo 'rand[1, 10]';
247 bằng cách sử dụng chuỗi truy vấn phức tạp hơn nàyecho 'rand[1, 10]';
23Liên kết của chúng tôi vượt qua hai biến lần này.
echo 'rand[1, 10]';
323 và echo 'rand[1, 10]';
324. Ngay cả trong một URL liên kết, các biến được phân tách bằng dấu và [echo 'rand[1, 10]';
325, nên được viết là echo 'rand[1, 10]';
326 trong HTML; tuy nhiên, nếu bạn sử dụng sai echo 'rand[1, 10]';
325, hầu hết các trình duyệt sẽ sửa nó cho bạn] trong chuỗi truy vấn. Bằng cách tách từng cặp echo 'rand[1, 10]';
328 khỏi cặp tiếp theo bằng dấu và, bạn có thể chuyển nhiều biến hơn nữaHai giá trị biến trong tệp
echo 'rand[1, 10]';
247 của chúng tôi có thể được sử dụng như trước đâyThí dụ. PHP-GET-TwoVars
echo 'rand[1, 10]';
24Sử dụng một loạt các nối chuỗi [
echo 'rand[1, 10]';
272], câu lệnh echo 'rand[1, 10]';
405 xuất ra "Chào mừng bạn đến với trang web của chúng tôi", theo sau là giá trị của echo 'rand[1, 10]';
332 [an toàn để hiển thị bằng cách sử dụng echo 'rand[1, 10]';
294], một khoảng trắng, giá trị của echo 'rand[1, 10]';
334 [một lần nữa, được xử lý bằng echo 'rand[1, 10]';
294] Kết quả là hình bên dưới
Chúng tôi muốn tiếp tục với ví dụ về thông báo chào mừng được cá nhân hóa, trong đó chúng tôi muốn mời người dùng nhập tên của họ và tên đó sẽ xuất hiện trên trang kết quả, nhưng chúng tôi vẫn chưa đạt được điều đó về mặt người dùng thực sự . Chúng tôi sẽ cần sử dụng biểu mẫu HTML để cho phép người dùng nhập giá trị
Truyền biến trong biểu mẫu
Để tạo biểu mẫu, hãy xóa mã liên kết khỏi
echo 'rand[1, 10]';
245 và thay thế bằng mã HTML nàyThí dụ. PHP-GET-Biểu mẫu
echo 'rand[1, 10]';
25Biểu mẫu được tạo bởi mã này được hiển thị trong trình duyệt như trong hình bên dưới
Ghi chú. Để làm cho biểu mẫu đẹp hơn một chút, tôi đã thêm một số CSS [tìm thấy trong
echo 'rand[1, 10]';
337 trong mã mẫu]. Tôi sẽ bao gồm tệp CSS này trên bất kỳ trang nào có biểu mẫu vì nó rất chung chung và có thể được sử dụng để hiển thị bất kỳ biểu mẫu nào ở định dạng ngắt dòng đầu vào nhãnTuy nhiên, vì đây là sách về PHP và MySQL nên tôi sẽ không đi chi tiết về cách hoạt động của CSS. Để được hướng dẫn về cách tạo kiểu cho biểu mẫu của bạn bằng CSS, hãy xem HTML5 & CSS3 của SitePoint cho Thế giới thực
Khi bạn nhấp vào nút gửi [có nhãn GO], trình duyệt sẽ tải
echo 'rand[1, 10]';
247 và tự động thêm các biến và giá trị của chúng vào chuỗi truy vấn cho bạn. Biểu mẫu này có tác dụng tương tự như liên kết thứ hai mà chúng tôi đã xem xét trong phần "Chuyển biến trong liên kết" ở trên [với echo 'rand[1, 10]';
338 trong chuỗi truy vấn]. Nó lấy các giá trị từ văn bản mà người dùng nhập vào các trường văn bản trong khi truy xuất tên biến từ thuộc tính tên của đầu vào echo 'rand[1, 10]';
340Giá trị của
echo 'rand[1, 10]';
342 [như được sử dụng trong echo 'rand[1, 10]';
245 ở trên] khiến các biến và giá trị của chúng được chuyển qua chuỗi truy vấn [và xuất hiện trong mảng echo 'rand[1, 10]';
260 của PHP], nhưng cũng có thể sử dụng một giải pháp thay thế. Điều gì sẽ xảy ra nếu chúng tôi bao gồm một yếu tố echo 'rand[1, 10]';
345 trong biểu mẫu để cho phép người dùng nhập một lượng lớn văn bản? . Tùy chọn khác là để trình duyệt truyền dữ liệu một cách bí mật và đằng sau hậu trườngChỉnh sửa lại tệp
echo 'rand[1, 10]';
245 của bạn và thay đổi phương thức biểu mẫu thành echo 'rand[1, 10]';
347echo 'rand[1, 10]';
26Với giá trị thuộc tính phương thức mới này, trình duyệt được yêu cầu gửi các biến biểu mẫu như một phần của yêu cầu trang một cách vô hình thay vì mã hóa chúng trong chuỗi truy vấn URL
Các biến không còn xuất hiện trong mảng
echo 'rand[1, 10]';
260 của PHP vì chúng tôi không còn gửi chúng như một phần của chuỗi truy vấn nữa; . Do đó, chúng ta phải thay đổi echo 'rand[1, 10]';
247 để truy xuất các giá trị từ mảng mới này, đó là echo 'rand[1, 10]';
349Thí dụ. PHP-POST-Biểu mẫu
echo 'rand[1, 10]';
27Trang kết quả sau khi biểu mẫu mới này được gửi được mô tả trong hình bên dưới
Sự khác biệt duy nhất giữa biểu mẫu này và biểu mẫu trước đó là khi người dùng nhấp vào nút GO, URL của trang tải sẽ không chứa chuỗi truy vấn. Tuy nhiên, nếu người dùng đánh dấu trang xuất phát từ việc gửi biểu mẫu, thì dấu trang đó sẽ vô dụng vì nó thiếu các giá trị đã gửi. Một mặt, điều này cho phép bạn bao gồm các giá trị lớn [hoặc giá trị nhạy cảm chẳng hạn như mật khẩu và số thẻ tín dụng] trong dữ liệu được gửi bởi biểu mẫu mà chúng không xuất hiện trong chuỗi truy vấn. Nếu bạn đánh dấu một trang kết quả tìm kiếm của Google, bạn có thể sử dụng dấu trang đó để chạy lại tìm kiếm đó sau này vì các cụm từ tìm kiếm được chứa trong URL. Tình cờ, đây là lý do chính tại sao các công cụ tìm kiếm sử dụng chuỗi truy vấn để gửi cụm từ tìm kiếm
Ghi chú. Nói chung, bạn chỉ nên sử dụng biểu mẫu
echo 'rand[1, 10]';
351 khi gửi chúng không dẫn đến thay đổi nào đối với máy chủ, chẳng hạn như khi yêu cầu danh sách kết quả tìm kiếm. Người dùng có thể đánh dấu trang kết quả tìm kiếm và quay lại trang đó mà không cần phải nhập lại cụm từ tìm kiếm vì cụm từ tìm kiếm được bao gồm trong URL, nhưng bạn nên sử dụng echo 'rand[1, 10]';
352 nếu tệp bị xóa, cơ sở dữ liệu được cập nhật hoặc bản ghi bị xóa . Lý do chính đằng sau điều này là để ngăn khả năng tạo bản ghi trùng lặp nếu người dùng đánh dấu trang hoặc sử dụng nút quay lại trên trình duyệt của họMọi thứ được gửi qua
echo 'rand[1, 10]';
351 đều xuất hiện trong URL và được lưu trong lịch sử và dấu trang của người dùng, đây là những nơi cực kỳ không an toàn đối với thông tin nhạy cảm như mật khẩu và số thẻ tín dụngĐiều đó bao gồm các nguyên tắc cơ bản của việc sử dụng biểu mẫu để tạo tương tác người dùng đơn giản với PHP;
Ẩn đường may
Bây giờ bạn đã quen thuộc với cú pháp cơ bản của ngôn ngữ lập trình PHP, bạn biết cách thêm mã PHP vào bất kỳ trang web HTML nào và đổi tên nó bằng phần mở rộng tệp
echo 'rand[1, 10]';
3 để tạo các trang mới theo yêu cầu. Đối với một ngày làm việc, không tệGiả sử mục tiêu của bạn là tạo các trang web dựa trên cơ sở dữ liệu đáp ứng các tiêu chuẩn chuyên nghiệp, có một vài nhược điểm khó coi mà chúng ta cần phải làm sạch trước khi tiếp tục, mặc dù vậy, tôi muốn tạm dừng và xem xét kỹ các ví dụ mà chúng ta đã thảo luận
Tôi sẽ sử dụng những kỹ thuật này trong suốt phần còn lại của cuốn sách này để đảm bảo rằng, cho dù ví dụ đơn giản đến đâu, bạn vẫn có thể cảm thấy tự tin về chất lượng sản phẩm mà mình đang phân phối.
Mẫu PHP
Chèn mã PHP trực tiếp vào các trang HTML của bạn đã hoạt động tốt trong các ví dụ đơn giản mà chúng tôi đã thấy cho đến nay, nhưng do số lượng mã PHP cần thiết để tạo một trang trung bình tăng lên nên việc quản lý có thể trở nên khó khăn.
Có những khối lớn mã PHP khó hiểu xen kẽ với HTML là một công thức dẫn đến thảm họa, đặc biệt nếu bạn làm việc trong một nhóm các nhà thiết kế web không đặc biệt hiểu biết về PHP. Quá dễ dàng để các nhà thiết kế vô tình sửa đổi mã PHP, dẫn đến các lỗi mà họ không thể sửa được
Một chiến lược hiệu quả hơn nhiều là tách phần lớn mã PHP của bạn và đặt nó vào tệp riêng của nó, để phần lớn HTML không có mã PHP
Câu lệnh PHP
echo 'rand[1, 10]';
356, cho phép bạn chèn nội dung của một tệp khác vào mã PHP của bạn tại điểm của câu lệnh, là chìa khóa để thực hiện điều này. Hãy tạo lại ví dụ về vòng lặp "đếm đến mười" echo 'rand[1, 10]';
613 mà chúng ta đã xem xét trước đó để chứng minh cách thức hoạt động của nóTạo một tệp mới có tên là
echo 'rand[1, 10]';
359 trong thư mục echo 'rand[1, 10]';
8 của bạn, sau đó mở nó để chỉnh sửa và nhập mã sauecho 'rand[1, 10]';
28Vâng, đó là toàn bộ mã cho tệp này; . Bây giờ bạn đã quen thuộc với vòng lặp
echo 'rand[1, 10]';
613, nhưng cho phép tôi nêu bật các yếu tố đáng chú ý của mã này- Tập lệnh này sẽ thêm các số từ 1 đến 10 vào một biến có tên
363 thay vìecho 'rand[1, 10]';
405 loại bỏ các số đó, vì vậy khi bắt đầu tập lệnh này, chúng tôi đặt biến này thành một chuỗi trốngecho 'rand[1, 10]';
- Toán tử
366 mà bạn thấy ở đây là một cách viết tắt để thêm một giá trị vào cuối một biến chuỗi hiện có, bằng cách kết hợp toán tử gán và nối chuỗi thành một. Dòngecho 'rand[1, 10]';
364 thêm từng số [theo sau là khoảng trắng] vào cuối biếnecho 'rand[1, 10]';
363. Dòng này nên được viết bằng tay nhưecho 'rand[1, 10]';
367, nhưng sử dụng toán tửecho 'rand[1, 10]';
366 sẽ giúp bạn tiết kiệm thời gian đánh máyecho 'rand[1, 10]';
- Bạn có thể coi câu lệnh
356 như một kiểu sao chép và dán vì nó yêu cầu PHP thực thi nội dung của tệpecho 'rand[1, 10]';
370 tại vị trí này. Mởecho 'rand[1, 10]';
370, sao chép nội dung và dán chúng vàoecho 'rand[1, 10]';
359, thay thế dòngecho 'rand[1, 10]';
356, sẽ tạo ra kết quả tương tựecho 'rand[1, 10]';
- Tệp không kết thúc bằng
2 để khớp với phần mở đầuecho 'rand[1, 10]';
1, như bạn có thể nhận thấy. Bạn có thể thêm một cái nếu bạn thực sự muốn, nhưng không bắt buộc. Những bộ não lớn của cộng đồng PHP thường thích để nó ở cuối các tệp như tệp này chỉ chứa mã PHP. Nếu tệp PHP kết thúc bằng mã PHP, thì không cần chỉ ra mã đó kết thúc ở đâuecho 'rand[1, 10]';
Cần lưu ý rằng bên ngoài cuốn sách này, đôi khi bạn có thể thấy các dấu ngoặc đơn xung quanh tên tệp trong mã
echo 'rand[1, 10]';
356, mặc dù thực tế không phải vậy. Các dấu ngoặc đơn này, khi được sử dụng, chỉ phục vụ cho biểu thức tên tệp và do đó phù hợp trong cuốn sách này. Chẳng hạn, bạn có thể thấy echo 'rand[1, 10]';
382 thay vì echo 'rand[1, 10]';
381. Điều này cũng đúng với một lớp lót nổi tiếng khác, echo 'rand[1, 10]';
405Bạn nên tạo tệp
echo 'rand[1, 10]';
370 tiếp theo vì nó xuất hiện trong dòng cuối cùng của tệp echo 'rand[1, 10]';
359 của chúng tôiThí dụ. PHP-Đếm-Mẫu
echo 'rand[1, 10]';
29Ngoại trừ một dòng duy nhất hiển thị giá trị của biến
echo 'rand[1, 10]';
363—cùng một biến echo 'rand[1, 10]';
363 được tạo bởi tệp echo 'rand[1, 10]';
359—tệp này gần như hoàn toàn là HTML đơn giảnNhững gì chúng tôi tạo ra ở đây là một mẫu PHP, một trang HTML tĩnh chỉ chứa một lượng rất nhỏ mã PHP để chèn các giá trị động. Chúng tôi đã đặt mã để tạo các giá trị trong một tập lệnh PHP riêng biệt, được gọi là
echo 'rand[1, 10]';
359 trong trường hợp này, thay vì nhúng mã PHP phức tạp tạo ra các giá trị đó trong trangCác mẫu PHP như vậy cho phép bạn tập trung vào mã PHP của mình mà không bị phân tâm bởi mã HTML xung quanh, cho phép bạn giao các mẫu của mình cho các nhà thiết kế ngoại vi mà không phải lo lắng về những gì họ có thể làm với mã PHP của bạn
Mặc dù tôi muốn đặt tên cho các tệp mẫu PHP của mình bằng hậu tố
echo 'rand[1, 10]';
390, nhưng máy chủ web của bạn vẫn nhận ra chúng là tệp echo 'rand[1, 10]';
3;Nhập
echo 'rand[1, 10]';
393 vào trình duyệt của bạn để xem các trang của chúng tôi hiện đang hoạt động như thế nào và bạn sẽ thấy đầu ra của tập lệnh echo 'rand[1, 10]';
359 được hiển thị trong mẫu echo 'rand[1, 10]';
370 của chúng tôiMối quan tâm về an ninh
Một vấn đề với việc tách mã HTML và PHP thành các tệp riêng biệt là ai đó có thể thực thi mã
echo 'rand[1, 10]';
390 mà không đưa mã đó vào tệp PHP tương ứng. Đây không phải là vấn đề lớn, nhưng bất kỳ ai cũng có thể truy cập trực tiếp vào echo 'rand[1, 10]';
370. Bạn sẽ thấy thông báo lỗi nếu bạn nhập echo 'rand[1, 10]';
398 vào trình duyệt web của mình thay vì đếm từ một đến mườiTốt hơn là không cho phép người dùng chạy mã theo cách mà bạn không mong đợi bởi vì, tùy thuộc vào những gì trang đang làm, điều này có thể cho phép người dùng vượt qua các biện pháp bảo mật mà bạn đã đặt và truy cập nội dung mà họ không nên. Ví dụ, hãy xem xét đoạn mã sau
echo 'rand[1, 10]';
60Mã này làm cho có vẻ như bạn phải gửi biểu mẫu và nhập mật khẩu
echo 'rand[1, 10]';
600 để xem nội dung được bảo vệ trong echo 'rand[1, 10]';
601. Tuy nhiên, nếu ai đó có thể truy cập trực tiếp vào echo 'rand[1, 10]';
601 và xem nội dung của trang, điều đó sẽ loại bỏ nhu cầu kiểm tra bảo mật. Làm cho tất cả các tệp của bạn có thể truy cập được thông qua một URL dẫn đến các mối lo ngại bảo mật tiềm ẩn bổ sung, nhưng những điều này rất đơn giản để tránh. Có thể bao gồm các tệp từ các thư mục khác ngoài thư mục echo 'rand[1, 10]';
8Bạn có thể thắc mắc tại sao, sau khi ghi tất cả các tệp của chúng ta vào thư mục
echo 'rand[1, 10]';
8, môi trường phát triển đã tạo một thư mục echo 'rand[1, 10]';
8 bên trong thư mục echo 'rand[1, 10]';
605. Vâng, điều này là do những lo ngại về an ninh. Không có tệp nào bên ngoài thư mục echo 'rand[1, 10]';
8 có thể được truy cập qua URL [bằng cách nhập tên tệp vào trình duyệt web]Trong trường hợp của chúng tôi, thư mục
echo 'rand[1, 10]';
605, chứa thư mục echo 'rand[1, 10]';
8 mà chúng tôi đã ghi các tệp của mình vào, sẽ là thư mục khác mà lệnh echo 'rand[1, 10]';
356 sẽ được sửa đổi để bao gồm các tệp từĐây là cách nó sẽ xuất hiện trên máy chủ Windows. Câu hỏi đặt ra là, làm thế nào để tập lệnh PHP tìm thấy nó khi tệp bao gồm nằm trong một thư mục khác?
echo 'rand[1, 10]';
61Đây là cách nó sẽ xuất hiện trong môi trường Docker mà chúng tôi đang sử dụng
echo 'rand[1, 10]';
62Bởi vì chúng tôi đang sử dụng Docker, nên việc triển khai trang web cũng sẽ sử dụng cùng một môi trường Docker, vì vậy đây không thực sự là vấn đề trong những ngày này. Mặc dù phương pháp này sẽ hoạt động, nhưng nó không được mong muốn vì nó liên kết mã trang web của bạn với cấu hình máy chủ web của bạn. Nếu mã của bạn đề cập đến các ổ đĩa và thư mục dành riêng cho một máy chủ cụ thể, thì việc thả trang web dựa trên PHP của bạn vào bất kỳ máy chủ web hỗ trợ PHP nào và xem nó chạy là không thực tế. Nếu bạn cần di chuyển trang web của mình sang một ổ đĩa hoặc thư mục khác trên máy chủ đó, bạn sẽ tự làm khổ mình ngay cả khi bạn có cơ hội làm việc trên một máy chủ duy nhất
Vị trí của tệp so với tệp hiện tại được gọi là đường dẫn tương đối và khi bạn sử dụng
echo 'rand[1, 10]';
611, đây thực sự là đường dẫn tương đối. Thư mục của tập lệnh được chạy là nơi chứa _echo 'rand[1, 10]';
370Sử dụng đoạn mã sau để bao gồm một tệp từ thư mục trên
echo 'rand[1, 10]';
63echo 'rand[1, 10]';
370 sẽ được tìm thấy trong thư mục echo 'rand[1, 10]';
605 thay vì thư mục echo 'rand[1, 10]';
8 vì bit echo 'rand[1, 10]';
613 hướng dẫn PHP tìm tệp trong thư mục phía trên thư mục của tập lệnh hiện tạiThay đổi
echo 'rand[1, 10]';
359 để chỉ vị trí mới sau khi di chuyển echo 'rand[1, 10]';
370 lên một cấp vào thư mục echo 'rand[1, 10]';
605Thí dụ. PHP-Count-Template-Secured
echo 'rand[1, 10]';
64Đoạn mã trên sẽ thực thi thành công, nhưng có thể xảy ra sự cố khi bao gồm các tệp theo cách này. Các đường dẫn tương đối không liên quan đến từng tệp mà liên quan đến tập lệnh đã được thực thi
Đường dẫn có liên quan đến một thứ được gọi là thư mục làm việc hiện tại, khi bạn chạy tập lệnh PHP, ban đầu được đặt thành thư mục mà tập lệnh được lưu trữ trong đó. Ví dụ: nếu bạn mở
echo 'rand[1, 10]';
620 và thêm dòng echo 'rand[1, 10]';
621, bạn sẽ mong đợi echo 'rand[1, 10]';
622 được đưa vào từ thư mục echo 'rand[1, 10]';
605. Do đó, khi echo 'rand[1, 10]';
621 được chạy từ echo 'rand[1, 10]';
370, thì echo 'rand[1, 10]';
622 sẽ thực sự cố tải từ thư mục echo 'rand[1, 10]';
8Để làm cho vấn đề trở nên khó hiểu hơn, thư mục làm việc hiện tại có thể được thay đổi bằng cách sử dụng hàm
echo 'rand[1, 10]';
629, được đặt ở đầu tập lệnh và áp dụng cho tất cả các câu lệnh echo 'rand[1, 10]';
356, bất kể chúng nằm trong tệp nào.Kết quả là, chúng ta không thể phụ thuộc vào những điều sau đây
echo 'rand[1, 10]';
63Nó sẽ hoạt động, nhưng nếu thư mục bị sửa đổi hoặc
echo 'rand[1, 10]';
359 là một tệp bao gồm, thì nó có thể không tạo ra kết quả mong muốnMay mắn thay, PHP cung cấp một hằng số có tên là
echo 'rand[1, 10]';
631 [đó là hai dấu gạch dưới trước và sau từ echo 'rand[1, 10]';
632] sẽ luôn chứa đường dẫn chứa tệp hiện tại để vượt qua điều nàyChẳng hạn, bạn có thể sử dụng đoạn mã sau để tạo một tệp có tên
echo 'rand[1, 10]';
633 bên trong thư mục echo 'rand[1, 10]';
8_echo 'rand[1, 10]';
66Để đọc
echo 'rand[1, 10]';
370 từ thư mục trên echo 'rand[1, 10]';
8, có thể kết hợp toán tử echo 'rand[1, 10]';
639 và hằng số echo 'rand[1, 10]';
631. Điều này sẽ hiển thị echo 'rand[1, 10]';
635, là đường dẫn đầy đủ đến thư mục chứa echo 'rand[1, 10]';
633_echo 'rand[1, 10]';
67Do đó, giờ đây PHP sẽ tìm trong thư mục
echo 'rand[1, 10]';
8, chuyển lên một cấp thành echo 'rand[1, 10]';
605 và bao gồm echo 'rand[1, 10]';
370Tôi sẽ sử dụng phương pháp này để bao gồm các tệp trong suốt cuốn sách này vì
echo 'rand[1, 10]';
631 sẽ thay đổi tùy thuộc vào nơi tệp được lưu trữ và nó không phụ thuộc vào việc thay đổi thư mục làm việc hiện tạiThư mục
echo 'rand[1, 10]';
8 sẽ chứa mọi tập lệnh PHP mà người dùng cần truy cập trực tiếp cùng với mọi hình ảnh, tệp JavaScript và CSS mà trình duyệt yêu cầu. Từ giờ trở đi, chúng tôi sẽ chỉ ghi các tệp vào thư mục echo 'rand[1, 10]';
8 mà chúng tôi thực sự muốn người dùng có thể truy cập trực tiếp từ trình duyệt web của họ. Người dùng sẽ không thể truy cập trực tiếp vào bất kỳ tệp nào chỉ được tham chiếu bởi câu lệnh echo 'rand[1, 10]';
356 vì chúng sẽ được lưu trữ bên ngoài thư mục echo 'rand[1, 10]';
8Thật hợp lý khi lưu trữ các loại tệp bao gồm khác nhau trong các thư mục khác nhau để sắp xếp mọi thứ và tôi sẽ giới thiệu cho bạn một số loại tệp bao gồm khác nhau khi cuốn sách tiếp tục. Sau đó, chúng tôi có thể tham chiếu chúng trong một câu lệnh
echo 'rand[1, 10]';
356 bằng cách sử dụng echo 'rand[1, 10]';
654. Chúng tôi sẽ lưu trữ các tệp mẫu [có phần mở rộng echo 'rand[1, 10]';
390] bên trong một thư mục có tên là echo 'rand[1, 10]';
651 bên trong thư mục echo 'rand[1, 10]';
605Nhiều mẫu, một bộ điều khiển
Bạn có thể có nhiều câu lệnh
echo 'rand[1, 10]';
356 trong một tập lệnh PHP và để nó hiển thị các mẫu khác nhau trong các trường hợp khác nhau, đây là một trong những lợi ích của việc sử dụng câu lệnh echo 'rand[1, 10]';
356 để tải các tệp mẫu PHP của bạnThường được gọi là "bộ điều khiển", một tập lệnh PHP đáp ứng yêu cầu của trình duyệt bằng cách chọn một trong số các mẫu PHP để điền vào và gửi lại chứa logic xác định mẫu nào được gửi tới trình duyệt
Quay trở lại biểu mẫu chào mừng yêu cầu họ và tên của khách truy cập từ phần trước của chương này,
Chúng tôi sẽ bắt đầu bằng cách tạo mẫu PHP cho biểu mẫu, chúng tôi có thể thực hiện điều này bằng cách sử dụng lại tệp
echo 'rand[1, 10]';
245 mà chúng tôi đã tạo trước đó. Mã duy nhất bạn cần thay đổi trong tệp này là thuộc tính hành động của thẻ biểu mẫu, vì vậy hãy tạo một bản sao của echo 'rand[1, 10]';
245 có tên là echo 'rand[1, 10]';
661 và lưu nó vào thư mục echo 'rand[1, 10]';
651 bên trong echo 'rand[1, 10]';
605Thí dụ. PHP-Form-Controller
_echo 'rand[1, 10]';
68Như bạn có thể thấy, chúng tôi đang để trống thuộc tính hành động, hướng dẫn trình duyệt gửi biểu mẫu đã hoàn thành trở lại URL ban đầu, trong trường hợp này là URL của bộ điều khiển chứa tệp mẫu
Tạo một tệp
echo 'rand[1, 10]';
662 trong thư mục echo 'rand[1, 10]';
8 với đoạn mã sau để dùng làm bộ điều khiển của ví dụ_echo 'rand[1, 10]';
69Thoạt nhìn, mã này trông khá quen thuộc vì nó gần giống với tập lệnh
echo 'rand[1, 10]';
247 mà chúng ta đã tạo trước đó. Hãy để tôi mô tả các biến thể- Để xác định xem yêu cầu hiện tại có phải là gửi biểu mẫu trong
661 hay không, trước tiên bộ điều khiển phải xác định xem yêu cầu có chứa biếnecho 'rand[1, 10]';
323 hay không.echo 'rand[1, 10]';
667 là nơi PHP sẽ lưu giá trị nếu cóecho 'rand[1, 10]';
Nếu một biến cụ thể [hoặc phần tử của một mảng] có giá trị, hàm PHP tích hợp sẵn
668 sẽ cho bạn biết; .echo 'rand[1, 10]';
667 sẽ không được đặt nếuecho 'rand[1, 10]';
670 là saiecho 'rand[1, 10]';
Chúng tôi cần câu lệnh
452 này để kiểm tra xemecho 'rand[1, 10]';
667 không được đặt. Tôi muốn đặt mã gửi biểu mẫu vào bộ điều khiển của mình trước để dễ đọc. Để làm được điều này, chúng ta sử dụng toán tử not [echo 'rand[1, 10]';
675], cho phép chúng ta thay đổi giá trị mà một hàm trả về từ true thành false hoặc từ false thành trueecho 'rand[1, 10]';
Kết quả là,
677 sẽ trả về true và phần thân của câu lệnhecho 'rand[1, 10]';
452 sẽ được thực thi nếu yêu cầu không chứa biếnecho 'rand[1, 10]';
323echo 'rand[1, 10]';
- Bộ điều khiển bao gồm tệp
661 để hiển thị biểu mẫu nếu yêu cầu không liên quan đến việc gửi biểu mẫuecho 'rand[1, 10]';
- Nếu yêu cầu được thực hiện bằng một biểu mẫu, phần thân của câu lệnh
474 được thực thi ở vị trí của nóecho 'rand[1, 10]';
Các biến
323 vàecho 'rand[1, 10]';
324 được mã này lấy ra khỏi mảngecho 'rand[1, 10]';
349, sau đó tạo thông báo chào mừng thích hợp cho tên đã nhậpecho 'rand[1, 10]';
- Bộ điều khiển lưu trữ thông báo chào mừng trong một biến có tên là
363 thay vìecho 'rand[1, 10]';
405ing nóecho 'rand[1, 10]';
- Bộ điều khiển bao gồm mẫu
686, mẫu này sẽ hiển thị thông báo chào mừng phù hợp sau khi được tạoecho 'rand[1, 10]';
Viết tệp
echo 'rand[1, 10]';
686 vào thư mục echo 'rand[1, 10]';
651 là bước cuối cùngecho 'rand[1, 10]';
0Bây giờ hãy mở trình duyệt của bạn và điều hướng đến
echo 'rand[1, 10]';
689. URL sẽ không đổi trong suốt quá trình này và bạn sẽ được hỏi tên của mình và sau khi gửi biểu mẫu, bạn sẽ thấy thông báo chào mừng phù hợpNhư bạn có thể nhận thấy, tôi đã yêu cầu bạn đặt tên tệp là
echo 'rand[1, 10]';
662 thay vì echo 'rand[1, 10]';
247 hoặc một tên tương tự khác vì nó có ý nghĩa đặc biệt. Nếu bạn không nhập tên tệp khi truy cập URL trong trình duyệt của mình, máy chủ sẽ tìm tệp có tên echo 'rand[1, 10]';
662 và hiển thị tệp đó; . Trong trình duyệt của bạn, hãy thử chỉ nhập echo 'rand[1, 10]';
695 để xem trang chỉ mụcLưu ý rằng các cấu hình khác nhau của máy chủ web có thể chỉ định một tệp khác làm chỉ mục thư mục. Nhưng
echo 'rand[1, 10]';
662 sẽ hoạt động trên phần lớn các máy chủ web mà không cần bất kỳ cấu hình bổ sung nàoMột lợi thế của việc sử dụng cùng một URL cho toàn bộ quá trình hỏi tên người dùng và hiển thị thông báo chào mừng là người dùng có thể đánh dấu trang bất kỳ lúc nào và nhận được kết quả hợp lý. Cho dù đó là trang có biểu mẫu hay trang có thông báo chào mừng mà người dùng đánh dấu, khi họ quay lại, biểu mẫu sẽ ở đó một lần nữa. Quay lại URL riêng của thông báo chào mừng trong lần lặp trước của ví dụ này mà không gửi biểu mẫu sẽ dẫn đến thông báo chào mừng bị hỏng ["Chào mừng đến với trang web của chúng tôi" hoặc ". "] hoặc thông báo lỗi PHP nếu máy chủ, giống như máy chủ của chúng tôi, đang chạy với tính năng báo cáo lỗi được bật
Xin lưu ý rằng tôi sẽ trình bày cách ghi nhớ tên người dùng giữa các lượt truy cập trong Chương 11, nơi chúng ta thảo luận về "các phiên. "
Đưa vào cơ sở dữ liệu
Chúng ta đã khám phá tất cả các tính năng cơ bản của ngôn ngữ trong chương này, bao gồm câu lệnh, biến, toán tử, nhận xét và cấu trúc điều khiển, đồng thời chúng ta đã thấy ngôn ngữ kịch bản phía máy chủ PHP hoạt động. Mặc dù các ứng dụng mẫu mà chúng tôi đã xem khá đơn giản, chúng tôi vẫn dành thời gian để đảm bảo rằng các URL của chúng hấp dẫn và các mẫu HTML cho các trang mà chúng tạo ra không có mã PHP chi phối chúng
Sức mạnh thực sự của PHP, như bạn có thể đã bắt đầu nghi ngờ, nằm ở hàng trăm [thậm chí hàng ngàn] chức năng tích hợp sẵn, cho phép bạn gửi email, truy cập dữ liệu trong cơ sở dữ liệu MySQL, tạo hình ảnh động và thậm chí tạo
Chúng ta sẽ khám phá các hàm MySQL có trong PHP ở Chương 3, tạo cơ sở dữ liệu truyện cười, sau đó xuất bản cơ sở dữ liệu truyện cười đó lên Web trong Chương 4. Mục tiêu cuối cùng của cuốn sách này là chỉ cho bạn cách xây dựng một hệ thống quản lý nội dung đầy đủ cho trang web của bạn bằng cách sử dụng PHP và MySQL
Chia sẻ bài viết này
Với bằng tiến sĩ về các phương pháp hay nhất về công nghệ phần mềm, Tom Butler, nhà phát triển web và giảng viên đại học, thích so sánh các cách tiếp cận khác nhau để giải quyết các thách thức về viết mã
Bài viết sau đây là một đoạn trích từ PHP & MySQL. Novice to Ninja, Phiên bản thứ 7, hướng dẫn thực hành để tìm hiểu tất cả các công cụ, nguyên tắc và kỹ thuật cần thiết để xây dựng một ứng dụng web chuyên nghiệp. Trong hướng dẫn thứ hai của loạt bài này, bạn sẽ tìm hiểu những kiến thức cơ bản về PHP, bao gồm câu lệnh, biến, toán tử, nhận xét và cấu trúc điều khiển
- Thiết lập môi trường phát triển PHP của bạn với Docker
- Hướng dẫn cho người mới bắt đầu về PHP
- Giới thiệu MySQL. Hướng dẫn cho người mới bắt đầu
- Hiển thị dữ liệu từ MySQL trên Web. một lời giới thiệu
Bây giờ bạn đã thiết lập và chạy máy chủ của mình, đã đến lúc viết tập lệnh PHP đầu tiên của bạn. PHP là ngôn ngữ phía máy chủ. Khái niệm này có thể hơi khó nắm bắt, đặc biệt nếu bạn chỉ từng thiết kế các trang web sử dụng các ngôn ngữ phía máy khách như HTML, CSS và JavaScript
Ngôn ngữ phía máy chủ tương tự như JavaScript ở chỗ nó cho phép bạn nhúng nội dung được tạo động vào mã HTML của trang web, giúp bạn kiểm soát tốt hơn những gì xuất hiện trong cửa sổ trình duyệt so với chỉ HTML có thể cung cấp. Sự khác biệt chính giữa JavaScript và PHP là giai đoạn mã được chạy
Các ngôn ngữ phía máy khách như JavaScript được trình duyệt web đọc và thực thi sau khi tải xuống trang web [các chương trình nhúng và tất cả] từ máy chủ web. Ngược lại, các ngôn ngữ phía máy chủ như PHP được điều hành bởi máy chủ web, trước khi trang web được gửi tới trình duyệt. Trong khi các ngôn ngữ phía máy khách cho phép bạn kiểm soát cách một trang hoạt động sau khi nó được trình duyệt hiển thị, thì các ngôn ngữ phía máy chủ cho phép bạn tạo các trang tùy chỉnh một cách nhanh chóng trước khi chúng được gửi tới trình duyệt
Khi máy chủ web đã thực thi mã PHP được nhúng trong trang web, kết quả sẽ thay thế mã PHP trong trang. Tất cả những gì trình duyệt nhìn thấy là mã HTML tiêu chuẩn khi nó nhận được trang. Đó là lý do tại sao PHP được gọi là “ngôn ngữ phía máy chủ”. công việc của nó được thực hiện trên máy chủ
Ghi chú. trong những ngày đầu của Web — và khi ấn bản đầu tiên của cuốn sách này được xuất bản. - JavaScript là ngôn ngữ kịch bản phía máy khách được sử dụng chủ yếu trong trình duyệt. Sau đó, cùng với các công nghệ như Ajax, cho phép JavaScript giao tiếp với máy chủ. Và gần đây, JavaScript đã được sử dụng cả trong trình duyệt và trên máy chủ để tạo các ứng dụng dựa trên cơ sở dữ liệu. Mặc dù những cách sử dụng mới này cho JavaScript mang lại những khả năng thú vị, nhưng vẫn còn rất nhiều chỗ cho PHP — như cuốn sách này sẽ chứng minh
Mã PHP được viết bằng các thẻ PHP. Giống như hầu hết các thẻ HTML, PHP có thẻ bắt đầu và thẻ kết thúc.
echo 'rand[1, 10]';
1 và echo 'rand[1, 10]';
2 tương ứng. Mọi thứ bên trong các thẻ PHP này được coi là mã PHP và chạy trên máy chủMã PHP phải được đặt trong một tệp có phần mở rộng
echo 'rand[1, 10]';
3. Khi ai đó kết nối với máy chủ và yêu cầu máy chủ tải một tệp có phần mở rộng echo 'rand[1, 10]';
3, thì máy chủ sẽ chạy nó dưới dạng tập lệnh PHP. Nếu bạn đặt các thẻ PHP trong một tệp có đuôi echo 'rand[1, 10]';
5 hoặc bất kỳ phần mở rộng nào khác ngoài echo 'rand[1, 10]';
3, máy chủ web sẽ không chạy bất kỳ mã PHP nào và mã PHP sẽ được gửi trực tiếp đến trình duyệt — trình duyệt này không hiểu mã PHPChúng ta hãy xem một tập lệnh PHP
Thí dụ. PHP-RandomNumber
echo 'rand[1, 10]';
54Để chạy mã này, hãy lưu nó dưới dạng
echo 'rand[1, 10]';
7 trong thư mục echo 'rand[1, 10]';
8 và điều hướng đến echo 'rand[1, 10]';
9Hầu hết đây là HTML đơn giản. Chỉ có dòng giữa
echo 'rand[1, 10]';
1 và echo 'rand[1, 10]';
2 là mã PHP. echo 'rand[1, 10]';
1 đánh dấu sự bắt đầu của tập lệnh PHP được nhúng và echo 'rand[1, 10]';
2 đánh dấu sự kết thúc của nó. Máy chủ web được yêu cầu diễn giải mọi thứ giữa hai dấu phân cách này và chuyển đổi nó thành mã HTML thông thường trước khi gửi trang web tới trình duyệt yêu cầu. Nếu bạn nhấp chuột phải vào bên trong trình duyệt của mình và chọn Xem nguồn [nhãn có thể khác tùy thuộc vào trình duyệt bạn đang sử dụng], bạn có thể thấy rằng trình duyệt được hiển thị như thế nàyecho 'rand[1, 10]';
62Không có tệp HTML nào trên máy chủ chứa mã chính xác này. HTML này được tạo động trên máy chủ trước khi được gửi tới trình duyệt
Hãy thử chạy tập lệnh một vài lần và để ý xem số thay đổi như thế nào. Mã PHP đã được sử dụng để tạo một số ngẫu nhiên, nhưng tất cả các dấu hiệu của mã PHP đã biến mất khi xem mã nguồn trong trình duyệt. Thay vào đó, đầu ra của tập lệnh đã xuất hiện và nó trông giống như HTML tiêu chuẩn. Ví dụ này cho thấy một số ưu điểm của kịch bản phía máy chủ
- Bảo vệ. Trong ví dụ trên, chúng tôi đã đặt một số ngẫu nhiên do máy chủ web tạo vào trang web. Nếu chúng tôi đã chèn số bằng JavaScript, số này sẽ được tạo trong trình duyệt và ai đó có khả năng sửa đổi mã để chèn một số cụ thể
- Không có vấn đề tương thích với trình duyệt. Các tập lệnh PHP được giải thích bởi một mình máy chủ web, do đó, không cần phải lo lắng về việc liệu các tính năng ngôn ngữ bạn đang sử dụng có được hỗ trợ bởi trình duyệt của khách truy cập hay không
- Truy cập vào tài nguyên phía máy chủ. Mã trên máy chủ có thể làm bất cứ điều gì; . HTML kết quả có thể được tạo từ cơ sở dữ liệu hoặc tệp Excel hoặc có thể là kết quả của phép tính, chẳng hạn như tổng số giỏ hàng của người dùng
- Giảm tải cho khách hàng. JavaScript có thể làm chậm đáng kể việc hiển thị trang web [đặc biệt là trên thiết bị di động. ], vì trình duyệt phải tải xuống rồi chạy tập lệnh trước khi có thể hiển thị trang web. Với mã phía máy chủ, gánh nặng này được chuyển đến máy chủ web mà bạn có thể tạo ra mạnh mẽ như ứng dụng của mình yêu cầu [và ví của bạn có thể chi trả được]
- Sự lựa chọn. Khi viết mã chạy trên trình duyệt, trình duyệt phải hiểu cách chạy mã được cung cấp cho nó. Tất cả các trình duyệt hiện đại đều hiểu HTML, CSS và JavaScript. Để viết một số mã chạy trên trình duyệt, bạn phải sử dụng một trong những ngôn ngữ này. Bằng cách chạy mã trên máy chủ tạo HTML, bạn có thể lựa chọn nhiều ngôn ngữ — một trong số đó là PHP
Cú pháp và câu lệnh cơ bản
Cú pháp PHP sẽ rất quen thuộc với bất kỳ ai có hiểu biết về JavaScript, C, C++, C#, Objective-C, Java, Perl hoặc bất kỳ ngôn ngữ có nguồn gốc từ C nào khác. Nhưng nếu những ngôn ngữ này không quen thuộc với bạn hoặc nếu bạn là người mới lập trình nói chung, thì không cần phải lo lắng
Một tập lệnh PHP bao gồm một loạt các lệnh hoặc câu lệnh. Mỗi câu lệnh là một hướng dẫn mà máy chủ web phải tuân theo trước khi có thể chuyển sang hướng dẫn tiếp theo. Các câu lệnh PHP, giống như các câu lệnh trong các ngôn ngữ nói trên, luôn được kết thúc bằng dấu chấm phẩy [
echo 'rand[1, 10]';
6204]Đây là một câu lệnh PHP điển hình
echo 'rand[1, 10]';
64Đây là câu lệnh
echo 'rand[1, 10]';
6205, dùng để tạo nội dung [thường là mã HTML] để gửi tới trình duyệt. Một câu lệnh echo 'rand[1, 10]';
6205 chỉ cần lấy văn bản được cung cấp và chèn nó vào mã HTML của trang tại vị trí đặt tập lệnh PHPTrong trường hợp này, chúng tôi đã cung cấp một chuỗi văn bản được xuất ra.
echo 'rand[1, 10]';
6207. Lưu ý rằng chuỗi văn bản chứa các thẻ HTML [echo 'rand[1, 10]';
6208and echo 'rand[1, 10]';
6209], điều này hoàn toàn có thể chấp nhận đượcVì vậy, nếu chúng tôi lấy câu lệnh này và đặt nó vào một trang web hoàn chỉnh, thì đây là mã kết quả
Thí dụ. PHP-Echo
echo 'rand[1, 10]';
70Nếu bạn đặt tệp này trên máy chủ web của mình và sau đó yêu cầu nó bằng trình duyệt web, trình duyệt của bạn sẽ nhận được mã HTML này
echo 'rand[1, 10]';
71Ví dụ về
echo 'rand[1, 10]';
7 mà chúng ta đã xem xét trước đó chứa một câu lệnh echo 'rand[1, 10]';
6205 phức tạp hơn một chútecho 'rand[1, 10]';
74Bạn sẽ nhận thấy rằng, trong ví dụ đầu tiên, PHP được cung cấp một số văn bản để in trực tiếp và trong ví dụ thứ hai, PHP được cung cấp hướng dẫn để làm theo. PHP cố gắng đọc bất kỳ thứ gì tồn tại bên ngoài dấu ngoặc kép như một hướng dẫn mà nó phải tuân theo. Bất cứ điều gì bên trong dấu ngoặc kép được coi là văn bản - hoặc, để sử dụng thuật ngữ kỹ thuật, như một chuỗi. PHP không xử lý các chuỗi dưới dạng các lệnh để tuân theo. Chúng được coi là dữ liệu trong ứng dụng. Bạn có thể làm mọi thứ với chúng, chẳng hạn như gửi chúng tới trình duyệt, nhưng PHP không xử lý chuỗi này khác với chuỗi khác
Vì vậy, đoạn mã sau sẽ chuyển chuỗi
echo 'rand[1, 10]';
6207 trực tiếp tới lệnh echo 'rand[1, 10]';
6205echo 'rand[1, 10]';
64Một chuỗi được biểu thị bằng dấu ngoặc kép bắt đầu và dấu ngoặc kép kết thúc. PHP sẽ xem
echo 'rand[1, 10]';
6214 đầu tiên là phần đầu của chuỗi và tìm echo 'rand[1, 10]';
6214 tiếp theo và sử dụng nó làm phần cuối của chuỗiBất cứ điều gì bên ngoài dấu ngoặc kép được coi là một loạt các lệnh để chạy. Sau đây không phải là mã hợp lệ
echo 'rand[1, 10]';
80Vì các trích dẫn đã bị xóa, trước tiên PHP sẽ thử chạy lệnh
echo 'rand[1, 10]';
6216, sau đó là lệnh echo 'rand[1, 10]';
6217, tiếp theo là lệnh echo 'rand[1, 10]';
6218, v.v. Vì không có lệnh nào trong số này là lệnh hợp lệ trong PHP, đoạn mã trên sẽ tạo ra thông báo lỗi. Nếu bạn muốn coi nội dung nào đó là văn bản, hãy nhớ đặt dấu ngoặc kép xung quanh nội dung đóNgược lại, đoạn mã sau sẽ chạy một lệnh hợp lệ — “hàm” tích hợp sẵn
echo 'rand[1, 10]';
6219 — để tạo một số ngẫu nhiên rồi chuyển kết quả cho lệnh echoecho 'rand[1, 10]';
74Hàm là một loại lệnh đặc biệt thực hiện một nhiệm vụ cụ thể. Đằng sau hậu trường, PHP sẽ thực hiện một số xử lý và sau đó tạo ra kết quả. Trong trường hợp này, hàm
echo 'rand[1, 10]';
6219 sẽ tạo ra một số ngẫu nhiên, nhưng các hàm khác nhau thực hiện các tác vụ khác nhauBạn có thể nhanh chóng xác định xem thứ gì đó có phải là hàm hay không vì nó được theo sau bởi dấu ngoặc đơn. PHP có nhiều chức năng tích hợp sẵn cho phép bạn thực hiện mọi thứ, chẳng hạn như gửi email và làm việc với thông tin được lưu trữ trong nhiều loại cơ sở dữ liệu khác nhau
PHP sẽ không cố chạy bất cứ thứ gì bên trong một chuỗi. Đoạn mã sau sẽ không xử lý hàm
echo 'rand[1, 10]';
6219echo 'rand[1, 10]';
PHP sẽ xem
echo 'rand[1, 10]';
6222 dưới dạng một chuỗi và sẽ gửi văn bản echo 'rand[1, 10]';
6223 tới trình duyệt, đây có thể không phải là điều bạn muốn làm. Điều quan trọng là phải hiểu sự khác biệt giữa chuỗi và mã. PHP sẽ xem bất kỳ văn bản nào bên ngoài dấu ngoặc kép dưới dạng một loạt lệnh mà nó phải tuân theo. Mọi thứ bên trong dấu ngoặc kép là một chuỗi và là dữ liệu mà PHP sẽ làm việc vớiPHP không cố hiểu các chuỗi. Chúng có thể chứa bất kỳ ký tự nào theo bất kỳ thứ tự nào. Nhưng mã [bất cứ thứ gì không nằm trong dấu ngoặc kép] - về cơ bản là một loạt hướng dẫn - phải tuân theo một cấu trúc cứng nhắc để máy tính hiểu được mã đó
Ghi chú. sử dụng trình chỉnh sửa mã có tô sáng cú pháp giúp bạn dễ dàng nhanh chóng xem liệu thứ gì đó là chuỗi hay mã. Các chuỗi sẽ có màu khác với mã cần được xử lý
Hình ảnh bên dưới hiển thị đánh dấu mã đơn giản trong trình chỉnh sửa Visual Studio Code
PHP hỗ trợ cả dấu ngoặc đơn [
echo 'rand[1, 10]';
6214] và dấu ngoặc kép [echo 'rand[1, 10]';
6225] để bao bọc các chuỗi. Đối với hầu hết các mục đích, chúng có thể hoán đổi cho nhau. Các nhà phát triển PHP có xu hướng ưu tiên các dấu ngoặc đơn, bởi vì chúng tôi xử lý mã HTML rất nhiều, mã này có xu hướng chứa nhiều dấu ngoặc kép. Ví dụecho 'rand[1, 10]';
620Nếu dấu ngoặc kép được sử dụng ở mỗi đầu ở đây, chúng ta cần thông báo cho PHP rằng câu trích dẫn sau
echo 'rand[1, 10]';
6226 không phải là phần cuối của chuỗi bằng cách đặt một dấu ngoặc kép trước nó [được gọi là ký tự thoát] và thực hiện tương tự với bất kỳ dấu ngoặc kép nào echo 'rand[1, 10]';
621Vì lý do này, các nhà phát triển PHP sử dụng dấu ngoặc đơn, mặc dù có một số khác biệt giữa dấu ngoặc đơn và dấu ngoặc kép. Tuy nhiên, đối với mục đích của chúng tôi ở đây, chúng có thể hoán đổi cho nhau một cách hiệu quả
Một chức năng có thể được coi là một chương trình thu nhỏ trong chương trình của bạn. Bạn có thể hướng dẫn PHP chạy chức năng bằng cách sử dụng tên của nó [chẳng hạn như
echo 'rand[1, 10]';
6219 trong ví dụ của chúng tôi trước đó] theo sau là dấu ngoặc đơn. Hướng dẫn echo 'rand[1, 10]';
6223 yêu cầu PHP chạy hàm có tên echo 'rand[1, 10]';
6219. Chạy một chức năng cũng thường được gọi là gọi một chức năngHầu hết các hàm trong PHP đều trả về một giá trị khi chúng được gọi. Sau khi giá trị được trả về, PHP sẽ hoạt động như thể bạn thực sự vừa nhập giá trị được trả về đó vào mã của mình. In the
echo 'rand[1, 10]';
6231 example, our echo 'rand[1, 10]';
6205 statement contains a call to the echo 'rand[1, 10]';
6219 function, which returns a random number as a string of text. Câu lệnh echo 'rand[1, 10]';
6205 sau đó xuất giá trị được trả về bởi lệnh gọi hàmMọi hàm trong PHP có thể có một hoặc nhiều đối số cho phép bạn làm cho hàm hoạt động theo một cách hơi khác. Hàm
echo 'rand[1, 10]';
6219 nhận hai đối số. một số ngẫu nhiên tối thiểu và tối đa. Bằng cách thay đổi các giá trị được truyền cho hàm, bạn có thể thay đổi cách thức hoạt động của hàm. Ví dụ: nếu bạn muốn một số ngẫu nhiên từ 1 đến 50, bạn có thể sử dụng mã nàyecho 'rand[1, 10]';
622Chúng tôi bao quanh các lập luận bằng dấu ngoặc đơn [
echo 'rand[1, 10]';
6236] vì hai lý do. Đầu tiên, họ chỉ ra rằng echo 'rand[1, 10]';
6219 là một chức năng mà bạn muốn gọi. Thứ hai, chúng đánh dấu phần đầu và phần cuối của danh sách các đối số — các câu lệnh PHP mà bạn muốn cung cấp — để cho hàm biết bạn muốn nó làm gì. Trong trường hợp của hàm echo 'rand[1, 10]';
6219, bạn cần cung cấp giá trị tối thiểu và tối đa. Các giá trị đó được phân tách bằng dấu phẩySau này, chúng ta sẽ xem xét các hàm nhận các loại đối số khác nhau. Chúng tôi cũng sẽ xem xét các hàm không có đối số nào cả. Các hàm này sẽ vẫn cần dấu ngoặc đơn, mặc dù sẽ không có gì được nhập giữa chúng
Biến, toán tử và nhận xét
Biến
Biến trong PHP giống với biến trong hầu hết các ngôn ngữ lập trình khác. Đối với những người không quen biết, một biến có thể được coi là tên được đặt cho một hộp tưởng tượng mà bất kỳ giá trị nào cũng có thể được đặt vào đó. Câu lệnh sau đây tạo một biến có tên là
echo 'rand[1, 10]';
6239 [tất cả các tên biến trong PHP đều bắt đầu bằng ký hiệu đô la] và gán cho nó một giá trị là echo 'rand[1, 10]';
6240echo 'rand[1, 10]';
623PHP là một ngôn ngữ gõ lỏng lẻo. Điều này có nghĩa là một biến có thể chứa bất kỳ loại dữ liệu nào — có thể là số, chuỗi văn bản hoặc một số loại giá trị khác — và có thể lưu trữ các loại giá trị khác nhau trong suốt thời gian tồn tại của nó. Nếu bạn nhập câu lệnh sau sau câu lệnh được hiển thị ở trên, nó sẽ gán một giá trị mới cho
echo 'rand[1, 10]';
6239 hiện có. Mặc dù biến echo 'rand[1, 10]';
6239 được sử dụng để chứa một số, nhưng giờ đây nó sẽ chứa một chuỗi văn bảnecho 'rand[1, 10]';
624Khi bạn đã lưu trữ dữ liệu trong một biến, bạn có thể gửi dữ liệu đó đến trình duyệt bằng cách sử dụng lệnh
echo 'rand[1, 10]';
6205 từ trước đóecho 'rand[1, 10]';
625Khi mã này chạy, chữ số “3” sẽ được gửi tới trình duyệt để hiển thị trên trang
Ngoài các chuỗi hoặc số cụ thể, có thể lưu trữ kết quả của một hàm và sau đó sử dụng nó sau này trong tập lệnh
echo 'rand[1, 10]';
626nhà điều hành
Dấu bằng mà chúng ta đã sử dụng trong hai câu lệnh trước được gọi là toán tử gán, vì nó được sử dụng để gán giá trị cho các biến. [Có một cách khác để thực sự chỉ ra “bằng” trong PHP, như chúng ta sẽ thấy bên dưới. ] Các toán tử khác có thể được sử dụng để thực hiện các phép toán khác nhau trên các giá trị
echo 'rand[1, 10]';
627Từ những ví dụ này, bạn có thể biết rằng
echo 'rand[1, 10]';
6244 là toán tử cộng, echo 'rand[1, 10]';
6245 là toán tử trừ, echo 'rand[1, 10]';
6246 là toán tử nhân và echo 'rand[1, 10]';
6247 là toán tử chia. Tất cả đều được gọi là toán tử số học, vì chúng thực hiện phép tính số học trên các sốGhi chú. mỗi dòng số học ở trên kết thúc bằng một "nhận xét" sau dấu chấm phẩy. Nhận xét cho phép bạn mô tả mã của bạn đang làm gì. Họ chèn văn bản giải thích vào mã của bạn — văn bản mà trình thông dịch PHP sẽ bỏ qua
Nhận xét một dòng bắt đầu bằng
echo 'rand[1, 10]';
6248. Chú thích một dòng có thể nằm trên dòng riêng của nó hoặc, như trong ví dụ trên, chú thích có thể được đặt ở cuối dòng mãNếu bạn muốn một nhận xét trải dài trên nhiều dòng, hãy bắt đầu bằng
echo 'rand[1, 10]';
6249 và kết thúc bằng echo 'rand[1, 10]';
6250. Trình thông dịch PHP sẽ bỏ qua mọi thứ giữa hai dấu phân cách này. Tôi sẽ sử dụng các nhận xét trong suốt phần còn lại của cuốn sách này để giúp giải thích một số đoạn mã mà tôi trình bày.Một toán tử nối các chuỗi văn bản lại với nhau được gọi là toán tử nối chuỗi
echo 'rand[1, 10]';
628Các biến có thể được sử dụng ở hầu hết mọi nơi bạn sử dụng một giá trị. Hãy xem xét loạt tuyên bố này
echo 'rand[1, 10]';
629Đặc biệt lưu ý hai dòng cuối cùng. Nếu bạn đặt một biến trong dấu ngoặc đơn, nó sẽ in tên thay vì nội dung của biến. Ngược lại, khi sử dụng dấu ngoặc kép, biến trong chuỗi được thay thế bằng nội dung của biến
Việc đặt các biến bên trong dấu ngoặc kép hoạt động trong các tình huống đơn giản, nhưng trong phần lớn cuốn sách này, nó sẽ không sử dụng được vì chúng ta sẽ không sử dụng mã đơn giản như vậy. Vì vậy, bạn nên làm quen với việc thực hành nối [được hiển thị trong dòng thứ ba từ cuối cùng.
echo 'rand[1, 10]';
6251]Cấu trúc điều khiển
Các ví dụ về mã PHP mà chúng ta đã thấy cho đến nay hoặc là các tập lệnh một câu lệnh xuất ra một chuỗi văn bản cho trang web hoặc một loạt các câu lệnh sẽ được thực thi lần lượt theo thứ tự. Nếu bạn đã từng viết chương trình bằng các ngôn ngữ khác [chẳng hạn như JavaScript, Objective-C, Ruby hoặc Python], bạn sẽ biết rằng các chương trình thực tế hiếm khi đơn giản như vậy.
PHP, giống như bất kỳ ngôn ngữ lập trình nào khác, cung cấp các phương tiện cho phép bạn tác động đến luồng điều khiển. Nghĩa là, ngôn ngữ này chứa các câu lệnh đặc biệt mà bạn có thể sử dụng để đi chệch khỏi thứ tự thực hiện nối tiếp nhau đã thống trị các ví dụ của chúng ta cho đến nay. Những câu lệnh như vậy được gọi là cấu trúc điều khiển. Không hiểu? . Một vài ví dụ sẽ minh họa nó một cách hoàn hảo
câu lệnh if
Cấu trúc điều khiển cơ bản nhất và thường được sử dụng nhất là câu lệnh
echo 'rand[1, 10]';
6252. Luồng của một chương trình thông qua câu lệnh echo 'rand[1, 10]';
6252 có thể được hình dung như hình bên dướiĐây là một câu lệnh
echo 'rand[1, 10]';
6252 trông như thế nào trong mã PHPecho 'rand[1, 10]';
640Cấu trúc điều khiển này cho phép chúng ta yêu cầu PHP thực thi một tập hợp các câu lệnh chỉ khi một số điều kiện được đáp ứng
Ví dụ: chúng tôi có thể muốn tạo một trò chơi bắt chước trò tung xúc xắc và trong đó bạn phải gieo sáu để giành chiến thắng. Cuộn xúc xắc có thể được lập mô hình bằng hàm
echo 'rand[1, 10]';
6255 mà chúng tôi đã sử dụng trước đó, đặt mức tối thiểu và tối đa từ 1 đến 6echo 'rand[1, 10]';
641Để in ra thông báo nếu người chơi tung được sáu và thắng, bạn có thể sử dụng câu lệnh
echo 'rand[1, 10]';
6252Thí dụ. PHP-DiceRoll
echo 'rand[1, 10]';
642echo 'rand[1, 10]';
6257 được sử dụng trong điều kiện trên là toán tử bằng, được dùng để so sánh hai giá trị để xem chúng có bằng nhau không. Điều này hoàn toàn khác với việc sử dụng một echo 'rand[1, 10]';
6258 duy nhất, được sử dụng để gán và không thể được sử dụng để so sánhCâu lệnh
echo 'rand[1, 10]';
6252 sử dụng dấu ngoặc nhọn [echo 'rand[1, 10]';
6260 và echo 'rand[1, 10]';
6261] để bao quanh mã bạn muốn chạy chỉ khi điều kiện được đáp ứng. Bạn có thể đặt bao nhiêu dòng mã tùy thích giữa các dấu ngoặc nhọn; . Bất kỳ mã nào được đặt sau dấu ngoặc nhọn [_______56261] sẽ luôn được chạyecho 'rand[1, 10]';
643Ghi chú. nhớ gõ dấu bằng kép [
echo 'rand[1, 10]';
6257]. Một lỗi phổ biến của những người mới bắt đầu lập trình PHP là gõ một điều kiện như thế này với một dấu bằng duy nhấtecho 'rand[1, 10]';
644Điều kiện này đang sử dụng toán tử gán [
echo 'rand[1, 10]';
6258] thay vì toán tử bằng [echo 'rand[1, 10]';
6257]. Do đó, thay vì so sánh giá trị của echo 'rand[1, 10]';
6266 với số echo 'rand[1, 10]';
6267, nó thực sự sẽ đặt giá trị của echo 'rand[1, 10]';
6266 thành echo 'rand[1, 10]';
6267. ỐiTệ hơn nữa, câu lệnh
echo 'rand[1, 10]';
6252 sẽ sử dụng thao tác gán này như một điều kiện mà nó sẽ coi là đúng, vì vậy mã điều kiện trong câu lệnh echo 'rand[1, 10]';
6252 sẽ luôn được thực thi, bất kể giá trị ban đầu của echo 'rand[1, 10]';
6266 là bao nhiêuNếu bạn lưu mã này dưới dạng
echo 'rand[1, 10]';
6273 và chạy mã, bạn sẽ thấy số ngẫu nhiên được tạo. Nếu bạn chạy nó cho đến khi giành chiến thắng, bạn sẽ thấy điều này trong trình duyệtecho 'rand[1, 10]';
645cái này không đẹp lắm. Nhưng vì PHP xuất ra HTML, bạn có thể thêm một số thẻ đoạn văn để định dạng đầu ra
Thí dụ. Định dạng PHP-DiceRoll
echo 'rand[1, 10]';
646Nếu bạn chạy mã được cập nhật, bạn sẽ thấy rằng nó hiện in mã này trong trình duyệt
echo 'rand[1, 10]';
647Điều này thân thiện với người dùng hơn nhiều. Để làm cho trò chơi trở nên thân thiện hơn với người dùng, bạn có thể muốn hiển thị một thông báo khác cho những người không tung được 6 và không thắng. Điều này có thể được thực hiện với một câu lệnh
echo 'rand[1, 10]';
6274. Câu lệnh echo 'rand[1, 10]';
6274 phải tuân theo một echo 'rand[1, 10]';
6252 và sẽ được chạy nếu điều kiện không được đáp ứngThí dụ. PHP-DiceRoll-Khác
echo 'rand[1, 10]';
648Ghi chú. bởi vì từ
echo 'rand[1, 10]';
6277 chứa một trích dẫn duy nhất, nó cần được "thoát". Bằng cách đặt dấu gạch chéo ngược trước một trích dẫn [echo 'rand[1, 10]';
6227], nó yêu cầu PHP không coi echo 'rand[1, 10]';
6214 trong echo 'rand[1, 10]';
6277 là phần cuối của chuỗiVới một câu lệnh khác, một [và chỉ một. ] của hai khối mã được đảm bảo chạy. Mã trong khối
echo 'rand[1, 10]';
6252 sẽ chạy nếu điều kiện được đáp ứng hoặc mã trong khối echo 'rand[1, 10]';
6274 sẽ chạy nếu không.Các điều kiện có thể phức tạp hơn một lần kiểm tra tính bình đẳng. Một câu lệnh
echo 'rand[1, 10]';
6252 có thể chứa nhiều hơn một điều kiện. Ví dụ: hãy tưởng tượng nếu trò chơi được điều chỉnh sao cho cả echo 'rand[1, 10]';
6284 và echo 'rand[1, 10]';
6267 đều là số trúng thưởng. Câu lệnh echo 'rand[1, 10]';
6252 có thể được thay đổi thành như sauThí dụ. PHP-DiceRoll-Hoặc
echo 'rand[1, 10]';
649Toán tử đường ống kép [
echo 'rand[1, 10]';
6287] có nghĩa là “hoặc”. Điều kiện trên hiện được đáp ứng nếu một trong hai điều kiện được đáp ứng. Điều này có thể được đọc là “Nếu bạn tung được số 6 hoặc bạn tung được số 5”Tuy nhiên, điều này có thể được thể hiện theo một cách thậm chí tốt hơn. Các câu lệnh
echo 'rand[1, 10]';
6252 không bị giới hạn trong việc sử dụng toán tử bằng [echo 'rand[1, 10]';
6257]. Họ cũng có thể sử dụng toán tử lớn hơn [echo 'rand[1, 10]';
6290] và nhỏ hơn [echo 'rand[1, 10]';
6291]. Câu lệnh echo 'rand[1, 10]';
6252 ở trên cũng có thể được thực hiện với một biểu thức duy nhấtThí dụ. PHP-DiceRoll-Greater
echo 'rand[1, 10]';
700Điều kiện
echo 'rand[1, 10]';
6293 sẽ được đáp ứng nếu giá trị được lưu trữ trong biến echo 'rand[1, 10]';
6266 lớn hơn echo 'rand[1, 10]';
6295, cho phép chúng tôi có 5 và 6 là số chiến thắng với một điều kiện duy nhất. Nếu chúng ta muốn 4, 5 và 6 là số chiến thắng, điều kiện có thể được thay đổi thành echo 'rand[1, 10]';
6296Giống như biểu thức “or” [
echo 'rand[1, 10]';
6287], có một biểu thức “and” chỉ được đáp ứng khi cả hai điều kiện được đáp ứng. Chúng tôi có thể mở rộng trò chơi để bao gồm hai viên xúc xắc và yêu cầu người chơi tung hai con sáu để giành chiến thắngThí dụ. PHP-DiceRoll-TwoDice
echo 'rand[1, 10]';
701Điều kiện
echo 'rand[1, 10]';
6298 sẽ chỉ được đáp ứng nếu echo 'rand[1, 10]';
6299 là đúng và echo 'rand[1, 10]';
6400. Điều này có nghĩa là người chơi phải gieo 6 trên cả hai viên xúc xắc để giành chiến thắng trong trò chơi. Nếu chúng ta thay đổi và [echo 'rand[1, 10]';
6401] thành hoặc [echo 'rand[1, 10]';
6287] — nghĩa là, echo 'rand[1, 10]';
6403 — người chơi sẽ thắng nếu họ gieo được 6 trên cả hai viên xúc xắcChúng tôi sẽ xem xét các điều kiện phức tạp hơn khi có nhu cầu. Hiện tại, chỉ cần biết chung về các câu lệnh
echo 'rand[1, 10]';
6404 là đủGhi chú. PHP cũng cho phép sử dụng
echo 'rand[1, 10]';
6405 thay cho echo 'rand[1, 10]';
6287 và echo 'rand[1, 10]';
6407 thay cho echo 'rand[1, 10]';
6401. Ví dụecho 'rand[1, 10]';
702Có một số khác biệt nhỏ giữa cách làm việc của
echo 'rand[1, 10]';
6405 và echo 'rand[1, 10]';
6287 có thể dẫn đến hành vi không mong muốn. Nói chung, hãy tránh các toán tử "đánh vần". Bám vào ống đôi [echo 'rand[1, 10]';
6287] và dấu và đôi [echo 'rand[1, 10]';
6401] sẽ giúp ngăn ngừa một số lỗi khó hiểuvòng lặp
Một loại cấu trúc điều khiển khác rất hữu ích là “vòng lặp”. Vòng lặp cho phép bạn lặp đi lặp lại cùng một dòng mã. Hai loại vòng lặp quan trọng là vòng lặp ________ 56413 và vòng lặp ________ 56414. Hãy xem cách chúng hoạt động
Đối với vòng lặp
Vòng lặp
echo 'rand[1, 10]';
6413 được sử dụng khi bạn biết trước số lần bạn cần chạy cùng một đoạn mã. Hình ảnh dưới đây cho thấy quy trình của vòng lặp echo 'rand[1, 10]';
6413Đây là những gì nó trông giống như trong mã
echo 'rand[1, 10]';
703Câu lệnh
echo 'rand[1, 10]';
6417 được thực thi một lần khi bắt đầu vòng lặp. Câu lệnh echo 'rand[1, 10]';
6418 được kiểm tra mỗi lần qua vòng lặp trước khi các câu lệnh trong phần thân được thực thi. Câu lệnh echo 'rand[1, 10]';
6419 được thực thi mỗi lần qua vòng lặp sau các câu lệnh trong phần thânĐể đếm đến mười bằng vòng lặp
echo 'rand[1, 10]';
6413, bạn có thể sử dụng đoạn mã sauecho 'rand[1, 10]';
704Điều này có vẻ khá đáng sợ, vì có rất nhiều thứ đang diễn ra, nhưng hãy để tôi chia nhỏ nó cho bạn
6421. Bạn đã quen thuộc với mã này. Nó đang tạo một biến có tên làecho 'rand[1, 10]';
6422 và đặt giá trị thànhecho 'rand[1, 10]';
6423echo 'rand[1, 10]';
6424. Đây là điều kiện. Nó có thể được đọc là “tiếp tục lặp trong khiecho 'rand[1, 10]';
6422 nhỏ hơn hoặc bằng 10”echo 'rand[1, 10]';
6426. Điều này nói rằng "thêm 1 vào bộ đếm mỗi lần". Nó giống hệt vớiecho 'rand[1, 10]';
6427echo 'rand[1, 10]';
6428. Điều này in giá trị của bộ đếm theo sau là một khoảng trắngecho 'rand[1, 10]';
Điều kiện trong ví dụ này sử dụng toán tử
echo 'rand[1, 10]';
6429. Điều này hoạt động tương tự như toán tử nhỏ hơn [echo 'rand[1, 10]';
6291], nhưng đánh giá là đúng nếu số được so sánh nhỏ hơn hoặc bằng số thứ hai. Các toán tử khả dụng khác bao gồm echo 'rand[1, 10]';
6431 [lớn hơn hoặc bằng] và echo 'rand[1, 10]';
6432 [không bằng]Tất cả ba phần của vòng lặp
echo 'rand[1, 10]';
6413 được kết hợp để tạo ra vòng lặp hoàn chỉnh. Mặc dù, thoạt nhìn, mã có vẻ khó đọc hơn một chút, nhưng việc đặt tất cả mã liên quan đến việc kiểm soát vòng lặp vào cùng một vị trí thực sự giúp bạn dễ hiểu hơn khi bạn đã quen với cú pháp. Nhiều ví dụ trong cuốn sách này sẽ sử dụng vòng lặp echo 'rand[1, 10]';
6413, vì vậy bạn sẽ có nhiều cơ hội để thực hành đọc chúngBạn có thể thay đổi từng phần của vòng lặp
echo 'rand[1, 10]';
6413 để có kết quả khác nhau. Ví dụ: hãy xem cách thêm echo 'rand[1, 10]';
6240 mỗi khi bạn có thể thay đổi vòng lặp echo 'rand[1, 10]';
6413 bằng cách sửa đổi phần cuối cùngPhần cuối cùng của vòng lặp,
echo 'rand[1, 10]';
6426, cho biết thêm 1 vào giá trị của echo 'rand[1, 10]';
6422 và đó là một cách viết ngắn gọn của echo 'rand[1, 10]';
6427Bằng cách thay đổi
echo 'rand[1, 10]';
6426 thành echo 'rand[1, 10]';
6442, vòng lặp for có thể được sử dụng để đếm ba phầnThí dụ. PHP-Dành cho
echo 'rand[1, 10]';
705Điều này sẽ dẫn đến kết quả như sau
echo 'rand[1, 10]';
706Vòng lặp
echo 'rand[1, 10]';
6413 có thể được kết hợp với các câu lệnh khác — chẳng hạn như câu lệnh echo 'rand[1, 10]';
6252 — để thực hiện các tác vụ cụ thể trên mỗi lần lặp. Ví dụ: thay vì làm mới trang trên trò chơi súc sắc của chúng tôi mỗi lần, chúng tôi có thể muốn tung xúc xắc mười lần và in kết quảThí dụ. PHP-DiceRoll-ManyDice
echo 'rand[1, 10]';
707Điều này cho phép chúng tôi tung xúc xắc mười lần mà không cần làm mới trang mỗi lần. Sử dụng một vòng lặp có chức năng giống như sao chép và dán mã mười lần và sẽ tạo ra kết quả chính xác như sau
echo 'rand[1, 10]';
708Máy tính không quan tâm bạn sử dụng phương pháp nào. bạn có thể sao chép/dán hoặc sử dụng vòng lặp. Nó sẽ chỉ chạy mã. Tuy nhiên, với tư cách là nhà phát triển, bạn sẽ nhanh chóng nhận ra rằng vòng lặp là lựa chọn tốt hơn. Nếu bạn muốn cập nhật mã để cho phép
echo 'rand[1, 10]';
6284 làm số chiến thắng, bạn cần cập nhật điều kiện ở mười vị trí khác nhau. Sử dụng vòng lặp, bạn có thể thay đổi mã ở một nơi và nó sẽ ảnh hưởng đến mỗi lần lặp của vòng lặp. Nếu bạn thấy mình sao chép/dán mã, luôn có cách tốt hơn để đạt được những gì bạn đang cố gắng thực hiệnGhi chú. với kiến thức mới của bạn về các vòng lặp, bạn sẽ có thể bắt đầu viết mã cho chính mình. Bạn có thể hoàn thành những thử thách này không?
- thử thách 1. in tất cả các số lẻ từ 21 đến 99
- thử thách 2. in bảng chín nhân lên tới 12 x 9 [______56446 … v.v. ] mà không sử dụng toán tử nhân [
6246] hoặc câu lệnhecho 'rand[1, 10]';
6252echo 'rand[1, 10]';
- thử thách 3. in bảng chín lần ở định dạng này.
709echo 'rand[1, 10]';
Lần này, bạn sẽ cần sử dụng toán tử nhân
Vòng lặp While
Một cấu trúc điều khiển PHP thường được sử dụng khác là vòng lặp
echo 'rand[1, 10]';
6414. Trong trường hợp câu lệnh echo 'rand[1, 10]';
6404 cho phép chúng ta chọn có thực thi một tập hợp các câu lệnh hay không tùy thuộc vào một số điều kiện, thì vòng lặp echo 'rand[1, 10]';
6414 cho phép chúng ta sử dụng một điều kiện để xác định số lần chúng ta sẽ thực hiện lặp lại một tập hợp các câu lệnhHình ảnh sau đây cho thấy cách hoạt động của vòng lặp
echo 'rand[1, 10]';
6414Đây là vòng lặp
echo 'rand[1, 10]';
6414 trông như thế nào trong mãecho 'rand[1, 10]';
710Vòng lặp
echo 'rand[1, 10]';
6414 hoạt động rất giống với câu lệnh echo 'rand[1, 10]';
6252. Sự khác biệt phát sinh khi điều kiện là đúng và [các] câu lệnh được thực hiện. Thay vì tiếp tục thực hiện với câu lệnh theo sau dấu ngoặc nhọn [echo 'rand[1, 10]';
6261], điều kiện được kiểm tra lại. Nếu điều kiện vẫn đúng, [các] câu lệnh được thực hiện lần thứ hai và thứ ba và sẽ tiếp tục được thực hiện miễn là điều kiện vẫn đúng. Lần đầu tiên điều kiện đánh giá sai [cho dù đó là lần đầu tiên được kiểm tra hay lần thứ một trăm], việc thực thi sẽ chuyển ngay đến câu lệnh theo sau vòng lặp echo 'rand[1, 10]';
6414, sau dấu ngoặc nhọn đóngBạn có thể sử dụng vòng lặp
echo 'rand[1, 10]';
6414 để tạo bộ đếm có kết quả tương tự như vòng lặp echo 'rand[1, 10]';
6413Thí dụ. PHP-WhileCount
echo 'rand[1, 10]';
711Điều này hoạt động giống hệt như vòng lặp
echo 'rand[1, 10]';
6413 và bạn sẽ nhận thấy rất nhiều câu lệnh giống nhau ở những nơi khác nhau. Mã này có thể trông hơi đáng sợ, tôi biết, nhưng hãy để tôi nói với bạn từng dòng một
6421. Dòng đầu tiên tạo một biến có tên làecho 'rand[1, 10]';
6422 và gán cho nó một giá trị làecho 'rand[1, 10]';
6423echo 'rand[1, 10]';
6464. Dòng thứ hai là điểm bắt đầu của vòng lặpecho 'rand[1, 10]';
6414, điều kiện là giá trị củaecho 'rand[1, 10]';
6422 nhỏ hơn hoặc bằng [echo 'rand[1, 10]';
6429] đến 10echo 'rand[1, 10]';
6260. Dấu ngoặc mở đánh dấu phần đầu của khối mã điều kiện cho vòng lặpecho 'rand[1, 10]';
6414. Mã điều kiện này thường được gọi là phần thân của vòng lặp và được thực hiện lặp đi lặp lại, miễn là điều kiện đúngecho 'rand[1, 10]';
6428. Dòng này chỉ xuất giá trị củaecho 'rand[1, 10]';
6422, theo sau là khoảng trắngecho 'rand[1, 10]';
6472. Dòng thứ tư thêmecho 'rand[1, 10]';
6423 vào giá trị củaecho 'rand[1, 10]';
6422.echo 'rand[1, 10]';
6475 là viết tắt củaecho 'rand[1, 10]';
6427.echo 'rand[1, 10]';
6426 cũng sẽ hoạt động ở đây. Vị trí củaecho 'rand[1, 10]';
6478 có thể quan trọng, nhưng trong trường hợp này thì không thành vấn đề. Nếuecho 'rand[1, 10]';
6478 ở trước tên biến, bộ đếm sẽ tăng lên trước khi giá trị được đọc. Khiecho 'rand[1, 10]';
6422 bằng 0, mãecho 'rand[1, 10]';
6481 sẽ in raecho 'rand[1, 10]';
6423, trong khi đó,echo 'rand[1, 10]';
6483 sẽ in raecho 'rand[1, 10]';
6484. Hãy cẩn thận khi sử dụngecho 'rand[1, 10]';
6478, vì đặt sai vị trí có thể gây ra lỗiecho 'rand[1, 10]';
6261. Dấu ngoặc đóng đánh dấu phần cuối của thân vòng lặpecho 'rand[1, 10]';
6414echo 'rand[1, 10]';
Vì vậy, đây là những gì xảy ra khi mã này được thực thi. Lần đầu tiên điều kiện được kiểm tra, giá trị của
echo 'rand[1, 10]';
6422 là echo 'rand[1, 10]';
6423, vì vậy điều kiện chắc chắn là đúng. Giá trị của echo 'rand[1, 10]';
6422 [echo 'rand[1, 10]';
6423] được xuất ra và echo 'rand[1, 10]';
6422 được cung cấp giá trị mới là echo 'rand[1, 10]';
6493. Điều kiện vẫn đúng khi được kiểm tra lần thứ hai, vì vậy giá trị [echo 'rand[1, 10]';
6493] được xuất ra và giá trị mới [echo 'rand[1, 10]';
6240] được gán. Quá trình này tiếp tục, xuất ra các giá trị echo 'rand[1, 10]';
6240, echo 'rand[1, 10]';
6295, echo 'rand[1, 10]';
6284, echo 'rand[1, 10]';
6267, echo 'rand[1, 10]';
7000, echo 'rand[1, 10]';
7001, echo 'rand[1, 10]';
7002 và echo 'rand[1, 10]';
7003. Cuối cùng, echo 'rand[1, 10]';
6422 được cho một giá trị là echo 'rand[1, 10]';
7005 và điều kiện được phát hiện là sai, kết thúc vòng lặpKết quả ròng của mã được hiển thị trong hình ảnh sau
Mặc dù các vòng lặp thường không được sử dụng cho các bộ đếm đơn giản như thế này; . Mặc dù bạn có thể tạo bộ đếm bằng vòng lặp
echo 'rand[1, 10]';
6414, nhưng thông thường chúng được sử dụng để tiếp tục chạy mã cho đến khi có điều gì đó xảy ra. Ví dụ: chúng ta có thể muốn tiếp tục tung xúc xắc cho đến khi nhận được 6. Không có cách nào để biết cần bao nhiêu viên xúc xắc khi chúng ta viết mã. có thể mất một cuộn hoặc hàng trăm để có được sáu. Vì vậy, bạn có thể đặt cuộn xúc xắc trong một vòng lặp echo 'rand[1, 10]';
6414Thí dụ. PHP-DiceRoll-While
echo 'rand[1, 10]';
712Thao tác này sẽ tiếp tục tung xúc xắc cho đến khi con số 6 được tung ra. Mỗi lần bạn chạy mã, sẽ mất một số lần cuộn khác nhau trước khi bạn giành chiến thắng
Câu lệnh while sử dụng điều kiện
echo 'rand[1, 10]';
7009. Để vòng lặp echo 'rand[1, 10]';
6414 được chạy lần đầu tiên, biến echo 'rand[1, 10]';
6266 phải được đặt thành một giá trị để so sánh ban đầu. Đó là mục đích của dòng echo 'rand[1, 10]';
7012 phía trên vòng lặp echo 'rand[1, 10]';
6414. Bằng cách đặt giá trị ban đầu thành 0, khi vòng lặp echo 'rand[1, 10]';
6414 chạy lần đầu tiên, điều kiện echo 'rand[1, 10]';
7009 được đáp ứng, vì echo 'rand[1, 10]';
6266 bằng 0, không phải 6 và vòng lặp sẽ bắt đầu. Nếu biến echo 'rand[1, 10]';
6266 không được tạo trước khi bắt đầu vòng lặp, bạn sẽ gặp lỗi vì biến echo 'rand[1, 10]';
6266 chưa được đặt thành bất kỳ thứ gì trước khi được sử dụngCó một biến thể của vòng lặp
echo 'rand[1, 10]';
6414 được gọi là echo 'rand[1, 10]';
7020, rất hữu ích trong những trường hợp này. Nó cho phép bạn chạy một số mã mà không cần điều kiện và sau đó chạy lại mã đó nếu mã không được đặt. Điều này có cấu trúc sauecho 'rand[1, 10]';
713Đối với ví dụ tung xúc xắc ở trên, điều này cho phép bạn bỏ qua dòng đầu tiên
Thí dụ. PHP-DiceRoll-DoWhile
echo 'rand[1, 10]';
714Lần này, vì điều kiện ở dưới cùng nên khi câu lệnh
echo 'rand[1, 10]';
6414 được chạy, biến echo 'rand[1, 10]';
6266 đã được gán giá trị, vì vậy bạn không cần đặt giá trị ban đầu bằng 0 cho nó để buộc vòng lặp chạy Ghi chú. PHP không quan tâm đến cách bạn định dạng mã của mình và khoảng trắng sẽ bị bỏ qua. Bạn có thể viết ví dụ trước như thế này
echo 'rand[1, 10]';
715Tập lệnh sẽ thực thi theo cùng một cách chính xác. Các lập trình viên khác nhau có các kiểu ưa thích khác nhau, chẳng hạn như sử dụng các tab hoặc dấu cách để thụt đầu dòng hoặc đặt dấu ngoặc mở trên cùng một dòng với câu lệnh hoặc sau câu lệnh. Thậm chí còn có các hướng dẫn về phong cách mã hóa chỉ ra vị trí đặt dấu ngoặc nhọn và dấu ngoặc đơn và cách định dạng mã. Nhưng máy tính không quan tâm liệu một dấu ngoặc nằm trên cùng một dòng hay dòng tiếp theo, vì vậy hãy sử dụng bất kỳ kiểu nào bạn cảm thấy thoải mái nhất
Mảng
Mảng là một loại biến đặc biệt chứa nhiều giá trị. Nếu bạn coi một biến như một hộp chứa một giá trị, thì một mảng có thể được coi là một hộp có các ngăn trong đó mỗi ngăn có thể lưu trữ một giá trị riêng lẻ
Để tạo một mảng trong PHP, hãy sử dụng dấu ngoặc vuông [
echo 'rand[1, 10]';
7023 và echo 'rand[1, 10]';
7024] chứa các giá trị bạn muốn lưu trữ, được phân tách bằng dấu phẩyecho 'rand[1, 10]';
716Ghi chú. mảng trong PHP cũng có thể được xác định bằng từ khóa
echo 'rand[1, 10]';
7025. Đoạn mã sau tương đương với ký hiệu ngoặc vuông ở trênecho 'rand[1, 10]';
717Ký hiệu dấu ngoặc vuông đã được giới thiệu trong PHP 5. 4 và được các nhà phát triển PHP ưa thích vì nó ít phải gõ hơn và dấu ngoặc vuông dễ nhìn thấy hơn giữa các dấu ngoặc tròn trong các cấu trúc điều khiển như câu lệnh
echo 'rand[1, 10]';
6252 và vòng lặp echo 'rand[1, 10]';
6414Mã này tạo một mảng có tên là
echo 'rand[1, 10]';
7028 chứa ba giá trị. echo 'rand[1, 10]';
7029, echo 'rand[1, 10]';
6493 và echo 'rand[1, 10]';
7031. Giống như một biến thông thường, mỗi khoảng trống trong một mảng có thể chứa bất kỳ loại giá trị nào. Trong trường hợp này, khoảng trống thứ nhất và thứ ba chứa chuỗi, trong khi khoảng trống thứ hai chứa sốĐể truy cập một giá trị được lưu trữ trong một mảng, bạn cần biết chỉ mục của nó. Thông thường, các mảng sử dụng các số làm chỉ số để trỏ đến các giá trị mà chúng chứa, bắt đầu bằng 0. Nghĩa là, giá trị [hoặc phần tử] đầu tiên của một mảng có chỉ số 0, giá trị thứ hai có chỉ số 1, giá trị thứ ba có chỉ số 2, v.v. Do đó, chỉ số của phần tử thứ n của một mảng là n–1. Sau khi biết chỉ mục của giá trị mà bạn quan tâm, bạn có thể truy xuất giá trị đó bằng cách đặt chỉ mục đó trong dấu ngoặc vuông sau tên biến mảng
echo 'rand[1, 10]';
718Mỗi giá trị được lưu trữ trong một mảng được gọi là một phần tử. Bạn có thể sử dụng khóa trong ngoặc vuông để thêm phần tử mới hoặc gán giá trị mới cho phần tử mảng hiện có
echo 'rand[1, 10]';
719Bạn cũng có thể thêm các phần tử vào cuối mảng bằng cách sử dụng toán tử gán như bình thường, nhưng để trống các dấu ngoặc vuông theo sau tên biến
echo 'rand[1, 10]';
740Các phần tử mảng có thể được sử dụng giống như bất kỳ biến nào khác và trong nhiều trường hợp, việc chọn sử dụng một mảng hay nhiều biến sẽ phụ thuộc vào sở thích của lập trình viên. Tuy nhiên, mảng có thể được sử dụng để giải quyết các vấn đề mà các biến thông thường không thể
Bạn có nhớ trò chơi xúc xắc trong phần trước không? . Ví dụ: thay vì “Bạn đã đổ được 3” hoặc “Bạn đã đổ được 6”, sẽ tốt hơn nếu bạn đọc “Bạn đã đổ được 3” hoặc “Bạn đã đổ được 6”
Để làm điều này, chúng ta cần một số cách chuyển đổi từ một số sang từ tiếng Anh cho số đó. Điều này có thể thực hiện được với một loạt câu lệnh
echo 'rand[1, 10]';
6252Thí dụ. PHP-DiceRoll-English-If
echo 'rand[1, 10]';
741Giải pháp này hoạt động, nhưng nó rất kém hiệu quả, vì bạn cần viết một câu lệnh
echo 'rand[1, 10]';
6252 cho mỗi lần tung xúc xắc có thể. Thay vào đó, bạn có thể sử dụng một mảng để lưu trữ từng giá trị cuộnecho 'rand[1, 10]';
742Ký hiệu
echo 'rand[1, 10]';
7034 [được gọi là toán tử mũi tên kép] cho phép bạn xác định cả khóa và giá trị khi tạo mảng. Điều này tương đương với sau đâyecho 'rand[1, 10]';
743Mặc dù chúng tương đương nhau nhưng mã cần thiết để sử dụng ký hiệu tốc ký sẽ gõ nhanh hơn rất nhiều và dễ đọc và dễ hiểu hơn.
Bây giờ mảng đã được tạo, có thể đọc từng từ tiếng Anh trong đó
echo 'rand[1, 10]';
744Trong PHP, một số như
echo 'rand[1, 10]';
6240 có thể được thay thế bằng một biến chứa giá trị đó. Điều này cũng có thể với các phím mảng. Ví dụecho 'rand[1, 10]';
745Biết được điều này, chúng ta có thể ghép tất cả lại với nhau và điều chỉnh trò chơi súc sắc để hiển thị từ tiếng Anh của trò tung xúc xắc bằng cách đọc giá trị liên quan từ mảng bằng cách sử dụng biến
echo 'rand[1, 10]';
6266Thí dụ. PHP-DiceRoll-English-Array
echo 'rand[1, 10]';
746Như bạn có thể thấy, điều này sạch sẽ và gọn gàng hơn rất nhiều so với một danh sách dài các câu lệnh
echo 'rand[1, 10]';
6252. Có hai lợi thế lớn ở đâyĐầu tiên, nếu bạn muốn biểu diễn một con xúc xắc mười mặt, việc thêm vào mảng sẽ dễ dàng hơn nhiều so với việc thêm một câu lệnh
echo 'rand[1, 10]';
6252 cho mỗi sốThứ hai, mảng có thể tái sử dụng. Đối với phiên bản có hai viên xúc xắc, bạn chỉ có thể sử dụng lại mảng
echo 'rand[1, 10]';
7039 thay vì lặp lại tất cả các câu lệnh echo 'rand[1, 10]';
6252 cho mỗi lần tung xúc xắcThí dụ. PHP-DiceRoll-English-If-TwoDice
echo 'rand[1, 10]';
747Thay vào đó, mảng có thể được sử dụng cho cả cuộn
Thí dụ. PHP-DiceRoll-English-Array-TwoDice
echo 'rand[1, 10]';
748Mặc dù các số là lựa chọn phổ biến nhất cho các chỉ mục mảng, nhưng vẫn có một khả năng khác. Bạn cũng có thể sử dụng các chuỗi làm chỉ số để tạo cái được gọi là mảng kết hợp. Nó được gọi như vậy bởi vì nó liên kết các giá trị với các chỉ số có ý nghĩa. Trong ví dụ này, chúng tôi liên kết một ngày [ở dạng chuỗi] với từng tên trong số ba tên
echo 'rand[1, 10]';
749Giống như các chỉ mục số, bạn cũng có thể sử dụng ký hiệu tốc ký cho các mảng kết hợp
echo 'rand[1, 10]';
640Bây giờ, nếu chúng ta muốn biết ngày sinh nhật của Kevin, chúng ta sẽ tra cứu nó bằng cách sử dụng tên làm chỉ mục
echo 'rand[1, 10]';
641Loại mảng này đặc biệt quan trọng khi nói đến tương tác của người dùng trong PHP, như chúng ta sẽ thấy ngay sau đây. Tôi cũng sẽ trình bày các cách sử dụng mảng khác trong suốt cuốn sách này
Ghi chú. bởi vì
echo 'rand[1, 10]';
7041 chứa dấu nháy đơn [trích dẫn đơn] và PHP sẽ xem đây là phần cuối của chuỗi, nên nó phải được thoát bằng một echo 'rand[1, 10]';
6227 để PHP coi nó là một phần của chuỗi, thay vì đánh dấu phần cuốiTương tác người dùng và biểu mẫu
Các trang web dựa trên cơ sở dữ liệu thường cần phải làm nhiều việc hơn là tự động tạo các trang dựa trên dữ liệu cơ sở dữ liệu. Bạn cũng cần cung cấp một số mức độ tương tác, ngay cả khi đó chỉ là hộp tìm kiếm
Bởi vì mã JavaScript có thể tồn tại trong trình duyệt, nó cho phép người dùng có tất cả các loại tương tác ngay lập tức với một trang web. Các ngôn ngữ kịch bản phía máy chủ như PHP có phạm vi hạn chế hơn khi hỗ trợ tương tác người dùng. Vì mã PHP chỉ được kích hoạt khi có yêu cầu đến máy chủ, tương tác của người dùng chỉ diễn ra theo kiểu qua lại. người dùng gửi yêu cầu đến máy chủ và máy chủ trả lời bằng các trang được tạo động
Chìa khóa để tạo tương tác với PHP là hiểu các kỹ thuật chúng ta có thể sử dụng để gửi thông tin về tương tác của người dùng, cùng với yêu cầu cho một trang web mới. Hóa ra, PHP làm điều này khá dễ dàng
Ghi chú. khi Web đã phát triển, thì các tùy chọn giao tiếp giữa mặt trước và mặt sau của một ứng dụng web cũng vậy. JavaScript cho phép giao tiếp với mặt sau mà không cần tải lại trang. Một khung JavaScript như Vue. js, chẳng hạn, có thể giao tiếp với các khung công tác PHP như Laravel. Tuy nhiên, với mục đích của cuốn sách này, chúng ta sẽ tập trung vào những gì có thể được thực hiện chỉ với PHP
Truyền biến trong liên kết
Cách đơn giản nhất để gửi thông tin cùng với yêu cầu trang là sử dụng chuỗi truy vấn URL. Nếu bạn đã từng nhận thấy một URL chứa dấu chấm hỏi theo sau tên tệp, thì bạn đã thấy kỹ thuật này được sử dụng. Ví dụ: nếu bạn tìm kiếm “SitePoint” trên Google, nó sẽ đưa bạn đến trang kết quả tìm kiếm có URL như thế này
echo 'rand[1, 10]';
642Xem dấu chấm hỏi trong URL? . Thông tin đó đang được gửi cùng với yêu cầu cho
echo 'rand[1, 10]';
7044Hãy mã hóa một ví dụ đơn giản của riêng chúng ta. Tạo một tệp HTML thông thường có tên là
echo 'rand[1, 10]';
7045 [không yêu cầu phần mở rộng tên tệp echo 'rand[1, 10]';
3, vì sẽ không có bất kỳ mã PHP nào trong tệp này] và chèn liên kết nàyecho 'rand[1, 10]';
643Đây là liên kết đến một tệp có tên là
echo 'rand[1, 10]';
7047, nhưng cũng như liên kết đến tệp, bạn cũng đang chuyển một biến cùng với yêu cầu trang. Biến được chuyển thành một phần của chuỗi truy vấn, là phần của URL theo sau dấu chấm hỏi. Biến được gọi là echo 'rand[1, 10]';
7048 và giá trị của nó là echo 'rand[1, 10]';
7049. Vì vậy, bạn đã tạo một liên kết tải echo 'rand[1, 10]';
7047 và thông báo mã PHP có trong tệp đó rằng echo 'rand[1, 10]';
7048 bằng echo 'rand[1, 10]';
7049Để thực sự hiểu tác dụng của liên kết này, chúng ta cần xem xét
echo 'rand[1, 10]';
7047. Tạo nó dưới dạng một tệp mới, nhưng lần này, hãy lưu ý phần mở rộng tên tệp echo 'rand[1, 10]';
3. Điều này cho máy chủ web biết rằng nó có thể mong đợi diễn giải một số mã PHP trong tệp. Trong phần nội dung của trang web mới này, hãy nhập nội dung sauThí dụ. PHP-NHẬN
echo 'rand[1, 10]';
644Bây giờ, hãy đặt hai tệp này [
echo 'rand[1, 10]';
7045 và echo 'rand[1, 10]';
7047] vào thư mục echo 'rand[1, 10]';
8 và tải tệp đầu tiên trong trình duyệt của bạn. [URL phải là echo 'rand[1, 10]';
7058. ] Nhấp vào liên kết trong trang đầu tiên đó để yêu cầu tập lệnh PHP. Trang kết quả sẽ hiển thị “Chào mừng đến với trang web của chúng tôi, Tom. ”, như trong hình bên dướiChúng ta hãy xem xét kỹ hơn đoạn mã đã biến điều này thành hiện thực. Đây là dòng quan trọng nhất
echo 'rand[1, 10]';
645Sử dụng những gì bạn đã học được từ phần “Mảng” ở trên, bạn có thể hình dung ra dòng này làm gì. Nó gán giá trị được lưu trữ trong phần tử
echo 'rand[1, 10]';
7059 của mảng có tên là echo 'rand[1, 10]';
7060 cho một biến mới có tên là echo 'rand[1, 10]';
7061. Nhưng mảng echo 'rand[1, 10]';
7060 đến từ đâu?Hóa ra
echo 'rand[1, 10]';
7060 là một trong số các biến mà PHP tự động tạo khi nhận được yêu cầu từ trình duyệt. PHP tạo echo 'rand[1, 10]';
7060 dưới dạng một biến mảng chứa bất kỳ giá trị nào được truyền trong chuỗi truy vấn URL. echo 'rand[1, 10]';
7060 là một mảng kết hợp, vì vậy giá trị của biến echo 'rand[1, 10]';
7048 được truyền trong chuỗi truy vấn có thể được truy cập dưới dạng echo 'rand[1, 10]';
7067. Tập lệnh echo 'rand[1, 10]';
7047 của bạn gán giá trị này cho một biến PHP thông thường [echo 'rand[1, 10]';
7061], sau đó hiển thị nó dưới dạng một phần của chuỗi văn bản bằng cách sử dụng câu lệnh echo 'rand[1, 10]';
6205echo 'rand[1, 10]';
646Giá trị của biến
echo 'rand[1, 10]';
7061 được chèn vào chuỗi đầu ra bằng cách sử dụng toán tử nối chuỗi [echo 'rand[1, 10]';
7072] mà chúng ta đã xem xét trong phần “Biến, Toán tử và Nhận xét”Nhưng coi chừng. Có một lỗ hổng bảo mật ẩn trong mã này. Mặc dù PHP là một ngôn ngữ lập trình dễ học, nhưng hóa ra việc đưa các vấn đề bảo mật vào các trang web sử dụng PHP cũng đặc biệt dễ dàng nếu bạn không biết phải thực hiện những biện pháp phòng ngừa nào. Trước khi chúng ta tiếp tục với ngôn ngữ này, tôi muốn đảm bảo rằng bạn có thể phát hiện và khắc phục vấn đề bảo mật cụ thể này, vì đây có thể là vấn đề phổ biến nhất trên Web hiện nay
Vấn đề bảo mật ở đây bắt nguồn từ thực tế là tập lệnh
echo 'rand[1, 10]';
7047 đang tạo một trang chứa nội dung nằm dưới sự kiểm soát của người dùng — trong trường hợp này là biến echo 'rand[1, 10]';
7061. Mặc dù biến echo 'rand[1, 10]';
7061 thường sẽ nhận giá trị của nó từ chuỗi truy vấn URL trong liên kết trên trang echo 'rand[1, 10]';
7045, nhưng người dùng ác ý có thể chỉnh sửa URL để gửi một giá trị khác cho biến echo 'rand[1, 10]';
7048Để xem nó hoạt động như thế nào, hãy nhấp lại vào liên kết trong
echo 'rand[1, 10]';
7045. Khi bạn nhìn thấy trang kết quả [với thông báo chào mừng có tên “Tom”], hãy xem URL trên thanh địa chỉ của trình duyệt của bạn. Nó sẽ trông giống như thế nàyecho 'rand[1, 10]';
647Chỉnh sửa URL để chèn thẻ
echo 'rand[1, 10]';
7079 trước tên và thẻ echo 'rand[1, 10]';
7080 sau tênecho 'rand[1, 10]';
648Nhấn enter để tải URL mới này và lưu ý rằng tên trong trang hiện được in đậm, như thể hiện trong hình ảnh sau
Ghi chú. bạn có thể nhận thấy rằng một số trình duyệt sẽ tự động chuyển đổi các ký tự
echo 'rand[1, 10]';
6291 và echo 'rand[1, 10]';
6290 thành các chuỗi thoát URL [lần lượt là ____57083 và echo 'rand[1, 10]';
7084], nhưng dù bằng cách nào thì PHP cũng sẽ nhận được cùng một giá trịXem những gì đang xảy ra ở đây? . Nếu mã vô hại như thẻ
echo 'rand[1, 10]';
7079 thì không có vấn đề gì, nhưng người dùng ác ý có thể bao gồm mã JavaScript tinh vi thực hiện một số hành động tầm thường như đánh cắp mật khẩu của người dùng. Tất cả những gì kẻ tấn công phải làm là xuất bản liên kết đã sửa đổi trên một số trang web khác dưới sự kiểm soát của kẻ tấn công, sau đó lôi kéo một trong những người dùng của bạn nhấp vào liên kết đó. Kẻ tấn công thậm chí có thể nhúng liên kết vào email và gửi cho người dùng của bạn. Nếu một trong những người dùng của bạn nhấp vào liên kết, mã của kẻ tấn công sẽ được đưa vào trang của bạn và cái bẫy sẽ được bung raTôi không muốn làm bạn sợ khi nói về những tin tặc nguy hiểm tấn công người dùng của bạn bằng cách biến mã PHP của chính bạn chống lại bạn, đặc biệt khi bạn chỉ mới học ngôn ngữ này. Thực tế là điểm yếu lớn nhất của PHP với tư cách là một ngôn ngữ là việc đưa ra các vấn đề bảo mật như thế này quá dễ dàng. Một số người có thể nói rằng phần lớn năng lượng bạn bỏ ra để học cách viết PHP theo tiêu chuẩn chuyên nghiệp được dành cho việc tránh các vấn đề bảo mật. Tuy nhiên, bạn càng sớm tiếp xúc với những vấn đề này, bạn càng sớm quen với việc tránh chúng và chúng sẽ càng ít trở ngại cho bạn trong tương lai.
Vì vậy, làm thế nào chúng ta có thể tạo một trang chứa tên người dùng mà không bị kẻ tấn công lạm dụng? . Đây là một sự khác biệt tinh tế, vì vậy hãy để tôi chỉ cho bạn ý của tôi
Mở lại tệp
echo 'rand[1, 10]';
7047 của bạn và chỉnh sửa mã PHP chứa trong tệp để nó trông giống như mã bên dướiThí dụ. PHP-GET-Sát trùng
echo 'rand[1, 10]';
649Có rất nhiều thứ đang diễn ra trong mã này, vì vậy hãy để tôi chia nhỏ nó cho bạn. Dòng đầu tiên giống như dòng trước, gán cho
echo 'rand[1, 10]';
7061 giá trị của phần tử echo 'rand[1, 10]';
7059 từ mảng echo 'rand[1, 10]';
7060. Nhưng câu lệnh echo 'rand[1, 10]';
6205 theo sau nó hoàn toàn khác. Trong khi trước đây chúng ta chỉ đơn giản kết xuất biến echo 'rand[1, 10]';
7061 — trần trụi — vào câu lệnh echo 'rand[1, 10]';
6205, phiên bản mã này sử dụng hàm PHP tích hợp sẵn echo 'rand[1, 10]';
7094 để thực hiện chuyển đổi quan trọngHãy nhớ rằng, lỗ hổng bảo mật xảy ra bởi vì, trong
echo 'rand[1, 10]';
7047, mã HTML trong biến echo 'rand[1, 10]';
7061 được kết xuất trực tiếp vào mã của trang được tạo và do đó có thể làm bất cứ điều gì mà mã HTML có thể làm. Điều mà echo 'rand[1, 10]';
7094 làm là chuyển đổi “các ký tự HTML đặc biệt” như echo 'rand[1, 10]';
6291 và echo 'rand[1, 10]';
6290 thành các thực thể ký tự HTML như echo 'rand[1, 10]';
7100 và echo 'rand[1, 10]';
7101, điều này ngăn trình duyệt hiểu chúng thành mã HTML. Tôi sẽ chứng minh điều này cho bạn trong giây látĐầu tiên, chúng ta hãy xem xét kỹ hơn mã mới này. Lệnh gọi hàm
echo 'rand[1, 10]';
7094 là ví dụ đầu tiên trong cuốn sách này về một hàm PHP nhận nhiều hơn một đối số. Đây là chức năng tự gọi tất cảecho 'rand[1, 10]';
800Đối số đầu tiên là biến
echo 'rand[1, 10]';
7061 [văn bản sẽ được chuyển đổi]. Đối số thứ hai là PHP “hằng số” echo 'rand[1, 10]';
7104, yêu cầu echo 'rand[1, 10]';
7094 chuyển đổi dấu ngoặc đơn và dấu ngoặc kép bên cạnh các ký tự đặc biệt khácGhi chú. hằng số PHP giống như một biến có giá trị mà bạn không thể thay đổi. Không giống như biến, hằng số không bắt đầu bằng ký hiệu đô la. PHP đi kèm với một số hằng số dựng sẵn như
echo 'rand[1, 10]';
7104 được sử dụng để kiểm soát các hàm dựng sẵn như echo 'rand[1, 10]';
7094Tham số thứ ba là chuỗi
echo 'rand[1, 10]';
7108, cho PHP biết nên sử dụng mã hóa ký tự nào để diễn giải văn bản bạn cung cấp cho nóGhi chú. bạn có thể nhận thấy rằng tất cả các trang HTML mẫu trong cuốn sách này đều chứa phần tử meta sau ở gần đầu trang
echo 'rand[1, 10]';
801Phần tử này cho trình duyệt nhận trang này biết rằng mã HTML của trang được mã hóa dưới dạng văn bản UTF-8
UTF-8 là một trong nhiều tiêu chuẩn để biểu thị văn bản dưới dạng một chuỗi các số 1 và 0 trong bộ nhớ máy tính, được gọi là mã hóa ký tự. Nếu bạn tò mò muốn tìm hiểu tất cả về mã hóa ký tự, hãy xem “Hướng dẫn cơ bản về mã hóa ký tự web”
Trong một vài trang nữa, chúng ta sẽ đến phần “Truyền biến trong biểu mẫu”. Bằng cách mã hóa các trang của bạn dưới dạng UTF-8, người dùng của bạn có thể gửi văn bản chứa hàng nghìn ký tự nước ngoài mà trang web của bạn không thể xử lý nếu không
Thật không may, nhiều hàm tích hợp sẵn của PHP, chẳng hạn như
echo 'rand[1, 10]';
7094, cho rằng bạn đang sử dụng mã hóa ký tự ISO-8859-1 [hoặc Latin-1] đơn giản hơn nhiều theo mặc định. Do đó, bạn cần cho họ biết bạn đang sử dụng UTF-8 khi sử dụng các chức năng nàyNếu có thể, bạn cũng nên yêu cầu trình soạn thảo văn bản của mình lưu các tệp HTML và PHP dưới dạng văn bản được mã hóa UTF-8. Điều này chỉ bắt buộc nếu bạn muốn nhập các ký tự nâng cao [chẳng hạn như dấu ngoặc kép hoặc dấu gạch ngang] hoặc ký tự nước ngoài [như “é”] vào mã HTML hoặc PHP của bạn. Mã trong cuốn sách này an toàn và sử dụng các tham chiếu thực thể HTML [ví dụ:
echo 'rand[1, 10]';
7110 cho một trích dẫn cong bên phải], mã này sẽ hoạt động bất kểMở
echo 'rand[1, 10]';
7045 trong trình duyệt của bạn và nhấp vào liên kết hiện trỏ đến echo 'rand[1, 10]';
7047 đã cập nhật của bạn. Một lần nữa, bạn sẽ thấy thông báo “Chào mừng đến với trang web của chúng tôi, Tom. ” Như bạn đã làm trước đây, hãy sửa đổi URL để bao gồm các thẻ echo 'rand[1, 10]';
7079 và echo 'rand[1, 10]';
7080 xung quanh tênecho 'rand[1, 10]';
648Khi bạn nhấn enter lần này, thay vì tên được in đậm trong trang, bạn sẽ thấy văn bản thực mà bạn đã nhập, như minh họa trong hình dưới đây
Nếu bạn xem mã nguồn của trang, bạn có thể xác nhận rằng hàm
echo 'rand[1, 10]';
7094 đã thực hiện công việc của mình và chuyển đổi các ký tự echo 'rand[1, 10]';
6291 và echo 'rand[1, 10]';
6290 thành các tham chiếu thực thể echo 'rand[1, 10]';
7100 và echo 'rand[1, 10]';
7101 tương ứng. Điều này ngăn người dùng độc hại tiêm mã không mong muốn vào trang web của bạn. Nếu họ thử bất cứ điều gì như vậy, mã sẽ được hiển thị vô hại dưới dạng văn bản thuần túy trên trangChúng tôi sẽ sử dụng rộng rãi hàm
echo 'rand[1, 10]';
7094 trong suốt cuốn sách này để đề phòng loại lỗ hổng bảo mật này. Không cần quá lo lắng nếu bạn đang gặp khó khăn trong việc nắm bắt chi tiết cách sử dụng ngay lúc này. Chẳng bao lâu, bạn sẽ thấy việc sử dụng nó trở thành bản chất thứ hai. Bây giờ, hãy xem xét một số cách nâng cao hơn để chuyển giá trị cho tập lệnh PHP khi chúng tôi yêu cầu chúngTruyền một biến duy nhất trong chuỗi truy vấn là tốt, nhưng hóa ra bạn có thể truyền nhiều hơn một giá trị nếu muốn. Hãy xem xét một phiên bản phức tạp hơn một chút của ví dụ trước. Mở lại tệp
echo 'rand[1, 10]';
7045 của bạn và thay đổi liên kết để trỏ đến echo 'rand[1, 10]';
7047 bằng chuỗi truy vấn phức tạp hơn nàyecho 'rand[1, 10]';
803Lần này, liên kết của chúng tôi vượt qua hai biến.
echo 'rand[1, 10]';
7123 và echo 'rand[1, 10]';
7124. Các biến được phân tách trong chuỗi truy vấn bằng dấu và [echo 'rand[1, 10]';
7125, nên được viết là echo 'rand[1, 10]';
7126 trong HTML — có, ngay cả trong URL liên kết. … mặc dù, nếu bạn sử dụng sai echo 'rand[1, 10]';
7125, hầu hết các trình duyệt sẽ sửa nó cho bạn]. Bạn thậm chí có thể chuyển nhiều biến hơn bằng cách tách từng cặp echo 'rand[1, 10]';
7128 khỏi cặp tiếp theo bằng dấu vàNhư trước đây, chúng ta có thể sử dụng hai giá trị biến trong tệp
echo 'rand[1, 10]';
7047 của mìnhThí dụ. PHP-GET-TwoVars
echo 'rand[1, 10]';
804Tuyên bố
echo 'rand[1, 10]';
6205 hiện đang trở nên khá lớn, nhưng nó vẫn có ý nghĩa với bạn. Sử dụng một loạt các nối chuỗi [echo 'rand[1, 10]';
7072], nó xuất ra “Chào mừng bạn đến với trang web của chúng tôi”, theo sau là giá trị của echo 'rand[1, 10]';
7132 [an toàn để hiển thị bằng cách sử dụng echo 'rand[1, 10]';
7094], một khoảng trắng, giá trị của echo 'rand[1, 10]';
7134 [một lần nữa, được xử lý bằng echo 'rand[1, 10]';
7094] và Kết quả là hình bên dưới
Điều này là tốt và tốt, nhưng chúng tôi vẫn chưa đạt được mục tiêu tương tác người dùng thực sự, nơi người dùng có thể nhập thông tin tùy ý và xử lý thông tin đó bằng PHP. Để tiếp tục với ví dụ của chúng tôi về thông báo chào mừng được cá nhân hóa, chúng tôi muốn mời người dùng nhập tên của họ và tên đó sẽ xuất hiện trên trang kết quả. Để cho phép người dùng nhập một giá trị, chúng tôi sẽ cần sử dụng biểu mẫu HTML
Truyền biến trong biểu mẫu
Xóa mã liên kết khỏi
echo 'rand[1, 10]';
7045 và thay thế bằng mã HTML này để tạo biểu mẫuThí dụ. PHP-GET-Biểu mẫu
echo 'rand[1, 10]';
805Hình ảnh dưới đây cho thấy cách trình duyệt hiển thị biểu mẫu được tạo từ mã này
Ghi chú. Tôi đã thêm một số CSS vào biểu mẫu [có sẵn trong
echo 'rand[1, 10]';
7137 trong mã mẫu] để làm cho nó trông đẹp hơn một chút. CSS tôi đã sử dụng rất chung chung và có thể được sử dụng để hiển thị bất kỳ biểu mẫu nào ở định dạng ngắt dòng nhãn đầu vào. Tôi sẽ đưa tệp CSS này vào bất kỳ trang nào có chứa biểu mẫuTuy nhiên, vì đây là một cuốn sách về PHP và MySQL nên tôi sẽ không đi vào chi tiết về cách thức hoạt động của CSS. Hãy xem HTML5 & CSS3 dành cho Thế giới thực của SitePoint để được tư vấn về cách tạo kiểu cho biểu mẫu của bạn bằng CSS
Biểu mẫu này có tác dụng chính xác giống như liên kết thứ hai mà chúng tôi đã xem xét trong phần “Chuyển biến trong liên kết” ở trên [với
echo 'rand[1, 10]';
7138 trong chuỗi truy vấn], ngoại trừ việc bây giờ bạn có thể nhập bất kỳ tên nào bạn thích. Khi bạn nhấp vào nút gửi [có nhãn GO], trình duyệt sẽ tải echo 'rand[1, 10]';
7047 và tự động thêm các biến và giá trị của chúng vào chuỗi truy vấn cho bạn. Nó truy xuất tên của các biến từ thuộc tính tên của đầu vào echo 'rand[1, 10]';
7140 và lấy giá trị từ văn bản do người dùng nhập vào trường văn bảnThuộc tính
echo 'rand[1, 10]';
7141 của thẻ biểu mẫu được sử dụng để cho trình duyệt biết cách gửi các biến và giá trị của chúng cùng với yêu cầu. Giá trị của ________ 57142 [như được sử dụng trong ________ 57045 ở trên] khiến chúng được chuyển qua chuỗi truy vấn [và xuất hiện trong mảng echo 'rand[1, 10]';
7060 của PHP], nhưng có một giải pháp thay thế. Có thể không mong muốn — hoặc thậm chí không khả thi về mặt kỹ thuật — để các giá trị xuất hiện trong chuỗi truy vấn. Điều gì sẽ xảy ra nếu chúng tôi bao gồm một yếu tố echo 'rand[1, 10]';
7145 trong biểu mẫu để cho phép người dùng nhập một lượng lớn văn bản? . Giải pháp thay thế là để trình duyệt chuyển thông tin một cách vô hình, đằng sau hậu trườngChỉnh sửa tệp
echo 'rand[1, 10]';
7045 của bạn một lần nữa. Sửa đổi phương thức biểu mẫu bằng cách đặt nó thành echo 'rand[1, 10]';
7147echo 'rand[1, 10]';
806Giá trị mới này cho thuộc tính phương thức hướng dẫn trình duyệt gửi các biến biểu mẫu một cách vô hình như một phần của yêu cầu trang, thay vì nhúng chúng vào chuỗi truy vấn của URL
Vì chúng tôi không còn gửi các biến như một phần của chuỗi truy vấn, chúng sẽ ngừng xuất hiện trong mảng
echo 'rand[1, 10]';
7060 của PHP. Thay vào đó, chúng được đặt trong một mảng khác dành riêng cho các biến dạng “đã đăng”. echo 'rand[1, 10]';
7149. Do đó, chúng tôi phải sửa đổi echo 'rand[1, 10]';
7047 để lấy các giá trị từ mảng mới nàyThí dụ. PHP-POST-Biểu mẫu
echo 'rand[1, 10]';
807Hình ảnh bên dưới hiển thị trang kết quả trông như thế nào sau khi biểu mẫu mới này được gửi
Biểu mẫu có chức năng giống hệt với biểu mẫu trước. Điểm khác biệt duy nhất là URL của trang được tải khi người dùng nhấp vào nút GO sẽ không có chuỗi truy vấn. Một mặt, điều này cho phép bạn bao gồm các giá trị lớn [hoặc giá trị nhạy cảm chẳng hạn như mật khẩu và số thẻ tín dụng] trong dữ liệu được gửi bởi biểu mẫu mà chúng không xuất hiện trong chuỗi truy vấn. Mặt khác, nếu người dùng đánh dấu trang xuất phát từ việc gửi biểu mẫu, thì dấu trang đó sẽ vô dụng vì nó thiếu các giá trị đã gửi. Tình cờ, đây là lý do chính tại sao các công cụ tìm kiếm sử dụng chuỗi truy vấn để gửi cụm từ tìm kiếm. Nếu bạn đánh dấu một trang kết quả tìm kiếm trên Google, bạn có thể sử dụng dấu trang đó để thực hiện lại cùng một tìm kiếm sau đó vì các cụm từ tìm kiếm được chứa trong URL
Ghi chú. theo quy tắc chung, bạn chỉ nên sử dụng biểu mẫu
echo 'rand[1, 10]';
7151 nếu khi biểu mẫu được gửi, không có gì thay đổi trên máy chủ — chẳng hạn như khi bạn yêu cầu danh sách kết quả tìm kiếm. Vì cụm từ tìm kiếm nằm trong URL nên người dùng có thể đánh dấu trang kết quả tìm kiếm và quay lại trang đó mà không cần phải nhập lại cụm từ tìm kiếm. Nhưng nếu sau khi gửi biểu mẫu, một tệp bị xóa, cơ sở dữ liệu được cập nhật hoặc bản ghi được chèn vào, bạn nên sử dụng echo 'rand[1, 10]';
7152. Lý do chính cho điều này là nếu người dùng đánh dấu trang [hoặc nhấn nút quay lại trong trình duyệt của họ], điều đó sẽ không kích hoạt lại việc gửi biểu mẫu và có khả năng tạo một bản ghi trùng lặpecho 'rand[1, 10]';
7152 cũng an toàn hơn. Mọi thứ được gửi qua echo 'rand[1, 10]';
7151 đều xuất hiện trong URL và được lưu trữ trong lịch sử và dấu trang của người dùng — đây là những vị trí rất không an toàn đối với dữ liệu nhạy cảm như mật khẩu và chi tiết thẻ tín dụngĐiều đó bao gồm những điều cơ bản của việc sử dụng các biểu mẫu để tạo ra sự tương tác thô sơ của người dùng với PHP. Chúng ta sẽ xem xét các vấn đề và kỹ thuật nâng cao hơn trong các ví dụ sau
Ẩn đường may
Bây giờ bạn đã được trang bị kiến thức làm việc về cú pháp cơ bản của ngôn ngữ lập trình PHP. Bạn hiểu rằng bạn có thể lấy bất kỳ trang web HTML nào, đổi tên nó bằng phần mở rộng tên tệp
echo 'rand[1, 10]';
3 và đưa mã PHP vào đó để tạo nội dung trang một cách nhanh chóng. Không tệ cho một ngày làm việcTuy nhiên, trước khi chúng ta tiếp tục, tôi muốn dừng lại và xem xét kỹ lưỡng các ví dụ mà chúng ta đã thảo luận cho đến nay. Giả sử mục tiêu của bạn là tạo các trang web dựa trên cơ sở dữ liệu đáp ứng các tiêu chuẩn chuyên nghiệp, có một vài nhược điểm khó coi mà chúng tôi cần phải làm sạch
Các kỹ thuật trong phần còn lại của chương này sẽ giúp nâng cao kỹ năng lập trình của bạn vượt qua trình độ mới bắt đầu, giúp chúng trở nên chuyên nghiệp nhất định. Tôi sẽ dựa vào những kỹ thuật này trong suốt phần còn lại của cuốn sách này để đảm bảo rằng, cho dù ví dụ có đơn giản đến đâu, bạn vẫn có thể cảm thấy tự tin vào chất lượng của sản phẩm mà bạn đang phân phối.
Mẫu PHP
Trong các ví dụ đơn giản mà chúng ta đã thấy cho đến nay, việc chèn mã PHP trực tiếp vào các trang HTML của bạn là một cách tiếp cận hợp lý. Tuy nhiên, khi số lượng mã PHP dùng để tạo trang trung bình của bạn tăng lên, việc duy trì hỗn hợp mã HTML và PHP này có thể trở nên khó quản lý
Đặc biệt nếu bạn làm việc trong một nhóm các nhà thiết kế web không đặc biệt am hiểu về PHP, thì việc có một khối lớn mã PHP khó hiểu trộn lẫn với HTML là một công thức dẫn đến thảm họa. Quá dễ dàng để các nhà thiết kế vô tình sửa đổi mã PHP, gây ra các lỗi mà họ sẽ không thể sửa được
Một cách tiếp cận mạnh mẽ hơn nhiều là tách phần lớn mã PHP của bạn để nó nằm trong tệp riêng của nó, khiến HTML phần lớn không bị mã PHP làm ô nhiễm
Chìa khóa để làm điều này là câu lệnh PHP
echo 'rand[1, 10]';
7156. Với câu lệnh echo 'rand[1, 10]';
7156, bạn có thể chèn nội dung của một tệp khác vào mã PHP của mình tại điểm của câu lệnh. Để cho bạn thấy nó hoạt động như thế nào, hãy xây dựng lại ví dụ về vòng lặp “đếm đến mười” echo 'rand[1, 10]';
6413 mà chúng ta đã xem trước đóBắt đầu bằng cách tạo một tệp mới,
echo 'rand[1, 10]';
7159, trong thư mục echo 'rand[1, 10]';
8 của bạn. Mở tệp để chỉnh sửa và nhập mã nàyecho 'rand[1, 10]';
808Vâng, đó là mã hoàn chỉnh cho tệp này. Nó không chứa mã HTML nào. Bây giờ vòng lặp
echo 'rand[1, 10]';
6413 hẳn đã quen thuộc với bạn, nhưng hãy để tôi chỉ ra những phần thú vị của đoạn mã này- Thay vì
6205 viết ra các số từ 1 đến 10, tập lệnh này sẽ cộng các số này vào một biến có tên làecho 'rand[1, 10]';
7163. Do đó, khi bắt đầu tập lệnh này, chúng tôi đặt biến này để chứa một chuỗi rỗngecho 'rand[1, 10]';
- Dòng
7164 thêm từng số [theo sau là khoảng trắng] vào cuối biếnecho 'rand[1, 10]';
7163. Toán tửecho 'rand[1, 10]';
7166 mà bạn thấy ở đây là một cách viết tắt để thêm một giá trị vào cuối một biến chuỗi hiện có, bằng cách kết hợp các toán tử gán và nối chuỗi thành một. Phiên bản viết tay của dòng này làecho 'rand[1, 10]';
7167, nhưng toán tửecho 'rand[1, 10]';
7166 giúp bạn tiết kiệm thời gian gõecho 'rand[1, 10]';
- Câu lệnh
7156 hướng dẫn PHP thực thi nội dung của tệpecho 'rand[1, 10]';
7170 tại vị trí này. Bạn có thể coi câu lệnhecho 'rand[1, 10]';
7156 như một kiểu sao chép và dán. Bạn sẽ nhận được kết quả tương tự bằng cách mởecho 'rand[1, 10]';
7170, sao chép nội dung và dán chúng vàoecho 'rand[1, 10]';
7159, ghi đè lên dòngecho 'rand[1, 10]';
7156echo 'rand[1, 10]';
- Cuối cùng, bạn có thể nhận thấy rằng tệp không kết thúc bằng
2 để khớp với phần mở đầuecho 'rand[1, 10]';
1. Bạn có thể đặt nó vào nếu bạn thực sự muốn, nhưng không cần thiết. Nếu một tệp PHP kết thúc bằng mã PHP, thì không cần chỉ ra mã đó kết thúc ở đâu; . Những bộ óc lớn của thế giới PHP thường thích để nó ở cuối các tệp như tệp này chỉ chứa mã PHPecho 'rand[1, 10]';
Ghi chú. bên ngoài cuốn sách này, đôi khi bạn sẽ thấy các dấu ngoặc đơn bao quanh tên tệp trong mã
echo 'rand[1, 10]';
7156, như thể echo 'rand[1, 10]';
7156 là một hàm giống như echo 'rand[1, 10]';
7179 hoặc echo 'rand[1, 10]';
7094, điều này khác xa với trường hợp. Ví dụ: thay vì echo 'rand[1, 10]';
7181, bạn có thể thấy echo 'rand[1, 10]';
7182. Những dấu ngoặc đơn này, khi được sử dụng, chỉ làm phức tạp thêm cách diễn đạt tên tệp, và do đó không được sử dụng trong cuốn sách này. Điều tương tự cũng xảy ra với echo 'rand[1, 10]';
6205, một lớp lót phổ biến khácVì dòng cuối cùng của tệp
echo 'rand[1, 10]';
7159 của chúng tôi bao gồm tệp echo 'rand[1, 10]';
7170, bạn nên tạo tệp đó tiếp theoThí dụ. PHP-Đếm-Mẫu
echo 'rand[1, 10]';
809Tệp này gần như hoàn toàn là HTML đơn giản, ngoại trừ một dòng xuất giá trị của biến
echo 'rand[1, 10]';
7163. Đây chính là biến echo 'rand[1, 10]';
7163 được tạo bởi tệp echo 'rand[1, 10]';
7159Những gì chúng tôi đã tạo ở đây là một mẫu PHP. một trang HTML chỉ có các đoạn mã PHP rất nhỏ chèn các giá trị được tạo động vào một trang HTML tĩnh khác. Thay vì nhúng mã PHP phức tạp để tạo các giá trị đó vào trang, chúng tôi đặt mã để tạo các giá trị trong một tập lệnh PHP riêng — trong trường hợp này là
echo 'rand[1, 10]';
7159Sử dụng các mẫu PHP như thế này cho phép bạn giao các mẫu của mình cho các nhà thiết kế ngoại vi mà không phải lo lắng về những gì họ có thể làm với mã PHP của bạn. Nó cũng cho phép bạn tập trung vào mã PHP của mình mà không bị phân tâm bởi mã HTML xung quanh
Tôi muốn đặt tên cho các tệp mẫu PHP của mình để chúng kết thúc bằng
echo 'rand[1, 10]';
7190. Tuy nhiên, đối với máy chủ web của bạn, đây vẫn là các tệp echo 'rand[1, 10]';
3; Để xem các trang của chúng tôi hiện đang hoạt động như thế nào, hãy nhập
echo 'rand[1, 10]';
7193 vào trình duyệt của bạn. Bạn sẽ thấy kết quả của tập lệnh echo 'rand[1, 10]';
7159 được hiển thị trong mẫu echo 'rand[1, 10]';
7170 của chúng tôiMối quan tâm về an ninh
Một vấn đề với việc tách mã HTML và PHP thành các tệp khác nhau là ai đó có khả năng chạy mã
echo 'rand[1, 10]';
7190 mà không bao gồm mã đó từ tệp PHP tương ứng. Đây không phải là vấn đề lớn, nhưng bất kỳ ai cũng có thể truy cập trực tiếp vào echo 'rand[1, 10]';
7170. Nếu bạn nhập echo 'rand[1, 10]';
7198 vào trình duyệt web của mình, thay vì nhìn thấy số đếm từ một đến mười, bạn sẽ thấy thông báo lỗi. echo 'rand[1, 10]';
7199Tốt hơn hết là đừng để mọi người chạy mã theo cách mà bạn không mong đợi. Tùy thuộc vào những gì trang đang làm, điều này có thể cho phép họ vượt qua kiểm tra bảo mật mà bạn có tại chỗ và xem nội dung mà họ không nên có quyền truy cập. Ví dụ: xem xét đoạn mã sau
echo 'rand[1, 10]';
740Nhìn vào mã này, có vẻ như bạn cần gửi biểu mẫu và nhập
echo 'rand[1, 10]';
7400 vào hộp mật khẩu để xem nội dung được bảo vệ trong echo 'rand[1, 10]';
7401. Tuy nhiên, nếu ai đó có thể điều hướng trực tiếp đến echo 'rand[1, 10]';
7401 và xem nội dung của trang thì việc kiểm tra bảo mật trở nên thừa. Có các sự cố bảo mật tiềm ẩn khác được đưa ra bằng cách làm cho tất cả các tệp của bạn có thể truy cập được qua một URL. Tránh các vấn đề bảo mật như thế này thật dễ dàng. Bạn thực sự có thể bao gồm các tệp từ một thư mục khác ngoài thư mục echo 'rand[1, 10]';
8Bạn có thể đã tự hỏi trước đó tại sao môi trường phát triển đã tạo một thư mục
echo 'rand[1, 10]';
8 bên trong thư mục echo 'rand[1, 10]';
7405 và sau đó chúng tôi đã ghi tất cả các tệp của mình vào thư mục echo 'rand[1, 10]';
8. Vâng, vấn đề bảo mật này là lý do tại sao. Không có tệp nào bên ngoài thư mục echo 'rand[1, 10]';
8 có thể truy cập được qua URL [do ai đó nhập tên tệp vào trình duyệt web của họ]Lệnh
echo 'rand[1, 10]';
7156 có thể được điều chỉnh để bao gồm các tệp từ thư mục khác. Trong trường hợp của chúng tôi, thư mục đó sẽ là thư mục echo 'rand[1, 10]';
7405, chứa thư mục echo 'rand[1, 10]';
8 mà chúng tôi đã ghi các tệp của mình vào đóVì vậy, câu hỏi đặt ra là, khi tệp bao gồm nằm trong một thư mục khác, làm thế nào để tập lệnh PHP tìm thấy nó? . Đây là giao diện của nó trên máy chủ Windows
echo 'rand[1, 10]';
741Và đây là giao diện của nó khi sử dụng môi trường Docker mà chúng tôi đang sử dụng
echo 'rand[1, 10]';
742Mặc dù phương pháp này sẽ hoạt động, nhưng nó không được mong muốn vì nó liên kết mã trang web của bạn với cấu hình máy chủ web của bạn. Bởi vì chúng tôi đang sử dụng Docker, nên việc triển khai trang web cũng sẽ sử dụng cùng một môi trường Docker, vì vậy đây không thực sự là vấn đề trong những ngày này. Tuy nhiên, lý tưởng nhất là bạn có thể thả trang web dựa trên PHP của mình vào bất kỳ máy chủ web hỗ trợ PHP nào và chỉ cần xem nó chạy. Điều đó là không thực tế nếu mã của bạn đề cập đến các ổ đĩa và thư mục dành riêng cho một máy chủ cụ thể. Ngay cả khi bạn có khả năng làm việc trên một máy chủ duy nhất, bạn sẽ tự trách mình nếu cần di chuyển trang web của mình sang một ổ đĩa/thư mục khác trên máy chủ đó
Một phương pháp tốt hơn là sử dụng đường dẫn tương đối — nghĩa là vị trí của tệp so với tệp hiện tại. Khi bạn sử dụng
echo 'rand[1, 10]';
7411, đây thực sự là một đường dẫn tương đối. echo 'rand[1, 10]';
7170 đang được đưa vào cùng thư mục với tập lệnh đã được thực thiĐể bao gồm một tệp từ thư mục trên, bạn có thể sử dụng đoạn mã sau
echo 'rand[1, 10]';
743Bit
echo 'rand[1, 10]';
7413 yêu cầu PHP tìm tệp trong thư mục phía trên thư mục của tập lệnh hiện tại. Nó sẽ tìm kiếm echo 'rand[1, 10]';
7170 trong thư mục echo 'rand[1, 10]';
7405 thay vì thư mục echo 'rand[1, 10]';
8Tiếp tục và di chuyển
echo 'rand[1, 10]';
7170 lên một cấp vào thư mục echo 'rand[1, 10]';
7405 và sửa đổi echo 'rand[1, 10]';
7159 để tham chiếu vị trí mớiThí dụ. PHP-Count-Template-Secured
echo 'rand[1, 10]';
744Nếu bạn chạy mã ở trên, nó sẽ hoạt động. Nhưng có một vấn đề tiềm ẩn khi bạn bao gồm các tệp theo cách này. Đường dẫn tương đối liên quan đến tập lệnh đã được chạy, không liên quan đến từng tệp
Nghĩa là, nếu bạn mở
echo 'rand[1, 10]';
7420 và thêm dòng echo 'rand[1, 10]';
7421, bạn sẽ mong đợi echo 'rand[1, 10]';
7422 được đưa vào từ thư mục echo 'rand[1, 10]';
7405. Tuy nhiên, đường dẫn có liên quan đến một thứ được gọi là thư mục làm việc hiện tại, khi bạn chạy tập lệnh PHP, ban đầu được đặt thành thư mục mà tập lệnh được lưu trữ trong đó. Vì vậy, việc chạy echo 'rand[1, 10]';
7421 từ echo 'rand[1, 10]';
7170 sẽ thực sự cố tải echo 'rand[1, 10]';
7422 từ thư mục echo 'rand[1, 10]';
8Thư mục làm việc hiện tại được đặt ở đầu tập lệnh và áp dụng cho tất cả các câu lệnh
echo 'rand[1, 10]';
7156, bất kể chúng nằm trong tệp nào. Để làm cho mọi thứ trở nên khó hiểu hơn, có thể thay đổi thư mục làm việc hiện tại bằng hàm echo 'rand[1, 10]';
7429Vì điều này, chúng tôi không thể dựa vào những điều sau đây
echo 'rand[1, 10]';
743Nó sẽ hoạt động, nhưng nếu thư mục bị thay đổi hoặc bản thân
echo 'rand[1, 10]';
7159 là một tệp bao gồm, nó có thể không có kết quả như chúng tôi mong đợiĐể khắc phục điều này, chúng tôi thực sự cần sử dụng các đường dẫn tuyệt đối. May mắn thay, PHP cung cấp một hằng số có tên là
echo 'rand[1, 10]';
7431 [đó là hai dấu gạch dưới, trước và sau từ echo 'rand[1, 10]';
7432] sẽ luôn chứa đường dẫn chứa tệp hiện tạiVí dụ: bạn có thể tạo một tệp có tên
echo 'rand[1, 10]';
7433 bên trong thư mục echo 'rand[1, 10]';
8 với mã sauecho 'rand[1, 10]';
746Điều này sẽ hiển thị
echo 'rand[1, 10]';
7435, đây là đường dẫn đầy đủ đến thư mục chứa echo 'rand[1, 10]';
7433. Để đọc echo 'rand[1, 10]';
7170 từ thư mục trên echo 'rand[1, 10]';
8, có thể kết hợp toán tử echo 'rand[1, 10]';
7439 và hằng số echo 'rand[1, 10]';
7431echo 'rand[1, 10]';
747Điều này bây giờ sẽ bao gồm tệp
echo 'rand[1, 10]';
7441. Tức là PHP sẽ tìm trong thư mục echo 'rand[1, 10]';
8, sau đó tăng một cấp thành echo 'rand[1, 10]';
7405 và bao gồm cả echo 'rand[1, 10]';
7170Cách tiếp cận này sẽ hoạt động trên bất kỳ máy chủ nào, vì
echo 'rand[1, 10]';
7431 sẽ khác nhau tùy thuộc vào nơi tệp được lưu trữ và nó không phụ thuộc vào việc thay đổi thư mục làm việc hiện tại. Tôi sẽ sử dụng phương pháp này để bao gồm các tệp trong suốt cuốn sách nàyTừ giờ trở đi, chúng tôi sẽ chỉ ghi các tệp vào thư mục
echo 'rand[1, 10]';
8 mà chúng tôi thực sự muốn người dùng có thể truy cập trực tiếp từ trình duyệt web của họ. Thư mục echo 'rand[1, 10]';
8 sẽ chứa mọi tập lệnh PHP mà người dùng cần truy cập trực tiếp cùng với mọi hình ảnh, tệp JavaScript và CSS mà trình duyệt yêu cầu. Bất kỳ tệp nào chỉ được tham chiếu bởi câu lệnh echo 'rand[1, 10]';
7156 sẽ được đặt bên ngoài thư mục echo 'rand[1, 10]';
8 để người dùng không thể truy cập trực tiếp vào chúngKhi cuốn sách tiếp tục, tôi sẽ giới thiệu với bạn một số loại tệp bao gồm khác nhau. Để giữ mọi thứ ngăn nắp, nên lưu trữ các loại tệp bao gồm khác nhau trong các thư mục khác nhau. Chúng tôi sẽ lưu trữ các tệp mẫu [có phần mở rộng
echo 'rand[1, 10]';
7190] bên trong thư mục có tên là echo 'rand[1, 10]';
7451 bên trong thư mục echo 'rand[1, 10]';
7405. Sau đó, chúng tôi có thể tham chiếu chúng trong một câu lệnh echo 'rand[1, 10]';
7156 bằng cách sử dụng echo 'rand[1, 10]';
7454Nhiều mẫu, một bộ điều khiển
Điều thú vị khi sử dụng các câu lệnh
echo 'rand[1, 10]';
7156 để tải các tệp mẫu PHP của bạn là bạn có thể có nhiều câu lệnh echo 'rand[1, 10]';
7156 trong một tập lệnh PHP, cũng như để nó hiển thị các mẫu khác nhau trong các trường hợp khác nhauTập lệnh PHP đáp ứng yêu cầu của trình duyệt bằng cách chọn một trong số các mẫu PHP để điền vào và gửi lại thường được gọi là “bộ điều khiển”. Bộ điều khiển chứa logic kiểm soát mẫu nào được gửi tới trình duyệt
Hãy cùng xem lại một ví dụ nữa từ phần đầu của chương này — biểu mẫu chào mừng nhắc khách nhập họ và tên
Chúng ta sẽ bắt đầu với mẫu PHP cho biểu mẫu. Đối với điều này, chúng tôi chỉ có thể sử dụng lại tệp
echo 'rand[1, 10]';
7045 mà chúng tôi đã tạo trước đó. Tạo một thư mục echo 'rand[1, 10]';
7451 bên trong echo 'rand[1, 10]';
7405 nếu bạn chưa tạo và lưu một bản sao của echo 'rand[1, 10]';
7045 có tên là echo 'rand[1, 10]';
7461 vào thư mục này. Mã duy nhất bạn cần thay đổi trong tệp này là thuộc tính hành động của thẻ biểu mẫuThí dụ. PHP-Form-Controller
echo 'rand[1, 10]';
748Như bạn có thể thấy, chúng tôi đang để trống thuộc tính hành động. Điều này yêu cầu trình duyệt gửi biểu mẫu trở lại cùng một URL mà nó đã nhận nó từ đó — trong trường hợp này, URL của bộ điều khiển bao gồm tệp mẫu này
Hãy xem bộ điều khiển cho ví dụ này. Tạo một tệp
echo 'rand[1, 10]';
7462 bên trong thư mục echo 'rand[1, 10]';
8 chứa đoạn mã sauecho 'rand[1, 10]';
749Mã này thoạt nhìn sẽ khá quen thuộc. Nó rất giống kịch bản
echo 'rand[1, 10]';
7047 mà chúng tôi đã viết trước đó. Hãy để tôi giải thích sự khác biệt- Nhiệm vụ đầu tiên của bộ điều khiển là quyết định xem yêu cầu hiện tại có phải là gửi biểu mẫu trong
7461 hay không. Bạn có thể làm điều này bằng cách kiểm tra xem yêu cầu có chứa biếnecho 'rand[1, 10]';
7123 không. Nếu đúng như vậy, PHP sẽ lưu trữ giá trị trongecho 'rand[1, 10]';
7467echo 'rand[1, 10]';
7468 là một hàm PHP tích hợp sẽ cho bạn biết liệu một biến cụ thể [hoặc phần tử mảng] đã được gán giá trị hay chưa. Nếuecho 'rand[1, 10]';
7467 có giá trị, thìecho 'rand[1, 10]';
7470 sẽ đúng. Nếuecho 'rand[1, 10]';
7467 không được đặt, thìecho 'rand[1, 10]';
7470 sẽ là saiecho 'rand[1, 10]';
Để dễ đọc, trước tiên tôi muốn đặt mã gửi biểu mẫu vào bộ điều khiển của mình. Chúng tôi cần câu lệnh
6252 này để kiểm tra xemecho 'rand[1, 10]';
7467 không được đặt. Để làm điều này, chúng ta sử dụng toán tử not [echo 'rand[1, 10]';
7475]. Bằng cách đặt toán tử này trước tên của hàm, bạn đảo ngược giá trị mà hàm trả về — từ đúng thành sai hoặc từ sai thành đúngecho 'rand[1, 10]';
Do đó, nếu yêu cầu không chứa biến
7123, thìecho 'rand[1, 10]';
7477 sẽ trả về true và phần thân của câu lệnhecho 'rand[1, 10]';
6252 sẽ được thực thiecho 'rand[1, 10]';
- Nếu yêu cầu không phải là gửi biểu mẫu, bộ điều khiển sẽ bao gồm tệp
7461 để hiển thị biểu mẫuecho 'rand[1, 10]';
- Nếu yêu cầu là gửi biểu mẫu, thay vào đó, phần thân của câu lệnh
6274 sẽ được thực thiecho 'rand[1, 10]';
Mã này kéo các biến
7123 vàecho 'rand[1, 10]';
7124 ra khỏi mảngecho 'rand[1, 10]';
7149, sau đó tạo thông báo chào mừng thích hợp cho tên đã gửiecho 'rand[1, 10]';
- Thay vì
6205 gửi thông báo chào mừng, bộ điều khiển lưu trữ thông báo chào mừng trong một biến có tên làecho 'rand[1, 10]';
7163echo 'rand[1, 10]';
- Sau khi tạo thông báo chào mừng thích hợp, bộ điều khiển bao gồm mẫu
7486, mẫu này sẽ hiển thị thông báo chào mừng đóecho 'rand[1, 10]';
Tất cả những gì còn lại là ghi tệp
echo 'rand[1, 10]';
7486 vào thư mục echo 'rand[1, 10]';
7451. Đây rồiecho 'rand[1, 10]';
0Đó là nó. Khởi động trình duyệt của bạn và trỏ nó vào
echo 'rand[1, 10]';
7489. Bạn sẽ được nhắc nhập tên của mình và khi gửi biểu mẫu, bạn sẽ thấy thông báo chào mừng phù hợp. URL phải giữ nguyên trong suốt quá trình nàyBạn sẽ nhận thấy rằng tôi đã yêu cầu bạn đặt tên tệp là
echo 'rand[1, 10]';
7462 thay vì echo 'rand[1, 10]';
7047 hoặc tương tự. Lý do tôi sử dụng echo 'rand[1, 10]';
7462 là vì nó có ý nghĩa đặc biệt. echo 'rand[1, 10]';
7462 được gọi là chỉ mục thư mục. Nếu bạn không chỉ định tên tệp khi truy cập URL trong trình duyệt của mình, máy chủ sẽ tìm tệp có tên echo 'rand[1, 10]';
7462 và hiển thị tệp đó. Hãy thử chỉ gõ echo 'rand[1, 10]';
7495 vào trình duyệt của bạn và bạn sẽ thấy trang chỉ mụcGhi chú. máy chủ web có thể có các cấu hình khác nhau và chỉ định một tệp khác làm chỉ mục thư mục. Tuy nhiên,
echo 'rand[1, 10]';
7462 sẽ hoạt động trên hầu hết các máy chủ web mà không cần cấu hình thêmMột trong những lợi ích của việc duy trì cùng một URL trong suốt quá trình nhắc tên người dùng và hiển thị thông báo chào mừng này là người dùng có thể đánh dấu trang bất kỳ lúc nào trong quá trình này và nhận được kết quả hợp lý. Cho dù đó là trang biểu mẫu hay thông báo chào mừng được đánh dấu trang, khi người dùng quay lại, biểu mẫu sẽ xuất hiện trở lại. Trong phiên bản trước của ví dụ này, khi thông báo chào mừng có URL riêng, việc quay lại URL đó mà không gửi biểu mẫu sẽ tạo ra thông báo chào mừng bị hỏng [“Chào mừng đến với trang web của chúng tôi,. ”] hoặc thông báo lỗi PHP nếu, giống như của chúng tôi, máy chủ đang chạy với tính năng báo cáo lỗi được bật
Ghi chú. trong Chương 11, nơi chúng ta thảo luận về "phiên", tôi chỉ cho bạn cách nhớ tên người dùng giữa các lần truy cập
Đưa vào cơ sở dữ liệu
Trong chương này, chúng ta đã thấy ngôn ngữ kịch bản phía máy chủ PHP đang hoạt động khi chúng ta khám phá tất cả các tính năng cơ bản của ngôn ngữ. câu lệnh, biến, toán tử, nhận xét và cấu trúc điều khiển. Các ứng dụng mẫu mà chúng tôi đã xem khá đơn giản, nhưng chúng tôi vẫn dành thời gian để đảm bảo chúng có các URL hấp dẫn và các mẫu HTML cho các trang mà chúng tạo ra không bị lộn xộn bởi mã PHP kiểm soát chúng
Như bạn có thể đã bắt đầu nghi ngờ, sức mạnh thực sự của PHP nằm ở hàng trăm [thậm chí hàng nghìn] chức năng tích hợp sẵn cho phép bạn truy cập dữ liệu trong cơ sở dữ liệu MySQL, gửi email, tạo hình ảnh động và thậm chí tạo tệp Adobe Acrobat PDF
Trong Chương 3, chúng ta sẽ đi sâu vào các hàm MySQL được tích hợp trong PHP, sau đó tạo cơ sở dữ liệu truyện cười. Sau đó, trong Chương 4, chúng ta sẽ xem cách xuất bản cơ sở dữ liệu truyện cười đó lên Web. Những nhiệm vụ này sẽ tạo bối cảnh cho mục tiêu cuối cùng của cuốn sách này. để tạo một hệ thống quản lý nội dung hoàn chỉnh cho trang web của bạn bằng PHP và MySQL
Chia sẻ bài viết này
tom quản gia
Tom Butler là một nhà phát triển web và giảng viên đại học. Anh ấy có bằng tiến sĩ trong lĩnh vực thực hành tốt nhất về công nghệ phần mềm và thích đánh giá các cách tiếp cận khác nhau đối với các vấn đề lập trình