Giới thiệu PHP. Hướng dẫn cho người mới bắt đầu - SitePoint

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

Giới thiệu PHP. Hướng dẫn cho người mới bắt đầu - SitePoint


Đã đế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

_16

Lư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)';
4

HTML 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ệt

Trong 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)';
2

Trì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)';
3

Ví 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út

echo 'rand(1, 10)';
6

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ạ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)';
407

echo 'rand(1, 10)';
6

PHP 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úc

Phầ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)';
2

Do 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ép

Mặ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 echo

echo 'rand(1, 10)';
6

Chứ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 nhau

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

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

Giới thiệu PHP. Hướng dẫn cho người mới bắt đầu - SitePoint

Đố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ào

echo '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)';
419

Khi 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àm

Hà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 50

echo 'rand(1, 10)';
42

echo '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ày

Chú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)';
440

echo 'rand(1, 10)';
43

Bở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)';
44

Lệ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ến

echo 'rand(1, 10)';
45

Số "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)';
46

nhà đ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)';
47

Bạ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)';
448

Trì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)';
48

Hã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)';
49

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

Giới thiệu PHP. Hướng dẫn cho người mới bắt đầu - SitePoint

Đây là một ví dụ về câu lệnh PHP

echo 'rand(1, 10)';
452

echo 'rand(1, 10)';
60

Cấ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ắng

echo 'rand(1, 10)';
61

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)';
452 để in ra một tin nhắn

Thí dụ. PHP-DiceRoll

echo 'rand(1, 10)';
62

Sử 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ên

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

echo 'rand(1, 10)';
63

Xin 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)';
64

Bở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ố đó. Ối

Thậ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)';
66

Bạ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)';
68

Cầ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ậy

Mộ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ạy

Mộ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ưởng

Thí 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ọc

Thí dụ. PHP-DiceRoll-Greater

echo 'rand(1, 10)';
20

Nế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)';
21

Ngườ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 _______0603

Hiệ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ầu

Lư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)';
22

Nó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ã

Giới thiệu PHP. Hướng dẫn cho người mới bắt đầu - SitePoint

Đây là cách nó sẽ xuất hiện trong mã

_
echo 'rand(1, 10)';
23

Câ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ặp

Sử 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ã
    echo 'rand(1, 10)';
    
    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ành
    echo 'rand(1, 10)';
    
    623
  • Đây là hoàn cảnh.
    echo 'rand(1, 10)';
    
    624. Tiếp tục lặp trong khi
    echo 'rand(1, 10)';
    
    622 nhỏ hơn hoặc bằng 10 là cách diễn giải
  • Điều này tiểu bang. "Thêm 1 vào quầy mỗi lần"
    echo 'rand(1, 10)';
    
    626Cũng giống như
    echo 'rand(1, 10)';
    
    627
  • Điều này hiển thị giá trị của bộ đếm theo sau là một khoảng trắng.
    echo 'rand(1, 10)';
    
    628

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

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

Dò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)';
622

Vò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)';
642

Thí dụ. PHP-Dành cho

echo 'rand(1, 10)';
25

Kế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)';
27

Việ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)';
28

Cho 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ạn

Lư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 (
    echo 'rand(1, 10)';
    
    646, v.v. ) trong thử thách 2. ) mà không sử dụng câu lệnh
    echo 'rand(1, 10)';
    
    452 hoặc toán tử nhân (
    echo 'rand(1, 10)';
    
    446)
  • 3. Bảng chín lần nên được in ở định dạng này.
    echo 'rand(1, 10)';
    
    29

    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

Giới thiệu PHP. Hướng dẫn cho người mới bắt đầu - SitePoint

Đây là một ví dụ về vòng lặp

echo 'rand(1, 10)';
614 trong mã

echo 'rand(1, 10)';
30

Sự 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)';
614

Thí dụ. PHP-WhileCount

_
echo 'rand(1, 10)';
31

Mã 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
    echo 'rand(1, 10)';
    
    622 và đặt cho nó giá trị
    echo 'rand(1, 10)';
    
    623
  • Dòng thứ hai bắt đầu một vòng lặp
    echo 'rand(1, 10)';
    
    614, với yêu cầu giá trị của
    echo 'rand(1, 10)';
    
    622 phải nhỏ hơn hoặc bằng (
    echo 'rand(1, 10)';
    
    629) 10 (
    echo 'rand(1, 10)';
    
    664)
  • Dấu ngoặc mở báo hiệu bắt đầu khối mã điều kiện cho vòng lặp
    echo 'rand(1, 10)';
    
    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ại
  • Giá trị của
    echo 'rand(1, 10)';
    
    622 được xuất đầy đủ trên dòng
    echo 'rand(1, 10)';
    
    628, theo sau là khoảng trắng
  • 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
    echo 'rand(1, 10)';
    
    627 là
    echo 'rand(1, 10)';
    
    675; . Nếu
    echo '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 đặt
    echo 'rand(1, 10)';
    
    678 ở đâu không quan trọng. Hãy thận trọng khi sử dụng
    echo 'rand(1, 10)';
    
    678 vì đặt nó ở vị trí không chính xác có thể dẫn đến lỗi. Nếu
    echo 'rand(1, 10)';
    
    622 bằng 0, mã
    echo 'rand(1, 10)';
    
    681 sẽ in ra
    echo 'rand(1, 10)';
    
    623, trong khi
    echo 'rand(1, 10)';
    
    683 sẽ in ra
    echo 'rand(1, 10)';
    
    684
  • Dấu đóng ngoặc chỉ ra rằng phần thân của vòng lặp
    echo 'rand(1, 10)';
    
    614 đã kết thúc

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

Hình ảnh tiếp theo hiển thị kết quả tổng thể của mã

Giới thiệu PHP. Hướng dẫn cho người mới bắt đầu - SitePoint

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

Thí dụ. PHP-DiceRoll-While

echo 'rand(1, 10)';
32

Sẽ 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ụng

Trong 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)';
33

Bạ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)';
34

Lầ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)';
614

Lư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)';
35

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 đị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)';
36

Lư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)';
37

Cá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)';
614

Ba 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ường

Thô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)';
38

Bạ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)';
39

Sử 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)';
60

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

Thay 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ăng

echo 'rand(1, 10)';
62

Khi 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)';
63

Mặ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)';
65

Bằ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ắc

Thí dụ. PHP-DiceRoll-English-Array

_
echo 'rand(1, 10)';
66

Như 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)';
452

Trướ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ặt

Thứ 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ắc

Thí dụ. PHP-DiceRoll-English-If-TwoDice

_
echo 'rand(1, 10)';
67

Thay 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)';
68

Mặ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)';
69

Bạ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)';
60

Bâ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)';
61

Như 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ỗi

Tươ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)';
62

Thô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 URL

Tạ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 sau

echo 'rand(1, 10)';
63

Biế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ệp

Thí dụ. PHP-NHẬN

_
echo 'rand(1, 10)';
64

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

Giới thiệu PHP. Hướng dẫn cho người mới bắt đầu - SitePoint

Đâ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)';
65

Bạ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)';
267

echo 'rand(1, 10)';
66

Sử 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 ra

Như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)';
261

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 để 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)';
67

Chỉnh sửa URL để thêm các thẻ _12280 trước tên và

echo 'rand(1, 10)';
279 sau tên

echo 'rand(1, 10)';
68

Khi 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

Giới thiệu PHP. Hướng dẫn cho người mới bắt đầu - SitePoint

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

Nế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ết

Vì 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ưới

Thí dụ. PHP-GET-Sát trùng

echo 'rand(1, 10)';
69

Hã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ọng

echo '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 đây

Lệ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)';
20

Vă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ác

Lư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 đô la

Chuỗ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)';
21

Phầ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 động

Thô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ên

echo 'rand(1, 10)';
68

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

Giới thiệu PHP. Hướng dẫn cho người mới bắt đầu - SitePoint

Đ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ứ hai

Thậ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ày

echo 'rand(1, 10)';
23

Liê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ữa

Hai 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 đây

Thí dụ. PHP-GET-TwoVars

echo 'rand(1, 10)';
24

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

Giới thiệu PHP. Hướng dẫn cho người mới bắt đầu - SitePoint

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

Thí dụ. PHP-GET-Biểu mẫu

echo 'rand(1, 10)';
25

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

Giới thiệu PHP. Hướng dẫn cho người mới bắt đầu - SitePoint

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

Tuy 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)';
340

Giá 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ường

Chỉ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)';
347

echo 'rand(1, 10)';
26

Vớ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)';
349

Thí dụ. PHP-POST-Biểu mẫu

echo 'rand(1, 10)';
27

Trang 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

Giới thiệu PHP. Hướng dẫn cho người mới bắt đầu - SitePoint

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

echo 'rand(1, 10)';
28

Vâ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
    echo 'rand(1, 10)';
    
    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ống
  • Toán tử
    echo 'rand(1, 10)';
    
    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òng
    echo 'rand(1, 10)';
    
    364 thêm từng số (theo sau là khoảng trắng) vào cuối biến
    echo '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áy
  • Bạn có thể coi câu lệnh
    echo 'rand(1, 10)';
    
    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ệp
    echo '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ào
    echo 'rand(1, 10)';
    
    359, thay thế dòng
    echo 'rand(1, 10)';
    
    356, sẽ tạo ra kết quả tương tự
  • Tệp không kết thúc bằng
    echo 'rand(1, 10)';
    
    2 để khớp với phần mở đầu
    echo '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 ở đâu

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

Bạ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ôi

Thí dụ. PHP-Đếm-Mẫu

echo 'rand(1, 10)';
29

Ngoạ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ản

Nhữ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 trang

Cá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ôi

Mố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ười

Tố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)';
60

Mã 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)';
8

Bạ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)';
62

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. 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)';
370

Sử dụng đoạn mã sau để bao gồm một tệp từ thư mục trên

echo 'rand(1, 10)';
63

echo '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ại

Thay đổ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)';
605

Thí 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)';
63

Nó 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ốn

May 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ày

Chẳ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)';
67

Do đó, 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)';
370

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à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ại

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. 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)';
8

Thậ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)';
605

Nhiề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ạn

Thườ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)';
605

Thí dụ. PHP-Form-Controller

_
echo 'rand(1, 10)';
68

Như 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)';
69

Thoạ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
    echo 'rand(1, 10)';
    
    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ến
    echo 'rand(1, 10)';
    
    323 hay không.
    echo 'rand(1, 10)';
    
    667 là nơi PHP sẽ lưu giá trị nếu có

    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

    echo 'rand(1, 10)';
    
    668 sẽ cho bạn biết; .
    echo 'rand(1, 10)';
    
    667 sẽ không được đặt nếu
    echo 'rand(1, 10)';
    
    670 là sai

    Chúng tôi cần câu lệnh

    echo 'rand(1, 10)';
    
    452 này để kiểm tra xem
    echo '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 true

    Kết quả là,

    echo 'rand(1, 10)';
    
    677 sẽ trả về true và phần thân của câu lệnh
    echo 'rand(1, 10)';
    
    452 sẽ được thực thi nếu yêu cầu không chứa biến
    echo 'rand(1, 10)';
    
    323

  • Bộ điều khiển bao gồm tệp
    echo 'rand(1, 10)';
    
    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ẫu
  • 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
    echo 'rand(1, 10)';
    
    474 được thực thi ở vị trí của nó

    Các biến

    echo 'rand(1, 10)';
    
    323 và
    echo 'rand(1, 10)';
    
    324 được mã này lấy ra khỏi mảng
    echo 'rand(1, 10)';
    
    349, sau đó tạo thông báo chào mừng thích hợp cho tên đã nhập

  • 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)';
    
    363 thay vì
    echo 'rand(1, 10)';
    
    405ing nó
  • Bộ điều khiển bao gồm mẫu
    echo 'rand(1, 10)';
    
    686, mẫu này sẽ hiển thị thông báo chào mừng phù hợp sau khi được tạo

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

echo 'rand(1, 10)';
0

Bâ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ợp

Như 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ục

Lư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ào

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

tom quản gia

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

Giới thiệu PHP. Hướng dẫn cho người mới bắt đầu - SitePoint


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

Chú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)';
9

Hầ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ày

echo 'rand(1, 10)';
62

Khô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 PHP

Trong 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 được

Vì 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)';
70

Nế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)';
71

Ví 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út

echo 'rand(1, 10)';
74

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

echo 'rand(1, 10)';
64

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ú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ỗi

Bấ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)';
80

Vì 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 echo

echo 'rand(1, 10)';
74

Hà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 nhau

Bạ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)';
6219

echo '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ới

PHP 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

Giới thiệu PHP. Hướng dẫn cho người mới bắt đầu - SitePoint

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

Nế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)';
621

Vì 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ăng

Hầ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àm

Mọ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ày

echo 'rand(1, 10)';
622

Chú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ẩy

Sau 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)';
6240

echo 'rand(1, 10)';
623

PHP 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ản

echo 'rand(1, 10)';
624

Khi 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)';
625

Khi 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)';
626

nhà đ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)';
627

Từ 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)';
628

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

Giới thiệu PHP. Hướng dẫn cho người mới bắt đầu - SitePoint

Đây là một câu lệnh

echo 'rand(1, 10)';
6252 trông như thế nào trong mã PHP

echo 'rand(1, 10)';
640

Cấ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 6

echo '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)';
6252

Thí dụ. PHP-DiceRoll

echo 'rand(1, 10)';
642

echo '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ánh

Câ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ạy

echo 'rand(1, 10)';
643

Ghi 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ất

echo '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. Ối

Tệ 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êu

Nế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ệt

echo 'rand(1, 10)';
645

cá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)';
646

Nế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 ứng

Thí dụ. PHP-DiceRoll-Khác

echo 'rand(1, 10)';
648

Ghi 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ỗi

Vớ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ư sau

Thí dụ. PHP-DiceRoll-Hoặc

echo 'rand(1, 10)';
649

Toá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ất

Thí 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)';
6296

Giố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ắng

Thí 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ắc

Chú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)';
702

Có 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ểu

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

Giới thiệu PHP. Hướng dẫn cho người mới bắt đầu - SitePoint

Đây là những gì nó trông giống như trong mã

echo 'rand(1, 10)';
703

Câ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ã sau

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

  • echo 'rand(1, 10)';
    
    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ành
    echo 'rand(1, 10)';
    
    6423
  • echo 'rand(1, 10)';
    
    6424. Đây là điều kiện. Nó có thể được đọc là “tiếp tục lặp trong khi
    echo '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ới
    echo 'rand(1, 10)';
    
    6427
  • echo 'rand(1, 10)';
    
    6428. Điều này in giá trị của bộ đếm theo sau là một khoảng trắng

Đ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úng

Bạ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ùng

Phầ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)';
6427

Bằ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ần

Thí 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)';
706

Vò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)';
708

Má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ện

Ghi 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 (
    echo 'rand(1, 10)';
    
    6246) hoặc câu lệnh
    echo 'rand(1, 10)';
    
    6252
  • thử thách 3. in bảng chín lần ở định dạng này.
    echo 'rand(1, 10)';
    
    709

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

Hình ảnh sau đây cho thấy cách hoạt động của vòng lặp

echo 'rand(1, 10)';
6414

Giới thiệu PHP. Hướng dẫn cho người mới bắt đầu - SitePoint

Đây là vòng lặp

echo 'rand(1, 10)';
6414 trông như thế nào trong mã

echo 'rand(1, 10)';
710

Vò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 đóng

Bạ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)';
6413

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

  • echo 'rand(1, 10)';
    
    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)';
    
    6423
  • echo 'rand(1, 10)';
    
    6464. Dòng thứ hai là điểm bắt đầu của vòng lặp
    echo 'rand(1, 10)';
    
    6414, điều kiện là giá trị của
    echo 'rand(1, 10)';
    
    6422 nhỏ hơn hoặc bằng (
    echo 'rand(1, 10)';
    
    6429) đến 10
  • echo '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ặp
    echo '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 đúng
  • echo 'rand(1, 10)';
    
    6428. Dòng này chỉ xuất giá trị của
    echo 'rand(1, 10)';
    
    6422, theo sau là khoảng trắng
  • echo 'rand(1, 10)';
    
    6472. Dòng thứ tư thêm
    echo 'rand(1, 10)';
    
    6423 vào giá trị của
    echo 'rand(1, 10)';
    
    6422.
    echo 'rand(1, 10)';
    
    6475 là viết tắt của
    echo 'rand(1, 10)';
    
    6427.
    echo 'rand(1, 10)';
    
    6426 cũng sẽ hoạt động ở đây. Vị trí của
    echo '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ếu
    echo 'rand(1, 10)';
    
    6478 ở trước tên biến, bộ đếm sẽ tăng lên trước khi giá trị được đọc. Khi
    echo 'rand(1, 10)';
    
    6422 bằng 0, mã
    echo 'rand(1, 10)';
    
    6481 sẽ in ra
    echo 'rand(1, 10)';
    
    6423, trong khi đó,
    echo 'rand(1, 10)';
    
    6483 sẽ in ra
    echo 'rand(1, 10)';
    
    6484. Hãy cẩn thận khi sử dụng
    echo 'rand(1, 10)';
    
    6478, vì đặt sai vị trí có thể gây ra lỗi
  • echo 'rand(1, 10)';
    
    6261. Dấu ngoặc đóng đánh dấu phần cuối của thân vòng lặp
    echo 'rand(1, 10)';
    
    6414

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

Kết quả ròng của mã được hiển thị trong hình ảnh sau

Giới thiệu PHP. Hướng dẫn cho người mới bắt đầu - SitePoint

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

Thí dụ. PHP-DiceRoll-While

echo 'rand(1, 10)';
712

Thao 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ụng

Có 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 sau

echo '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)';
714

Lầ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)';
715

Tậ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ẩy

echo 'rand(1, 10)';
716

Ghi 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ên

echo 'rand(1, 10)';
717

Ký 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)';
6414

Mã 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)';
718

Mỗ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)';
719

Bạ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)';
740

Cá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)';
6252

Thí dụ. PHP-DiceRoll-English-If

echo 'rand(1, 10)';
741

Giả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ộn

echo 'rand(1, 10)';
742

Ký 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 đây

echo 'rand(1, 10)';
743

Mặ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)';
744

Trong 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)';
745

Biế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)';
6266

Thí dụ. PHP-DiceRoll-English-Array

echo 'rand(1, 10)';
746

Như 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ắc

Thí dụ. PHP-DiceRoll-English-If-TwoDice

echo 'rand(1, 10)';
747

Thay 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)';
748

Mặ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)';
749

Giố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)';
640

Bâ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)';
641

Loạ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ối

Tươ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)';
642

Xem 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)';
7044

Hã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ày

echo '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 sau

Thí dụ. PHP-NHẬN

echo 'rand(1, 10)';
644

Bâ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ưới

Giới thiệu PHP. Hướng dẫn cho người mới bắt đầu - SitePoint

Chú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)';
645

Sử 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)';
6205

echo 'rand(1, 10)';
646

Giá 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ày

echo 'rand(1, 10)';
647

Chỉ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ên

echo 'rand(1, 10)';
648

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

Giới thiệu PHP. Hướng dẫn cho người mới bắt đầu - SitePoint

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 ra

Tô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ưới

Thí dụ. PHP-GET-Sát trùng

echo 'rand(1, 10)';
649

Có 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ọng

Hã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ác

Ghi 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)';
7094

Tham 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)';
801

Phầ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ày

Nế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ên

echo 'rand(1, 10)';
648

Khi 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

Giới thiệu PHP. Hướng dẫn cho người mới bắt đầu - SitePoint

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 trang

Chú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úng

Truyề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ày

echo 'rand(1, 10)';
803

Lầ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ình

Thí dụ. PHP-GET-TwoVars

echo 'rand(1, 10)';
804

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

Giới thiệu PHP. Hướng dẫn cho người mới bắt đầu - SitePoint

Đ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ẫu

Thí dụ. PHP-GET-Biểu mẫu

echo 'rand(1, 10)';
805

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

Giới thiệu PHP. Hướng dẫn cho người mới bắt đầu - SitePoint

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

Tuy 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ản

Thuộ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ường

Chỉ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)';
7147

echo 'rand(1, 10)';
806

Giá 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ày

Thí dụ. PHP-POST-Biểu mẫu

echo 'rand(1, 10)';
807

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

Giới thiệu PHP. Hướng dẫn cho người mới bắt đầu - SitePoint

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

echo '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ệc

Tuy 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ày

echo 'rand(1, 10)';
808

Vâ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ì
    echo 'rand(1, 10)';
    
    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ỗng
  • Dòng
    echo 'rand(1, 10)';
    
    7164 thêm từng số (theo sau là khoảng trắng) vào cuối biến
    echo '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õ
  • Câu lệnh
    echo 'rand(1, 10)';
    
    7156 hướng dẫn PHP thực thi nội dung của tệp
    echo 'rand(1, 10)';
    
    7170 tại vị trí này. Bạn có thể coi câu lệnh
    echo '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ào
    echo 'rand(1, 10)';
    
    7159, ghi đè lên dòng
    echo 'rand(1, 10)';
    
    7156
  • Cuối cùng, bạn có thể nhận thấy rằng tệp không kết thúc bằng
    echo 'rand(1, 10)';
    
    2 để khớp với phần mở đầu
    echo '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ã PHP

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

Vì 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 theo

Thí dụ. PHP-Đếm-Mẫu

echo 'rand(1, 10)';
809

Tệ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)';
7159

Nhữ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)';
7159

Sử 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ôi

Mố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)';
7199

Tố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)';
740

Nhì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)';
8

Bạ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)';
741

Và đâ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)';
742

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. 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)';
743

Bit

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

Tiế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ới

Thí dụ. PHP-Count-Template-Secured

echo 'rand(1, 10)';
744

Nế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)';
8

Thư 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)';
7429

Vì đ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)';
743

Nó 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ại

Ví 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ã sau

echo '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)';
7431

echo '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)';
7170

Cá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ày

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ọ. 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úng

Khi 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)';
7454

Nhiề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 nhau

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

Thí dụ. PHP-Form-Controller

echo 'rand(1, 10)';
748

Như 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ã sau

echo 'rand(1, 10)';
749

Mã 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
    echo 'rand(1, 10)';
    
    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ến
    echo 'rand(1, 10)';
    
    7123 không. Nếu đúng như vậy, PHP sẽ lưu trữ giá trị trong
    echo 'rand(1, 10)';
    
    7467

    echo '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ếu
    echo 'rand(1, 10)';
    
    7467 có giá trị, thì
    echo 'rand(1, 10)';
    
    7470 sẽ đúng. Nếu
    echo 'rand(1, 10)';
    
    7467 không được đặt, thì
    echo 'rand(1, 10)';
    
    7470 sẽ là sai

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

    echo 'rand(1, 10)';
    
    6252 này để kiểm tra xem
    echo '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 đúng

    Do đó, nếu yêu cầu không chứa biến

    echo 'rand(1, 10)';
    
    7123, thì
    echo 'rand(1, 10)';
    
    7477 sẽ trả về true và phần thân của câu lệnh
    echo 'rand(1, 10)';
    
    6252 sẽ được thực thi

  • 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
    echo 'rand(1, 10)';
    
    7461 để hiển thị biểu mẫu
  • 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
    echo 'rand(1, 10)';
    
    6274 sẽ được thực thi

    Mã này kéo các biến

    echo 'rand(1, 10)';
    
    7123 và
    echo 'rand(1, 10)';
    
    7124 ra khỏi mảng
    echo 'rand(1, 10)';
    
    7149, sau đó tạo thông báo chào mừng thích hợp cho tên đã gửi

  • Thay vì
    echo 'rand(1, 10)';
    
    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)';
    
    7163
  • 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
    echo 'rand(1, 10)';
    
    7486, mẫu này sẽ hiển thị thông báo chào mừng đó

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

echo '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ày

Bạ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ục

Ghi 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êm

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

Tôi cần gì để học PHP?

Tìm hiểu kiến ​​thức cơ bản về cách thức hoạt động của 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. Tìm hiểu cách thiết lập môi trường phát triển bằng cách cài đặt PHP 8 và MySQL bằng Docker, trong đoạn trích này từ cuốn sách PHP & MySQL của chúng tôi. Người mới học Ninja

Chương 2 nói về gì trong PHP?

chương 2. Sử dụng Biến và Toán tử giải thích các kiểu dữ liệu, biến và toán tử PHP, đồng thời thảo luận về một trong những ứng dụng phổ biến nhất của PHP, xử lý đầu vào biểu mẫu

Mã PHP là gì?

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

Mã PHP nên kết thúc ở đầu hay cuối?

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