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 Show
Đã đế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à 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 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 3; Hãy kiểm tra một tập lệnh PHP Thí dụ. PHP-RandomNumber _16Lưu mã này dưới dạng 7 trong thư mục 8 và chuyển đến 9 để chạy mãChỉ dòng giữa 1 và 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. 1 đánh dấu sự bắt đầu của tập lệnh PHP được nhúng và 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) 4HTML này được tạo động trên máy chủ trước khi được gửi tới trình duyệt; Mã PHP đã được sử dụng để tạo một số ngẫu nhiên, nhưng tất cả dấu vết của mã PHP đã biến mất khi xem mã nguồn trong trình duyệt. Hãy thử chạy tập lệnh một vài lần và quan sát số thay đổi như thế nào. Ví dụ này minh họa một số lợi ích của kịch bản phía máy chủ bằng cách thay thế nó bằng đầu ra tập lệnh trông giống hệt như HTML thông thường
Cú pháp và câu lệnh cơ bảnBấ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 ( 404)Tuyên bố này là điển hình cho PHP 6Đây là một câu lệnh 405, chèn văn bản được cung cấp vào mã HTML của trang tại vị trí đặt tập lệnh PHP để tạo nội dung (thường là mã HTML) để gửi tới trình duyệtTrong trường hợp này, chúng tôi đã yêu cầu xuất một chuỗi văn bản. Điều quan trọng cần lưu ý là chuỗi văn bản chứa các thẻ HTML ( 408 và 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 2Trình duyệt của bạn sẽ nhận được mã HTML này nếu bạn tải tệp này lên máy chủ web của mình và yêu cầu nó từ đó 3Ví dụ về 7 trước đó có câu lệnh 405 phức tạp hơn một chút 6PHP cố gắng đọc bất kỳ thứ gì tồn tại bên ngoài dấu ngoặc kép như một hướng dẫn mà nó phải tuân theo. Bạn sẽ nhận thấy rằng, trong ví dụ đầu tiên, PHP được cung cấp một số văn bản để in trực tiếp, trong khi ở ví dụ thứ hai, PHP được cung cấp hướng dẫn để thực hiện theo. PHP không diễn giải các chuỗi dưới dạng hướng dẫn phải tuân theo; . Bạn có thể làm mọi việc với chúng, chẳng hạn như gửi chúng tới trình duyệt, nhưng PHP không xử lý chuỗi này khác với chuỗi khác; Kết quả là đoạn mã bên dưới sẽ gửi lệnh 405 chuỗi 407 6PHP sẽ nhận ra 414 đầu tiên là phần đầu của chuỗi và tìm 414 tiếp theo và sử dụng nó làm phần cuối của chuỗi vì một chuỗi được biểu thị bằng dấu ngoặc kép bắt đầu và dấu ngoặc kép kết thúcPhần sau chứa mã không hợp lệ và được coi là một chuỗi lệnh để chạy 2Do các dấu ngoặc kép bị xóa, PHP sẽ cố gắng thực thi các lệnh 416, 417, 418, v.v., không lệnh nào trong số đó là lệnh hợp lệ trong PHP, vì vậy đoạn mã trên sẽ dẫn đến lỗi. Hãy nhớ gửi kèm theo bất cứ điều gì bạn muốn được coi là văn bản trong dấu ngoặc képMặt khác, đoạn mã sau sẽ thực thi một lệnh hợp pháp—"hàm" 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 6Chức năng là một loại lệnh đặc biệt thực hiện một nhiệm vụ cụ thể; . Hàm 419 sẽ tạo ra một số ngẫu nhiên trong trường hợp này, nhưng các hàm khác nhau phục vụ các mục đích khác nhauPHP có nhiều hàm dựng sẵn cho phép bạn thực hiện tất cả mọi thứ, chẳng hạn như gửi email và làm việc với dữ liệu được lưu trữ trong nhiều loại cơ sở dữ liệu khác nhau, vì vậy bạn có thể nhanh chóng biết liệu một hàm nào đó có phải là hàm hay không vì theo sau nó là dấu ngoặc đơn Hàm 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ì 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 423, đây có thể không phải là điều bạn muốn làm. Mọi thứ bên trong dấu ngoặc kép là một chuỗi và là dữ liệu mà PHP sẽ làm việc với. PHP sẽ xem bất kỳ văn bản nào bên ngoài dấu ngoặc kép dưới dạng một loạt lệnh mà nó phải tuân theoCác chuỗi có thể chứa bất kỳ ký tự nào theo bất kỳ thứ tự nào vì PHP không cố gắng hiểu chúng. Mã, về cơ bản là một loạt các hướng dẫn, phải tuân theo một cấu trúc nghiêm ngặt để máy tính hiểu được mã đó Điều quan trọng cần lưu ý là việc sử dụng trình soạn thảo mã có tô sáng cú pháp giúp dễ dàng xác định xem thứ gì đó là chuỗi hay mã. Các chuỗi và mã yêu cầu xử lý sẽ có các màu khác nhau Đánh dấu mã đơn giản trong trình chỉnh sửa Visual Studio Code được hiển thị trong hình bên dưới Đối với hầu hết các mục đích, PHP hỗ trợ cả dấu ngoặc đơn ( 414) và dấu ngoặc kép ( 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ụ 40Để nói với PHP rằng câu trích dẫn sau 426 không phải là phần cuối của chuỗi, chúng ta cần chèn một 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 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ư 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 423 hướng dẫn PHP thực thi hàm có tên 419Khi một hàm trong PHP được gọi, nó thường trả về một giá trị và sau đó, PHP hoạt động như thể bạn chỉ cần nhập giá trị được trả về vào mã của mình. Câu lệnh 405 trong ví dụ 431 gọi hàm 419 trả về một số ngẫu nhiên dưới dạng một chuỗi văn bản, sau đó xuất giá trị được trả về bởi lệnh gọi hàmHàm 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 42 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 ( 436) vì hai lý do. Hàm 419 yêu cầu bạn cung cấp giá trị tối thiểu và tối đa, đồng thời chúng đóng vai trò là phần đầu và phần cuối của danh sách đối số — câu lệnh PHP — mà bạn muốn cung cấp để hướng dẫn hàm phải làm gì. Có một dấu phẩy ngăn cách các giá trị nàyChúng ta sẽ kiểm tra các hàm chấp nhận các loại đối số khác nhau sau này, cũng như các hàm không chấp nhận đối số nào cả. Mặc dù không có gì được nhập vào giữa chúng, các hàm này vẫn yêu cầu dấu ngoặc đơn Biến, toán tử và nhận xétBiế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à 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à 440 43Bởi vì PHP là ngôn ngữ được gõ lỏng lẻo, một biến duy nhất có thể lưu trữ bất kỳ loại dữ liệu nào trong suốt vòng đời của nó, bao gồm số, chuỗi văn bản và các loại giá trị khác. Biến 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 đó_ 44Lệnh 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 45Số "3" sẽ được gửi đến trình duyệt khi mã này thực thi để nó có thể được nhìn thấy trên trang Bạn có thể lưu trữ đầu ra của hàm và sử dụng nó sau này trong tập lệnh ngoài các chuỗi hoặc số cụ thể _ 46nhà điều hành(Có một cách khác để thực sự biểu thị "bằng" trong PHP, như chúng ta sẽ thấy bên dưới. ) Dấu bằng chúng ta đã sử dụng trong hai câu lệnh trước được gọi là toán tử gán vì nó được dùng để gán giá trị cho các biến. ) Các phép toán khác nhau có thể được thực hiện trên các giá trị bằng cách sử dụng các toán tử khác 47Bạn có thể suy ra từ những ví dụ này rằng 444 đại diện cho toán tử cộng, 445 đại diện cho phép trừ, 446 đại diện cho phép nhân và 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 448Trình thông dịch PHP sẽ bỏ qua mọi thứ nằm giữa hai dấu phân cách này, vì vậy nếu bạn muốn một nhận xét trải rộng trên nhiều dòng, hãy bắt đầu bằng 449 và kết thúc bằng 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 48Hãy xem xét chuỗi câu lệnh này để minh họa cách các biến có thể được sử dụng ở hầu hết mọi nơi bạn sử dụng một giá trị 49Nếu bạn đặt một biến bên trong dấu ngoặc đơn, nó sẽ in tên thay vì nội dung của biến; . Ngược lại, khi sử dụng dấu ngoặc kép, biến trong chuỗi sẽ bị thay đổi để phản ánh nội dung của biến Bạn nên làm quen với cách thực hành nối (hiển thị ở dòng thứ ba từ dòng cuối cùng), vì việc đặt các biến bên trong dấu ngoặc kép chỉ hoạt động trong các tình huống đơn giản và chúng tôi sẽ không sử dụng mã đơn giản như vậy cho phần lớn . 451)Cấu trúc điều khiểnNế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 ifCâu lệnh 452 là cấu trúc điều khiển cơ bản và được sử dụng thường xuyên nhất, và dòng chảy của một chương trình thông qua một câu lệnh có thể được nhìn thấy trong hình minh họa bên dướiĐây là một ví dụ về câu lệnh PHP 452 60Cấu trúc điều khiển này cho phép chúng tôi hướng dẫn PHP chỉ thực thi một nhóm câu lệnh khi một yêu cầu cụ thể được đáp ứng Cuộn xúc xắc có thể được lập mô hình bằng cách sử dụng chức năng 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 61Nếu người chơi tung được sáu và thắng, bạn có thể sử dụng câu lệnh 452 để in ra một tin nhắnThí dụ. PHP-DiceRoll 62Sử dụng một 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 457 trong điều kiện trênBạn có thể đặt bao nhiêu dòng mã tùy thích giữa các dấu ngoặc nhọn trong câu lệnh 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 ( 461), tất cả mã được thực thi liên tục 63Xin lưu ý rằng phải nhập dấu bằng kép ( 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_ 64Bởi vì điều kiện này sử dụng toán tử gán ( 458) thay vì toán tử bằng ( 457), nó sẽ thực sự đặt giá trị của 466 thành 467 thay vì so sánh nó với số đó. ỐiThậm chí tệ hơn, bất kể giá trị ban đầu của 466 là gì, mã điều kiện của câu lệnh 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 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_ 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 66Bạn có thể thấy rằng điều này hiện được in trong trình duyệt khi bạn chạy mã cập nhật _ 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 474 có thể được sử dụng để thực hiện điều này; Thí dụ. PHP-DiceRoll-Khác 68Cần lưu ý rằng từ 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 ( 427) là kết thúc của chuỗi bằng cách làm như vậyMột (và chỉ một. ) của hai khối mã sẽ chạy nếu có câu lệnh khác. Nếu điều kiện được thỏa mãn, mã trong khối 452 sẽ chạy hoặc mã trong khối 474 sẽ chạyMột câu lệnh 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 452 thành câu sau nếu trò chơi đã được thay đổi để cả 484 và 467 đều là số trúng thưởngThí dụ. PHP-DiceRoll-Hoặc 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 ( 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 ( 457) trong câu lệnh 452. Câu lệnh 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 ( 490) và nhỏ hơn ( 491) trong toán họcThí dụ. PHP-DiceRoll-Greater 20Nếu chúng tôi muốn 4, 5 và 6 là số chiến thắng, chúng tôi có thể thay đổi điều kiện thành 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 21Người chơi phải đổ 6 trên cả hai viên xúc xắc để thắng trò chơi vì điều kiện 498 chỉ có thể được thỏa mãn nếu 499 đúng và 600. Người chơi sẽ thắng nếu họ đổ được 6 hoặc 1 hoặc ( 487) thay vì 1 và ( 601), tương đương với _______0603Hiện tại, hiểu biết chung về các câu lệnh 604 là đủ và chúng tôi sẽ xem xét các điều kiện phức tạp hơn khi có nhu cầuLưu ý rằng PHP cũng cho phép thay thế 605 cho 487 và 607 cho 601. Ví dụ 22Nói chung, hãy tránh các toán tử "đánh vần" vì có một số khác biệt nhỏ giữa hoạt động của 605 và 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 ( 487) và dấu và kép ( 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 613 và vòng lặp 614Đối với vòng lặpHình ảnh bên dưới mô tả quy trình của vòng lặp 613 và được sử dụng khi bạn biết trước số lần bạn cần chạy cùng một đoạn mãĐây là cách nó sẽ xuất hiện trong mã _ 23Câu lệnh 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 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 619 được thực thi mỗi lần qua vòng lặpSử dụng mã bên dưới để sử dụng vòng lặp 613 để đếm đến mười_ 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
Toán tử 629 được sử dụng trong điều kiện này; . Các toán tử 631 (lớn hơn hoặc bằng) và 632 (không bằng) là các tùy chọn bổ sungMặc dù thoạt nhìn, mã có vẻ khó đọc hơn một chút, nhưng việc đặt tất cả mã liên quan đến việc kiểm soát vòng lặp vào cùng một vị trí thực sự giúp bạn dễ hiểu hơn một khi bạn đã quen với cú pháp. Bạn sẽ có nhiều cơ hội để Hãy xem cách thêm 440 mỗi khi bạn có thể thay đổi vòng lặp 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 613 để có các kết quả khác nhauDòng cuối cùng của vòng lặp, 626, là phiên bản rút gọn của 627 và hướng dẫn người dùng thêm 1 vào giá trị của 622Vòng lặp for có thể được sử dụng để đếm ba phần bằng cách thay đổi 626 thành 642Thí dụ. PHP-Dành cho 25Kết quả là, điều sau đây sẽ xảy ra 26Để thực hiện các hành động cụ thể trên mỗi lần lặp, vòng lặp 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 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 _ 27Việc sử dụng một vòng lặp về mặt chức năng tương đương với việc sao chép và dán mã mười lần và sẽ dẫn đến kết quả chính xác như sau, cho phép chúng ta tung xúc xắc mười lần mà không cần phải làm mới trang mỗi lần _ 28Cho dù bạn sao chép và dán hay sử dụng vòng lặp, máy tính không quan tâm. Nó sẽ đơn giản thực thi mã, nhưng với tư cách là nhà phát triển, bạn sẽ nhanh chóng hiểu rằng vòng lặp là một lựa chọn tốt hơn. Sử dụng một vòng lặp, bạn có thể thay đổi mã ở một nơi và nó sẽ có tác động đến tất cả các lần lặp lại của vòng lặp, không giống như thay đổi mã ở mười nơi khác nhau để cho phép 484 làm số chiến thắng. Nếu bạn thấy mình đang sao chép và dán mã, hầu như luôn có cách tốt hơn để hoàn thành mục tiêu của bạnLưu ý rằng bạn có thể bắt đầu lập trình cho chính mình ngay bây giờ khi bạn đã quen thuộc với các vòng lặp. Bạn có thể vượt qua những trở ngại này?
Vòng lặp WhileVòng lặp 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 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 614 được mô tả trong hình bên dướiĐây là một ví dụ về vòng lặp 614 trong mã 30Sự khác biệt giữa vòng lặp 614 và câu lệnh 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 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 613 có thể được tạo bằng vòng lặp 614Thí dụ. PHP-WhileCount _ 31Mã này có vẻ hơi đáng sợ, tôi biết, nhưng hãy để tôi hướng dẫn bạn từng dòng một. Điều này hoạt động theo cách chính xác giống như vòng lặp 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
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 622 là 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 622 ( 623) được xuất ra và 622 được cung cấp giá trị mới là 693 và giá trị mới của 440 được gán. Cuối cùng, 622 được cho một giá trị là 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ị 440, 495, 484, 467, 200, 201, 202 và 203Hình ảnh tiếp theo hiển thị kết quả tổng thể của mã Mặc dù bạn có thể tạo bộ đếm bằng vòng lặp 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 614 vì có thể cần một hoặc hàng trăm lần tung để có được sáuThí dụ. PHP-DiceRoll-While 32Sẽ có một số lần tung khác nhau mỗi lần bạn chạy mã trước khi giành chiến thắng và xúc xắc sẽ tiếp tục tung cho đến khi con số 6 được tung ra Biến 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 614. Câu lệnh while sử dụng điều kiện 209. Dòng 212 phía trên vòng lặp 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 614 thực thi, điều kiện 209 được thỏa mãn vì 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 466 không được tạo trước khi vòng lặp bắt đầu vì nó chưa được gán giá trị trước khi được sử dụngTrong những tình huống như thế này, một biến thể của vòng lặp 614 có tên là 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_ 33Bạn có thể bỏ qua dòng đầu tiên trong ví dụ tung xúc xắc trước đó bằng cách thực hiện điều này Thí dụ. PHP-DiceRoll-DoWhile _ 34Lần này do điều kiện ở dưới cùng nên khi câu lệnh 614 thực hiện thì biến 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 614Lưu ý rằng PHP bỏ qua khoảng trắng và không quan tâm mã của bạn được định dạng như thế nào. Đây là cách bạn có thể đã viết ví dụ trước 35Các lập trình viên khác nhau có các kiểu ưa thích khác nhau, chẳng hạn như sử dụng các tab hoặc dấu cách để thụt đầu dòng hoặc định vị dấu ngoặc mở trên cùng một dòng với câu lệnh hoặc sau nó, nhưng bất kể những lựa chọn này là gì, tập lệnh sẽ luôn hoạt động theo cùng một cách. Tuy nhiên, máy tính không quan tâm liệu một dấu ngoặc nằm trên cùng một dòng hay dòng tiếp theo, vì vậy hãy sử dụng bất kỳ kiểu nào bạn cảm thấy thoải mái nhất. Thậm chí còn có các hướng dẫn về kiểu mã hóa chỉ định vị trí đặt dấu ngoặc nhọn và dấu ngoặc đơn và cách định dạng mã MảngNế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 ( 223 và 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_ 36Lưu ý rằng PHP cũng cho phép định nghĩa mảng bằng từ khóa 225. Ký hiệu dấu ngoặc vuông ở trên tương đương với mã xuất hiện sau_ 37Các nhà phát triển PHP thích sử dụng ký hiệu dấu ngoặc vuông, được giới thiệu trong PHP 5. 4, vì nó yêu cầu gõ ít hơn và làm cho dấu ngoặc tròn dễ thấy hơn trong các cấu trúc điều khiển như câu lệnh 452 và vòng lặp 614Ba giá trị được tạo trong mảng 228 bởi đoạn mã này. 229, 693 và 231. Khoảng trống thứ nhất và thứ ba trong mảng này được điền bằng các chuỗi, trong khi khoảng trống thứ hai được điền bằng số, giống như một biến thông thườngThông thường, mảng sử dụng các số làm chỉ số để trỏ đến các giá trị mà chúng chứa, bắt đầu bằng số 0, vì vậy khi bạn muốn truy cập một giá trị được lưu trữ trong một mảng, bạn cần biết chỉ số của nó. Chỉ số của phần tử thứ n của mảng là n-1 vì giá trị (hoặc phần tử) đầu tiên của mảng có chỉ số 0, phần tử thứ hai có chỉ số 1, phần tử thứ ba có chỉ số 2, v.v. Bạn có thể truy xuất một giá trị bằng cách đặt chỉ số của giá trị mà bạn quan tâm vào giữa các dấu ngoặc vuông sau tên của biến mảng _ 38Bạn có thể thêm các phần tử mới vào một mảng bằng cách sử dụng một khóa được đặt trong dấu ngoặc vuông hoặc bạn có thể gán giá trị mới cho các phần tử mảng hiện có _ 39Sử dụng toán tử gán như bình thường, bạn cũng có thể thêm các phần tử vào cuối mảng trong khi để trống dấu ngoặc vuông sau tên biến 60Tuy nhiên, mảng có thể được sử dụng để giải quyết các vấn đề mà các biến thông thường không làm được, và trong nhiều trường hợp, quyết định sử dụng một mảng hay nhiều biến sẽ phụ thuộc vào sở thích của người lập trình. Nhớ trò chơi súc sắc từ phần trước? . " Điều này có thể được thực hiện với một loạt các câu lệnh 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 61Thay vào đó, bạn có thể sử dụng một mảng để lưu trữ từng giá trị cuộn, cách này hiệu quả hơn và tránh phải viết câu lệnh 452 cho mỗi lần tung xúc xắc tiềm năng 62Khi xây dựng một mảng, bạn có thể chỉ định cả khóa và giá trị bằng cách sử dụng ký hiệu 234 (còn được gọi là toán tử mũi tên kép) 63Mặc dù thực tế là chúng giống hệt nhau, mã bắt buộc của ký hiệu tốc ký gõ nhanh hơn nhiều và thậm chí có thể dễ đọc hơn Mảng đã được tạo và giờ có thể đọc được từng từ tiếng Anh từ mảng đó 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ư 440 có thể được thay thế bằng một biến chứa giá trị đó. Ví dụ 65Bằng cách đọc giá trị thích hợp từ mảng bằng cách sử dụng biến 466, chúng ta có thể đặt mọi thứ lại với nhau và sửa đổi trò chơi xúc xắc để nó hiển thị từ tiếng Anh của trò tung xúc xắcThí dụ. PHP-DiceRoll-English-Array _ 66Như bạn có thể thấy, điều này gọn gàng và có tổ chức hơn nhiều so với một danh sách dài các câu lệnh 452Trước hết, việc thêm vào mảng thay vì thêm một câu lệnh 452 bổ sung cho mỗi số sẽ đơn giản hơn rất nhiều nếu bạn muốn biểu diễn một con súc sắc mười mặtThứ hai, bạn có thể sử dụng lại mảng thay vì phải lặp lại tất cả các câu lệnh 452 cho mỗi lần gieo xúc xắc trong phiên bản có hai viên xúc xắcThí dụ. PHP-DiceRoll-English-If-TwoDice _ 67Thay vào đó, cả hai cuộn có thể được thực hiện bằng cách sử dụng mảng Thí dụ. PHP-DiceRoll-English-Array-TwoDice _ 68Mặc dù số là lựa chọn phổ biến nhất cho chỉ số mảng, nhưng bạn cũng có thể sử dụng chuỗi để tạo mảng được gọi là mảng kết hợp. Trong ví dụ này, chúng tôi liên kết một ngày (ở dạng chuỗi) với từng tên trong số ba tên; . nó liên kết các giá trị với các chỉ số có ý nghĩa _ 69Bạn có thể sử dụng ký hiệu tốc ký cho các mảng kết hợp giống như bạn có thể sử dụng cho các chỉ mục số 60Bây giờ, chúng tôi tra cứu nó bằng cách sử dụng tên làm chỉ mục nếu chúng tôi muốn biết ngày sinh của Kevin 61Như chúng ta sẽ thấy trong giây lát, loại mảng này rất quan trọng khi nói đến tương tác của người dùng trong PHP. Tôi cũng sẽ chỉ cho bạn cách sử dụng mảng theo những cách khác trong suốt cuốn sách này Dấu nháy đơn (trích dẫn đơn) trong 241 phải được thoát bằng một 427 để PHP coi nó như một phần của chuỗi chứ không phải là phần cuối của chuỗi vì nếu không thì PHP sẽ hiểu đây là phần cuối của chuỗiTương tác người dùng và biểu mẫuCá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ếtChuỗ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 62Thông tin đang được gửi cùng với yêu cầu cho 244, được biểu thị bằng dấu chấm hỏi trong URLTạo một tệp HTML thông thường có tên là 245 (không cần phần mở rộng tên tệp 3 vì sẽ không có mã PHP trong tệp này) và thêm liên kết sau 63Biến được chuyển dưới dạng một phần của chuỗi truy vấn, là phần của URL xuất hiện sau dấu chấm hỏi và nó liên kết tới một tệp có tên là 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 247 và cho mã PHP trong tệp đó biết rằng biến, có tên 248 và giá trị 249, bằng với giá trị đóTạo một tệp mới, 247, với phần mở rộng tên tệp 3 và kiểm tra nó để hiểu đầy đủ tác động của liên kết này. Trong nội dung của trang web mới này, hãy nhập nội dung sau để thông báo cho máy chủ web rằng nó sẽ dự đoán việc diễn giải một số mã PHP trong tệpThí dụ. PHP-NHẬN _ 64Bây giờ, hãy lưu hai tệp sau ( 245 và 247) vào thư mục 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à 258). Để yêu cầu tập lệnh PHP, hãy nhấp vào liên kết trên trang đầu tiên đó. Trang tiếp theo sẽ là "Chào mừng đến với trang web của chúng tôi, Tom. "như mô tả trong hình dưới đâyĐây là dòng quan trọng nhất trong mã kích hoạt tính năng này, vì vậy hãy xem xét nó chi tiết hơn _ 65Bạn có thể xác định chức năng của dòng này bằng cách sử dụng thông tin từ phần "Mảng" ở trên. Nó gán giá trị có trong phần tử 259 của mảng có tên là 260 cho một biến mới có tên là 261. Tuy nhiên, mảng 260 bắt nguồn từ đâu?PHP tạo 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 247 của bạn gán giá trị này cho một biến PHP thông thường ( 261), sau đó sử dụng câu lệnh 405 để hiển thị nó dưới dạng một phần của chuỗi văn bản. Bởi vì 260 là một mảng kết hợp, giá trị của biến 248 được truyền trong chuỗi truy vấn có thể được truy cập dưới dạng 267 66Sử dụng toán tử nối chuỗi ( 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 261 được thêm vào chuỗi đầu raNhưng hãy cẩn thận, mã này có lỗ hổng bảo mật. Mặc dù PHP là một ngôn ngữ lập trình đơn giản để học, nhưng hóa ra nếu bạn không biết nên thực hiện các biện pháp bảo mật nào, thì việc đưa các vấn đề bảo mật vào các trang web sử dụng PHP lại đặc biệt đơn giản. Trước khi chúng ta tiếp tục với ngôn ngữ này, tôi muốn đảm bảo rằng bạn có thể phát hiện và khắc phục vấn đề bảo mật cụ thể này vì đây có thể là vấn đề phổ biến nhất trên Web hiện nay Mặc dù biến 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 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 248. Vấn đề bảo mật ở đây phát sinh từ thực tế là tập lệnh 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 261Khi bạn nhìn thấy trang kết quả (với thông báo chào mừng có tên "Tom"), hãy xem URL trên thanh địa chỉ của trình duyệt để xem trang này sẽ hoạt động như thế nào. Nó phải giống như thế này _ 67Chỉnh sửa URL để thêm các thẻ _12280 trước tên và 279 sau tên 68Khi URL mới này đã được tải, hãy lưu ý rằng tên của trang hiện được in đậm như trong hình ảnh sau Lưu ý rằng mặc dù một số trình duyệt có thể tự động chuyển đổi các ký tự 491 và 490 thành các chuỗi thoát URL (lần lượt là ______0283 và 284), PHP vẫn sẽ được cung cấp cùng một giá trị trong cả hai trường hợpNếu mã vô hại như thẻ 279 thì sẽ không có vấn đề gì, nhưng người dùng ác ý có thể bao gồm mã JavaScript tinh vi để thực hiện một số nhiệm vụ tầm thường như đánh cắp mật khẩu của người dùng. Kẻ tấn công thậm chí có thể nhúng liên kết vào email và gửi cho người dùng của bạn; . Mã của kẻ tấn công sẽ được thêm vào trang của bạn và bẫy sẽ được đặt nếu một trong những người dùng của bạn nhấp vào liên kếtVì bạn chỉ mới học PHP, tôi xin lỗi đã làm bạn sợ khi nói về tin tặc độc hại tấn công người dùng của bạn bằng cách sử dụng mã PHP của riêng bạn để chống lại bạn, nhưng sự thật là lỗ hổng lớn nhất của ngôn ngữ PHP là nó quá đơn giản để sử dụng. . Bạn càng sớm tiếp xúc với những vấn đề này, bạn càng sớm quen với việc tránh chúng và chúng sẽ càng ít trở ngại cho bạn trong tương lai, mặc dù một số người có thể tranh luận rằng bạn dành nhiều năng lượng để học viết PHP. Vậy làm cách nào để chúng tôi tạo một trang có tên người dùng trên đó mà không để nó bị tấn công? Mở lại tệp 247 của bạn và sửa đổi mã PHP trong đó để giống với mã được hiển thị bên dướiThí dụ. PHP-GET-Sát trùng 69Hãy để tôi chia nhỏ mã này cho bạn vì có rất nhiều thứ đang diễn ra ở đó. Dòng đầu tiên giống như trước đó, gán giá trị của phần tử 259 từ mảng 260 cho 261. Tuy nhiên, câu lệnh 405 xuất hiện sau nó thì khác vì thay vì chỉ kết xuất biến 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 294 để thực hiện một chuyển đổi quan trọng 294 chuyển đổi "các ký tự HTML đặc biệt" như 491 và 490 thành các thực thể ký tự HTML như 300 và 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 247, mã HTML trong biến 261 được đổ trực tiếp vào mã của trang được tạo và do đó có thể làm bất cứ điều gì mà mã HTML có thể làm. Tôi sẽ chỉ cho bạn cách làm điều này ngay sau đâyLệnh gọi hàm 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ó 20Văn bản được chuyển đổi là đối số đầu tiên, cùng với "hằng" PHP0304 hướng dẫn 294 chuyển đổi dấu ngoặc đơn và dấu ngoặc kép cũng như các ký tự đặc biệt khácLưu ý rằng hằng số PHP giống như một biến có giá trị không thể thay đổi. PHP bao gồm một số hằng số dựng sẵn, chẳng hạn như 304 được sử dụng để kiểm soát các hàm dựng sẵn, chẳng hạn như 294, nhưng các hằng số không bắt đầu bằng ký hiệu đô laChuỗi 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 21Phần tử này thông báo cho trình duyệt rằng mã HTML của trang này được mã hóa bằng văn bản UTF-8 Nếu bạn tò mò muốn tìm hiểu thêm về mã hóa ký tự, hãy xem "Hướng dẫn cơ bản về mã hóa ký tự web. " UTF-8 là một trong nhiều tiêu chuẩn để biểu thị văn bản dưới dạng một chuỗi các số 1 và 0 trong bộ nhớ máy tính Bằng cách mã hóa các trang của bạn dưới dạng UTF-8, người dùng của bạn có thể gửi văn bản chứa hàng nghìn ký tự nước ngoài mà trang web của bạn không thể xử lý nếu không (chúng ta sẽ chuyển sang phần "Chuyển biến trong biểu mẫu" trong một vài trang) Vì nhiều hàm dựng sẵn của PHP, chẳng hạn như 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ư 310 cho một trích dẫn cong bên phải), mã này sẽ luôn hoạt độngThông báo "Chào mừng đến với trang web của chúng tôi, Tom" sẽ xuất hiện một lần nữa khi bạn mở 245 trong trình duyệt của mình và nhấp vào liên kết hiện dẫn đến 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ẻ 279 và 280 của tên 68Lần này, khi bạn nhấn enter, văn bản bạn thực sự đã nhập sẽ xuất hiện thay vì tên được in đậm trên trang, như thể hiện trong hình dưới đây Điều này ngăn người dùng độc hại đưa mã không mong muốn vào trang web của bạn; . Nếu họ làm điều đó, mã sẽ được hiển thị vô hại trên trang dưới dạng văn bản thuần túy Không cần quá lo lắng nếu bạn đang gặp khó khăn trong việc hiểu chi tiết về cách sử dụng hàm 294 ngay bây giờ; . Hiện tại, chúng ta hãy xem xét một số phương thức phức tạp hơn để truyền giá trị cho các tập lệnh PHP khi chúng ta yêu cầu chúng. Chẳng bao lâu, bạn sẽ thấy việc sử dụng nó trở thành bản chất thứ haiThật tuyệt khi chỉ chuyển một biến trong chuỗi truy vấn, nhưng hóa ra bạn có thể chuyển nhiều giá trị nếu muốn. Chúng ta hãy xem một phiên bản phức tạp hơn một chút của ví dụ trước. Mở lại tài liệu 245 của bạn và cập nhật liên kết để trỏ tới 247 bằng cách sử dụng chuỗi truy vấn phức tạp hơn này 23Liên kết của chúng tôi vượt qua hai biến lần này. 323 và 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à ( 325, nên được viết là 326 trong HTML; tuy nhiên, nếu bạn sử dụng sai 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 328 khỏi cặp tiếp theo bằng dấu và, bạn có thể chuyển nhiều biến hơn nữaHai giá trị biến trong tệp 247 của chúng tôi có thể được sử dụng như trước đâyThí dụ. PHP-GET-TwoVars 24Sử dụng một loạt các nối chuỗi ( 272), câu lệnh 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 332 (an toàn để hiển thị bằng cách sử dụng 294), một khoảng trắng, giá trị của 334 (một lần nữa, được xử lý bằng 294) Kết quả là hình bên dưới Chúng tôi muốn tiếp tục với ví dụ về thông báo chào mừng được cá nhân hóa, trong đó chúng tôi muốn mời người dùng nhập tên của họ và tên đó sẽ xuất hiện trên trang kết quả, nhưng chúng tôi vẫn chưa đạt được điều đó về mặt người dùng thực sự . Chúng tôi sẽ cần sử dụng biểu mẫu HTML để cho phép người dùng nhập giá trị Truyền biến trong biểu mẫuĐể tạo biểu mẫu, hãy xóa mã liên kết khỏi 245 và thay thế bằng mã HTML nàyThí dụ. PHP-GET-Biểu mẫu 25Biểu mẫu được tạo bởi mã này được hiển thị trong trình duyệt như trong hình bên dưới Ghi chú. Để làm cho biểu mẫu đẹp hơn một chút, tôi đã thêm một số CSS (tìm thấy trong 337 trong mã mẫu). Tôi sẽ bao gồm tệp CSS này trên bất kỳ trang nào có biểu mẫu vì nó rất chung chung và có thể được sử dụng để hiển thị bất kỳ biểu mẫu nào ở định dạng ngắt dòng đầu vào nhãnTuy nhiên, vì đây là sách về PHP và MySQL nên tôi sẽ không đi chi tiết về cách hoạt động của CSS. Để được hướng dẫn về cách tạo kiểu cho biểu mẫu của bạn bằng CSS, hãy xem HTML5 & CSS3 của SitePoint cho Thế giới thực Khi bạn nhấp vào nút gửi (có nhãn GO), trình duyệt sẽ tải 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 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 340Giá trị của 342 (như được sử dụng trong 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 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ố 345 trong biểu mẫu để cho phép người dùng nhập một lượng lớn văn bản? . Tùy chọn khác là để trình duyệt truyền dữ liệu một cách bí mật và đằng sau hậu trườngChỉnh sửa lại tệp 245 của bạn và thay đổi phương thức biểu mẫu thành 347 26Với giá trị thuộc tính phương thức mới này, trình duyệt được yêu cầu gửi các biến biểu mẫu như một phần của yêu cầu trang một cách vô hình thay vì mã hóa chúng trong chuỗi truy vấn URL Các biến không còn xuất hiện trong mảng 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 247 để truy xuất các giá trị từ mảng mới này, đó là 349Thí dụ. PHP-POST-Biểu mẫu 27Trang kết quả sau khi biểu mẫu mới này được gửi được mô tả trong hình bên dưới Sự khác biệt duy nhất giữa biểu mẫu này và biểu mẫu trước đó là khi người dùng nhấp vào nút GO, URL của trang tải sẽ không chứa chuỗi truy vấn. Tuy nhiên, nếu người dùng đánh dấu trang xuất phát từ việc gửi biểu mẫu, thì dấu trang đó sẽ vô dụng vì nó thiếu các giá trị đã gửi. Một mặt, điều này cho phép bạn bao gồm các giá trị lớn (hoặc giá trị nhạy cảm chẳng hạn như mật khẩu và số thẻ tín dụng) trong dữ liệu được gửi bởi biểu mẫu mà chúng không xuất hiện trong chuỗi truy vấn. Nếu bạn đánh dấu một trang kết quả tìm kiếm của Google, bạn có thể sử dụng dấu trang đó để chạy lại tìm kiếm đó sau này vì các cụm từ tìm kiếm được chứa trong URL. Tình cờ, đây là lý do chính tại sao các công cụ tìm kiếm sử dụng chuỗi truy vấn để gửi cụm từ tìm kiếm Ghi chú. Nói chung, bạn chỉ nên sử dụng biểu mẫu 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 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 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 mayBâ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 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 PHPChè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 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" 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à 359 trong thư mục 8 của bạn, sau đó mở nó để chỉnh sửa và nhập mã sau 28Vâng, đó là toàn bộ mã cho tệp này; . Bây giờ bạn đã quen thuộc với vòng lặp 613, nhưng cho phép tôi nêu bật các yếu tố đáng chú ý của mã này
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ã 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 382 thay vì 381. Điều này cũng đúng với một lớp lót nổi tiếng khác, 405Bạn nên tạo tệp 370 tiếp theo vì nó xuất hiện trong dòng cuối cùng của tệp 359 của chúng tôiThí dụ. PHP-Đếm-Mẫu 29Ngoại trừ một dòng duy nhất hiển thị giá trị của biến 363—cùng một biến 363 được tạo bởi tệp 359—tệp này gần như hoàn toàn là HTML đơn giảnNhững gì chúng tôi tạo ra ở đây là một mẫu PHP, một trang HTML tĩnh chỉ chứa một lượng rất nhỏ mã PHP để chèn các giá trị động. Chúng tôi đã đặt mã để tạo các giá trị trong một tập lệnh PHP riêng biệt, được gọi là 359 trong trường hợp này, thay vì nhúng mã PHP phức tạp tạo ra các giá trị đó trong trangCác mẫu PHP như vậy cho phép bạn tập trung vào mã PHP của mình mà không bị phân tâm bởi mã HTML xung quanh, cho phép bạn giao các mẫu của mình cho các nhà thiết kế ngoại vi mà không phải lo lắng về những gì họ có thể làm với mã PHP của bạn Mặc dù tôi muốn đặt tên cho các tệp mẫu PHP của mình bằng hậu tố 390, nhưng máy chủ web của bạn vẫn nhận ra chúng là tệp 3;Nhập 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 359 được hiển thị trong mẫu 370 của chúng tôiMối quan tâm về an ninhMộ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ã 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 370. Bạn sẽ thấy thông báo lỗi nếu bạn nhập 398 vào trình duyệt web của mình thay vì đếm từ một đến mườiTốt hơn là không cho phép người dùng chạy mã theo cách mà bạn không mong đợi bởi vì, tùy thuộc vào những gì trang đang làm, điều này có thể cho phép người dùng vượt qua các biện pháp bảo mật mà bạn đã đặt và truy cập nội dung mà họ không nên. Ví dụ, hãy xem xét đoạn mã sau 60Mã này làm cho có vẻ như bạn phải gửi biểu mẫu và nhập mật khẩu 600 để xem nội dung được bảo vệ trong 601. Tuy nhiên, nếu ai đó có thể truy cập trực tiếp vào 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 8Bạn có thể thắc mắc tại sao, sau khi ghi tất cả các tệp của chúng ta vào thư mục 8, môi trường phát triển đã tạo một thư mục 8 bên trong thư mục 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 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 605, chứa thư mục 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 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? 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 62Bởi vì chúng tôi đang sử dụng Docker, nên việc triển khai trang web cũng sẽ sử dụng cùng một môi trường Docker, vì vậy đây không thực sự là vấn đề trong những ngày này. Mặc dù phương pháp này sẽ hoạt động, nhưng nó không được mong muốn vì nó liên kết mã trang web của bạn với cấu hình máy chủ web của bạn. Nếu mã của bạn đề cập đến các ổ đĩa và thư mục dành riêng cho một máy chủ cụ thể, thì việc thả trang web dựa trên PHP của bạn vào bất kỳ máy chủ web hỗ trợ PHP nào và xem nó chạy là không thực tế. Nếu bạn cần di chuyển trang web của mình sang một ổ đĩa hoặc thư mục khác trên máy chủ đó, bạn sẽ tự làm khổ mình ngay cả khi bạn có cơ hội làm việc trên một máy chủ duy nhất Vị trí của tệp so với tệp hiện tại được gọi là đường dẫn tương đối và khi bạn sử dụng 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 _ 370Sử dụng đoạn mã sau để bao gồm một tệp từ thư mục trên 63 370 sẽ được tìm thấy trong thư mục 605 thay vì thư mục 8 vì bit 613 hướng dẫn PHP tìm tệp trong thư mục phía trên thư mục của tập lệnh hiện tạiThay đổi 359 để chỉ vị trí mới sau khi di chuyển 370 lên một cấp vào thư mục 605Thí dụ. PHP-Count-Template-Secured 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ở 620 và thêm dòng 621, bạn sẽ mong đợi 622 được đưa vào từ thư mục 605. Do đó, khi 621 được chạy từ 370, thì 622 sẽ thực sự cố tải từ thư mục 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 629, được đặt ở đầu tập lệnh và áp dụng cho tất cả các câu lệnh 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 63Nó sẽ hoạt động, nhưng nếu thư mục bị sửa đổi hoặc 359 là một tệp bao gồm, thì nó có thể không tạo ra kết quả mong muốnMay mắn thay, PHP cung cấp một hằng số có tên là 631 (đó là hai dấu gạch dưới trước và sau từ 632) sẽ luôn chứa đường dẫn chứa tệp hiện tại để vượt qua điều nàyChẳng hạn, bạn có thể sử dụng đoạn mã sau để tạo một tệp có tên 633 bên trong thư mục 8_ 66Để đọc 370 từ thư mục trên 8, có thể kết hợp toán tử 639 và hằng số 631. Điều này sẽ hiển thị 635, là đường dẫn đầy đủ đến thư mục chứa 633_ 67Do đó, giờ đây PHP sẽ tìm trong thư mục 8, chuyển lên một cấp thành 605 và bao gồm 370Tôi sẽ sử dụng phương pháp này để bao gồm các tệp trong suốt cuốn sách này vì 631 sẽ thay đổi tùy thuộc vào nơi tệp được lưu trữ và nó không phụ thuộc vào việc thay đổi thư mục làm việc hiện tạiThư mục 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 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 356 vì chúng sẽ được lưu trữ bên ngoài thư mục 8Thật hợp lý khi lưu trữ các loại tệp bao gồm khác nhau trong các thư mục khác nhau để sắp xếp mọi thứ và tôi sẽ giới thiệu cho bạn một số loại tệp bao gồm khác nhau khi cuốn sách tiếp tục. Sau đó, chúng tôi có thể tham chiếu chúng trong một câu lệnh 356 bằng cách sử dụng 654. Chúng tôi sẽ lưu trữ các tệp mẫu (có phần mở rộng 390) bên trong một thư mục có tên là 651 bên trong thư mục 605Nhiều mẫu, một bộ điều khiểnBạn có thể có nhiều câu lệnh 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 356 để tải các tệp mẫu PHP của bạnThường được gọi là "bộ điều khiển", một tập lệnh PHP đáp ứng yêu cầu của trình duyệt bằng cách chọn một trong số các mẫu PHP để điền vào và gửi lại chứa logic xác định mẫu nào được gửi tới trình duyệt Quay trở lại biểu mẫu chào mừng yêu cầu họ và tên của khách truy cập từ phần trước của chương này, Chúng tôi sẽ bắt đầu bằng cách tạo mẫu PHP cho biểu mẫu, chúng tôi có thể thực hiện điều này bằng cách sử dụng lại tệp 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 245 có tên là 661 và lưu nó vào thư mục 651 bên trong 605Thí dụ. PHP-Form-Controller _ 68Như bạn có thể thấy, chúng tôi đang để trống thuộc tính hành động, hướng dẫn trình duyệt gửi biểu mẫu đã hoàn thành trở lại URL ban đầu, trong trường hợp này là URL của bộ điều khiển chứa tệp mẫu Tạo một tệp 662 trong thư mục 8 với đoạn mã sau để dùng làm bộ điều khiển của ví dụ_ 69Thoạt nhìn, mã này trông khá quen thuộc vì nó gần giống với tập lệnh 247 mà chúng ta đã tạo trước đó. Hãy để tôi mô tả các biến thể
Viết tệp 686 vào thư mục 651 là bước cuối cùng 0Bây giờ hãy mở trình duyệt của bạn và điều hướng đến 689. URL sẽ không đổi trong suốt quá trình này và bạn sẽ được hỏi tên của mình và sau khi gửi biểu mẫu, bạn sẽ thấy thông báo chào mừng phù hợpNhư bạn có thể nhận thấy, tôi đã yêu cầu bạn đặt tên tệp là 662 thay vì 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 662 và hiển thị tệp đó; . Trong trình duyệt của bạn, hãy thử chỉ nhập 695 để xem trang chỉ mụcLưu ý rằng các cấu hình khác nhau của máy chủ web có thể chỉ định một tệp khác làm chỉ mục thư mục. Nhưng 662 sẽ hoạt động trên phần lớn các máy chủ web mà không cần bất kỳ cấu hình bổ sung nàoMột lợi thế của việc sử dụng cùng một URL cho toàn bộ quá trình hỏi tên người dùng và hiển thị thông báo chào mừng là người dùng có thể đánh dấu trang bất kỳ lúc nào và nhận được kết quả hợp lý. Cho dù đó là trang có biểu mẫu hay trang có thông báo chào mừng mà người dùng đánh dấu, khi họ quay lại, biểu mẫu sẽ ở đó một lần nữa. Quay lại URL riêng của thông báo chào mừng trong lần lặp trước của ví dụ này mà không gửi biểu mẫu sẽ dẫn đến thông báo chào mừng bị hỏng ("Chào mừng đến với trang web của chúng tôi" hoặc ". ") hoặc thông báo lỗi PHP nếu máy chủ, giống như máy chủ của chúng tôi, đang chạy với tính năng báo cáo lỗi được bật Xin lưu ý rằng tôi sẽ trình bày cách ghi nhớ tên người dùng giữa các lượt truy cập trong Chương 11, nơi chúng ta thảo luận về "các phiên. " Đưa vào cơ sở dữ liệuChú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àytom 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
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. 1 và 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 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 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 5 hoặc bất kỳ phần mở rộng nào khác ngoài 3, máy chủ web sẽ không chạy bất kỳ mã PHP nào và mã PHP sẽ được gửi trực tiếp đến trình duyệt — trình duyệt này không hiểu mã PHPChúng ta hãy xem một tập lệnh PHP Thí dụ. PHP-RandomNumber 54Để chạy mã này, hãy lưu nó dưới dạng 7 trong thư mục 8 và điều hướng đến 9Hầu hết đây là HTML đơn giản. Chỉ có dòng giữa 1 và 2 là mã PHP. 1 đánh dấu sự bắt đầu của tập lệnh PHP được nhúng và 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 62Không có tệp HTML nào trên máy chủ chứa mã chính xác này. HTML này được tạo động trên máy chủ trước khi được gửi tới trình duyệt Hãy thử chạy tập lệnh một vài lần và để ý xem số thay đổi như thế nào. Mã PHP đã được sử dụng để tạo một số ngẫu nhiên, nhưng tất cả các dấu hiệu của mã PHP đã biến mất khi xem mã nguồn trong trình duyệt. Thay vào đó, đầu ra của tập lệnh đã xuất hiện và nó trông giống như HTML tiêu chuẩn. Ví dụ này cho thấy một số ưu điểm của kịch bản phía máy chủ
Cú pháp và câu lệnh cơ bảnCú 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 ( 6204)Đây là một câu lệnh PHP điển hình 64Đây là câu lệnh 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 6205 chỉ cần lấy văn bản được cung cấp và chèn nó vào mã HTML của trang tại vị trí đặt tập lệnh PHPTrong trường hợp này, chúng tôi đã cung cấp một chuỗi văn bản được xuất ra. 6207. Lưu ý rằng chuỗi văn bản chứa các thẻ HTML ( 6208and 6209), điều này hoàn toàn có thể chấp nhận đượcVì vậy, nếu chúng tôi lấy câu lệnh này và đặt nó vào một trang web hoàn chỉnh, thì đây là mã kết quả Thí dụ. PHP-Echo 70Nếu bạn đặt tệp này trên máy chủ web của mình và sau đó yêu cầu nó bằng trình duyệt web, trình duyệt của bạn sẽ nhận được mã HTML này 71Ví dụ về 7 mà chúng ta đã xem xét trước đó chứa một câu lệnh 6205 phức tạp hơn một chút 74Bạn sẽ nhận thấy rằng, trong ví dụ đầu tiên, PHP được cung cấp một số văn bản để in trực tiếp và trong ví dụ thứ hai, PHP được cung cấp hướng dẫn để làm theo. PHP cố gắng đọc bất kỳ thứ gì tồn tại bên ngoài dấu ngoặc kép như một hướng dẫn mà nó phải tuân theo. Bất cứ điều gì bên trong dấu ngoặc kép được coi là văn bản - hoặc, để sử dụng thuật ngữ kỹ thuật, như một chuỗi. PHP không xử lý các chuỗi dưới dạng các lệnh để tuân theo. Chúng được coi là dữ liệu trong ứng dụng. Bạn có thể làm mọi thứ với chúng, chẳng hạn như gửi chúng tới trình duyệt, nhưng PHP không xử lý chuỗi này khác với chuỗi khác Vì vậy, đoạn mã sau sẽ chuyển chuỗi 6207 trực tiếp tới lệnh 6205 64Một chuỗi được biểu thị bằng dấu ngoặc kép bắt đầu và dấu ngoặc kép kết thúc. PHP sẽ xem 6214 đầu tiên là phần đầu của chuỗi và tìm 6214 tiếp theo và sử dụng nó làm phần cuối của chuỗiBất cứ điều gì bên ngoài dấu ngoặc kép được coi là một loạt các lệnh để chạy. Sau đây không phải là mã hợp lệ 80Vì các trích dẫn đã bị xóa, trước tiên PHP sẽ thử chạy lệnh 6216, sau đó là lệnh 6217, tiếp theo là lệnh 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 6219 — để tạo một số ngẫu nhiên rồi chuyển kết quả cho lệnh echo 74Hàm là một loại lệnh đặc biệt thực hiện một nhiệm vụ cụ thể. Đằng sau hậu trường, PHP sẽ thực hiện một số xử lý và sau đó tạo ra kết quả. Trong trường hợp này, hàm 6219 sẽ tạo ra một số ngẫu nhiên, nhưng các hàm khác nhau thực hiện các tác vụ khác nhauBạn có thể nhanh chóng xác định xem thứ gì đó có phải là hàm hay không vì nó được theo sau bởi dấu ngoặc đơn. PHP có nhiều chức năng tích hợp sẵn cho phép bạn thực hiện mọi thứ, chẳng hạn như gửi email và làm việc với thông tin được lưu trữ trong nhiều loại cơ sở dữ liệu khác nhau PHP sẽ không cố chạy bất cứ thứ gì bên trong một chuỗi. Đoạn mã sau sẽ không xử lý hàm 6219
PHP sẽ xem 6222 dưới dạng một chuỗi và sẽ gửi văn bản 6223 tới trình duyệt, đây có thể không phải là điều bạn muốn làm. Điều quan trọng là phải hiểu sự khác biệt giữa chuỗi và mã. PHP sẽ xem bất kỳ văn bản nào bên ngoài dấu ngoặc kép dưới dạng một loạt lệnh mà nó phải tuân theo. Mọi thứ bên trong dấu ngoặc kép là một chuỗi và là dữ liệu mà PHP sẽ làm việc vớiPHP không cố hiểu các chuỗi. Chúng có thể chứa bất kỳ ký tự nào theo bất kỳ thứ tự nào. Nhưng mã (bất cứ thứ gì không nằm trong dấu ngoặc kép) - về cơ bản là một loạt hướng dẫn - phải tuân theo một cấu trúc cứng nhắc để máy tính hiểu được mã đó Ghi chú. sử dụng trình chỉnh sửa mã có tô sáng cú pháp giúp bạn dễ dàng nhanh chóng xem liệu thứ gì đó là chuỗi hay mã. Các chuỗi sẽ có màu khác với mã cần được xử lý Hình ảnh bên dưới hiển thị đánh dấu mã đơn giản trong trình chỉnh sửa Visual Studio Code PHP hỗ trợ cả dấu ngoặc đơn ( 6214) và dấu ngoặc kép ( 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ụ 620Nếu dấu ngoặc kép được sử dụng ở mỗi đầu ở đây, chúng ta cần thông báo cho PHP rằng câu trích dẫn sau 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 621Vì lý do này, các nhà phát triển PHP sử dụng dấu ngoặc đơn, mặc dù có một số khác biệt giữa dấu ngoặc đơn và dấu ngoặc kép. Tuy nhiên, đối với mục đích của chúng tôi ở đây, chúng có thể hoán đổi cho nhau một cách hiệu quả Một chức năng có thể được coi là một chương trình thu nhỏ trong chương trình của bạn. Bạn có thể hướng dẫn PHP chạy chức năng bằng cách sử dụng tên của nó (chẳng hạn như 6219 trong ví dụ của chúng tôi trước đó) theo sau là dấu ngoặc đơn. Hướng dẫn 6223 yêu cầu PHP chạy hàm có tên 6219. Chạy một chức năng cũng thường được gọi là gọi một chức năngHầu hết các hàm trong PHP đều trả về một giá trị khi chúng được gọi. Sau khi giá trị được trả về, PHP sẽ hoạt động như thể bạn thực sự vừa nhập giá trị được trả về đó vào mã của mình. In the 6231 example, our 6205 statement contains a call to the 6219 function, which returns a random number as a string of text. Câu lệnh 6205 sau đó xuất giá trị được trả về bởi lệnh gọi hàmMọi hàm trong PHP có thể có một hoặc nhiều đối số cho phép bạn làm cho hàm hoạt động theo một cách hơi khác. Hàm 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 622Chúng tôi bao quanh các lập luận bằng dấu ngoặc đơn ( 6236) vì hai lý do. Đầu tiên, họ chỉ ra rằng 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 6219, bạn cần cung cấp giá trị tối thiểu và tối đa. Các giá trị đó được phân tách bằng dấu phẩySau này, chúng ta sẽ xem xét các hàm nhận các loại đối số khác nhau. Chúng tôi cũng sẽ xem xét các hàm không có đối số nào cả. Các hàm này sẽ vẫn cần dấu ngoặc đơn, mặc dù sẽ không có gì được nhập giữa chúng Biến, toán tử và nhận xétBiếnBiế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à 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à 6240 623PHP là một ngôn ngữ gõ lỏng lẻo. Điều này có nghĩa là một biến có thể chứa bất kỳ loại dữ liệu nào — có thể là số, chuỗi văn bản hoặc một số loại giá trị khác — và có thể lưu trữ các loại giá trị khác nhau trong suốt thời gian tồn tại của nó. Nếu bạn nhập câu lệnh sau sau câu lệnh được hiển thị ở trên, nó sẽ gán một giá trị mới cho 6239 hiện có. Mặc dù biến 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 624Khi bạn đã lưu trữ dữ liệu trong một biến, bạn có thể gửi dữ liệu đó đến trình duyệt bằng cách sử dụng lệnh 6205 từ trước đó 625Khi mã này chạy, chữ số “3” sẽ được gửi tới trình duyệt để hiển thị trên trang Ngoài các chuỗi hoặc số cụ thể, có thể lưu trữ kết quả của một hàm và sau đó sử dụng nó sau này trong tập lệnh 626nhà điều hànhDấ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ị 627Từ những ví dụ này, bạn có thể biết rằng 6244 là toán tử cộng, 6245 là toán tử trừ, 6246 là toán tử nhân và 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 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 6249 và kết thúc bằng 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 628Các biến có thể được sử dụng ở hầu hết mọi nơi bạn sử dụng một giá trị. Hãy xem xét loạt tuyên bố này 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. 6251)Cấu trúc điều khiểnCá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 ifCấ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 6252. Luồng của một chương trình thông qua câu lệnh 6252 có thể được hình dung như hình bên dướiĐây là một câu lệnh 6252 trông như thế nào trong mã PHP 640Cấu trúc điều khiển này cho phép chúng ta yêu cầu PHP thực thi một tập hợp các câu lệnh chỉ khi một số điều kiện được đáp ứng Ví dụ: chúng tôi có thể muốn tạo một trò chơi bắt chước trò tung xúc xắc và trong đó bạn phải gieo sáu để giành chiến thắng. Cuộn xúc xắc có thể được lập mô hình bằng hàm 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 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 6252Thí dụ. PHP-DiceRoll 642 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 6258 duy nhất, được sử dụng để gán và không thể được sử dụng để so sánhCâu lệnh 6252 sử dụng dấu ngoặc nhọn ( 6260 và 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 643Ghi chú. nhớ gõ dấu bằng kép ( 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 644Điều kiện này đang sử dụng toán tử gán ( 6258) thay vì toán tử bằng ( 6257). Do đó, thay vì so sánh giá trị của 6266 với số 6267, nó thực sự sẽ đặt giá trị của 6266 thành 6267. ỐiTệ hơn nữa, câu lệnh 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 6252 sẽ luôn được thực thi, bất kể giá trị ban đầu của 6266 là bao nhiêuNếu bạn lưu mã này dưới dạng 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 645cái này không đẹp lắm. Nhưng vì PHP xuất ra HTML, bạn có thể thêm một số thẻ đoạn văn để định dạng đầu ra Thí dụ. Định dạng PHP-DiceRoll 646Nếu bạn chạy mã được cập nhật, bạn sẽ thấy rằng nó hiện in mã này trong trình duyệt 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 6274. Câu lệnh 6274 phải tuân theo một 6252 và sẽ được chạy nếu điều kiện không được đáp ứngThí dụ. PHP-DiceRoll-Khác 648Ghi chú. bởi vì từ 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 ( 6227), nó yêu cầu PHP không coi 6214 trong 6277 là phần cuối của chuỗiVới một câu lệnh khác, một (và chỉ một. ) của hai khối mã được đảm bảo chạy. Mã trong khối 6252 sẽ chạy nếu điều kiện được đáp ứng hoặc mã trong khối 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 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ả 6284 và 6267 đều là số trúng thưởng. Câu lệnh 6252 có thể được thay đổi thành như sauThí dụ. PHP-DiceRoll-Hoặc 649Toán tử đường ống kép ( 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 6252 không bị giới hạn trong việc sử dụng toán tử bằng ( 6257). Họ cũng có thể sử dụng toán tử lớn hơn ( 6290) và nhỏ hơn ( 6291). Câu lệnh 6252 ở trên cũng có thể được thực hiện với một biểu thức duy nhấtThí dụ. PHP-DiceRoll-Greater 700Điều kiện 6293 sẽ được đáp ứng nếu giá trị được lưu trữ trong biến 6266 lớn hơn 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 6296Giống như biểu thức “or” ( 6287), có một biểu thức “and” chỉ được đáp ứng khi cả hai điều kiện được đáp ứng. Chúng tôi có thể mở rộng trò chơi để bao gồm hai viên xúc xắc và yêu cầu người chơi tung hai con sáu để giành chiến thắngThí dụ. PHP-DiceRoll-TwoDice 701Điều kiện 6298 sẽ chỉ được đáp ứng nếu 6299 là đúng và 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à ( 6401) thành hoặc ( 6287) — nghĩa là, 6403 — người chơi sẽ thắng nếu họ gieo được 6 trên cả hai viên xúc xắcChúng tôi sẽ xem xét các điều kiện phức tạp hơn khi có nhu cầu. Hiện tại, chỉ cần biết chung về các câu lệnh 6404 là đủGhi chú. PHP cũng cho phép sử dụng 6405 thay cho 6287 và 6407 thay cho 6401. Ví dụ 702Có một số khác biệt nhỏ giữa cách làm việc của 6405 và 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 ( 6287) và dấu và đôi ( 6401) sẽ giúp ngăn ngừa một số lỗi khó hiểuvòng lặpMộ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ặpVòng lặp 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 6413Đây là những gì nó trông giống như trong mã 703Câu lệnh 6417 được thực thi một lần khi bắt đầu vòng lặp. Câu lệnh 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 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 6413, bạn có thể sử dụng đoạn mã sau 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
Điều kiện trong ví dụ này sử dụng toán tử 6429. Điều này hoạt động tương tự như toán tử nhỏ hơn ( 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 6431 (lớn hơn hoặc bằng) và 6432 (không bằng)Tất cả ba phần của vòng lặp 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 6413, vì vậy bạn sẽ có nhiều cơ hội để thực hành đọc chúngBạn có thể thay đổi từng phần của vòng lặp 6413 để có kết quả khác nhau. Ví dụ: hãy xem cách thêm 6240 mỗi khi bạn có thể thay đổi vòng lặp 6413 bằng cách sửa đổi phần cuối cùngPhần cuối cùng của vòng lặp, 6426, cho biết thêm 1 vào giá trị của 6422 và đó là một cách viết ngắn gọn của 6427Bằng cách thay đổi 6426 thành 6442, vòng lặp for có thể được sử dụng để đếm ba phầnThí dụ. PHP-Dành cho 705Điều này sẽ dẫn đến kết quả như sau 706Vòng lặp 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 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 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 708Máy tính không quan tâm bạn sử dụng phương pháp nào. bạn có thể sao chép/dán hoặc sử dụng vòng lặp. Nó sẽ chỉ chạy mã. Tuy nhiên, với tư cách là nhà phát triển, bạn sẽ nhanh chóng nhận ra rằng vòng lặp là lựa chọn tốt hơn. Nếu bạn muốn cập nhật mã để cho phép 6284 làm số chiến thắng, bạn cần cập nhật điều kiện ở mười vị trí khác nhau. Sử dụng vòng lặp, bạn có thể thay đổi mã ở một nơi và nó sẽ ảnh hưởng đến mỗi lần lặp của vòng lặp. Nếu bạn thấy mình sao chép/dán mã, luôn có cách tốt hơn để đạt được những gì bạn đang cố gắng thực hiệnGhi chú. với kiến thức mới của bạn về các vòng lặp, bạn sẽ có thể bắt đầu viết mã cho chính mình. Bạn có thể hoàn thành những thử thách này không?
Vòng lặp WhileMột cấu trúc điều khiển PHP thường được sử dụng khác là vòng lặp 6414. Trong trường hợp câu lệnh 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 6414 cho phép chúng ta sử dụng một điều kiện để xác định số lần chúng ta sẽ thực hiện lặp lại một tập hợp các câu lệnhHình ảnh sau đây cho thấy cách hoạt động của vòng lặp 6414Đây là vòng lặp 6414 trông như thế nào trong mã 710Vòng lặp 6414 hoạt động rất giống với câu lệnh 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 ( 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 6414, sau dấu ngoặc nhọn đóngBạn có thể sử dụng vòng lặp 6414 để tạo bộ đếm có kết quả tương tự như vòng lặp 6413Thí dụ. PHP-WhileCount 711Điều này hoạt động giống hệt như vòng lặp 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
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 6422 là 6423, vì vậy điều kiện chắc chắn là đúng. Giá trị của 6422 ( 6423) được xuất ra và 6422 được cung cấp giá trị mới là 6493. Điều kiện vẫn đúng khi được kiểm tra lần thứ hai, vì vậy giá trị ( 6493) được xuất ra và giá trị mới ( 6240) được gán. Quá trình này tiếp tục, xuất ra các giá trị 6240, 6295, 6284, 6267, 7000, 7001, 7002 và 7003. Cuối cùng, 6422 được cho một giá trị là 7005 và điều kiện được phát hiện là sai, kết thúc vòng lặpKết quả ròng của mã được hiển thị trong hình ảnh sau Mặc dù các vòng lặp thường không được sử dụng cho các bộ đếm đơn giản như thế này; . Mặc dù bạn có thể tạo bộ đếm bằng vòng lặp 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 6414Thí dụ. PHP-DiceRoll-While 712Thao tác này sẽ tiếp tục tung xúc xắc cho đến khi con số 6 được tung ra. Mỗi lần bạn chạy mã, sẽ mất một số lần cuộn khác nhau trước khi bạn giành chiến thắng Câu lệnh while sử dụng điều kiện 7009. Để vòng lặp 6414 được chạy lần đầu tiên, biến 6266 phải được đặt thành một giá trị để so sánh ban đầu. Đó là mục đích của dòng 7012 phía trên vòng lặp 6414. Bằng cách đặt giá trị ban đầu thành 0, khi vòng lặp 6414 chạy lần đầu tiên, điều kiện 7009 được đáp ứng, vì 6266 bằng 0, không phải 6 và vòng lặp sẽ bắt đầu. Nếu biến 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 6266 chưa được đặt thành bất kỳ thứ gì trước khi được sử dụngCó một biến thể của vòng lặp 6414 được gọi là 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 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 714Lần này, vì điều kiện ở dưới cùng nên khi câu lệnh 6414 được chạy, biến 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 715Tập lệnh sẽ thực thi theo cùng một cách chính xác. Các lập trình viên khác nhau có các kiểu ưa thích khác nhau, chẳng hạn như sử dụng các tab hoặc dấu cách để thụt đầu dòng hoặc đặt dấu ngoặc mở trên cùng một dòng với câu lệnh hoặc sau câu lệnh. Thậm chí còn có các hướng dẫn về phong cách mã hóa chỉ ra vị trí đặt dấu ngoặc nhọn và dấu ngoặc đơn và cách định dạng mã. Nhưng máy tính không quan tâm liệu một dấu ngoặc nằm trên cùng một dòng hay dòng tiếp theo, vì vậy hãy sử dụng bất kỳ kiểu nào bạn cảm thấy thoải mái nhất MảngMả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 ( 7023 và 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 716Ghi chú. mảng trong PHP cũng có thể được xác định bằng từ khóa 7025. Đoạn mã sau tương đương với ký hiệu ngoặc vuông ở trên 717Ký hiệu dấu ngoặc vuông đã được giới thiệu trong PHP 5. 4 và được các nhà phát triển PHP ưa thích vì nó ít phải gõ hơn và dấu ngoặc vuông dễ nhìn thấy hơn giữa các dấu ngoặc tròn trong các cấu trúc điều khiển như câu lệnh 6252 và vòng lặp 6414Mã này tạo một mảng có tên là 7028 chứa ba giá trị. 7029, 6493 và 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 718Mỗi giá trị được lưu trữ trong một mảng được gọi là một phần tử. Bạn có thể sử dụng khóa trong ngoặc vuông để thêm phần tử mới hoặc gán giá trị mới cho phần tử mảng hiện có 719Bạn cũng có thể thêm các phần tử vào cuối mảng bằng cách sử dụng toán tử gán như bình thường, nhưng để trống các dấu ngoặc vuông theo sau tên biến 740Các phần tử mảng có thể được sử dụng giống như bất kỳ biến nào khác và trong nhiều trường hợp, việc chọn sử dụng một mảng hay nhiều biến sẽ phụ thuộc vào sở thích của lập trình viên. Tuy nhiên, mảng có thể được sử dụng để giải quyết các vấn đề mà các biến thông thường không thể Bạn có nhớ trò chơi xúc xắc trong phần trước không? . Ví dụ: thay vì “Bạn đã đổ được 3” hoặc “Bạn đã đổ được 6”, sẽ tốt hơn nếu bạn đọc “Bạn đã đổ được 3” hoặc “Bạn đã đổ được 6” Để làm điều này, chúng ta cần một số cách chuyển đổi từ một số sang từ tiếng Anh cho số đó. Điều này có thể thực hiện được với một loạt câu lệnh 6252Thí dụ. PHP-DiceRoll-English-If 741Giải pháp này hoạt động, nhưng nó rất kém hiệu quả, vì bạn cần viết một câu lệnh 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 742Ký hiệu 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 743Mặc dù chúng tương đương nhau nhưng mã cần thiết để sử dụng ký hiệu tốc ký sẽ gõ nhanh hơn rất nhiều và dễ đọc và dễ hiểu hơn. Bây giờ mảng đã được tạo, có thể đọc từng từ tiếng Anh trong đó 744Trong PHP, một số như 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ụ 745Biết được điều này, chúng ta có thể ghép tất cả lại với nhau và điều chỉnh trò chơi súc sắc để hiển thị từ tiếng Anh của trò tung xúc xắc bằng cách đọc giá trị liên quan từ mảng bằng cách sử dụng biến 6266Thí dụ. PHP-DiceRoll-English-Array 746Như bạn có thể thấy, điều này sạch sẽ và gọn gàng hơn rất nhiều so với một danh sách dài các câu lệnh 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 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 7039 thay vì lặp lại tất cả các câu lệnh 6252 cho mỗi lần tung xúc xắcThí dụ. PHP-DiceRoll-English-If-TwoDice 747Thay vào đó, mảng có thể được sử dụng cho cả cuộn Thí dụ. PHP-DiceRoll-English-Array-TwoDice 748Mặc dù các số là lựa chọn phổ biến nhất cho các chỉ mục mảng, nhưng vẫn có một khả năng khác. Bạn cũng có thể sử dụng các chuỗi làm chỉ số để tạo cái được gọi là mảng kết hợp. Nó được gọi như vậy bởi vì nó liên kết các giá trị với các chỉ số có ý nghĩa. Trong ví dụ này, chúng tôi liên kết một ngày (ở dạng chuỗi) với từng tên trong số ba tên 749Giống như các chỉ mục số, bạn cũng có thể sử dụng ký hiệu tốc ký cho các mảng kết hợp 640Bây giờ, nếu chúng ta muốn biết ngày sinh nhật của Kevin, chúng ta sẽ tra cứu nó bằng cách sử dụng tên làm chỉ mục 641Loại mảng này đặc biệt quan trọng khi nói đến tương tác của người dùng trong PHP, như chúng ta sẽ thấy ngay sau đây. Tôi cũng sẽ trình bày các cách sử dụng mảng khác trong suốt cuốn sách này Ghi chú. bởi vì 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 6227 để PHP coi nó là một phần của chuỗi, thay vì đánh dấu phần cuốiTương tác người dùng và biểu mẫuCá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ếtCá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 642Xem dấu chấm hỏi trong URL? . Thông tin đó đang được gửi cùng với yêu cầu cho 7044Hãy mã hóa một ví dụ đơn giản của riêng chúng ta. Tạo một tệp HTML thông thường có tên là 7045 (không yêu cầu phần mở rộng tên tệp 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 643Đây là liên kết đến một tệp có tên là 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à 7048 và giá trị của nó là 7049. Vì vậy, bạn đã tạo một liên kết tải 7047 và thông báo mã PHP có trong tệp đó rằng 7048 bằng 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 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 3. Điều này cho máy chủ web biết rằng nó có thể mong đợi diễn giải một số mã PHP trong tệp. Trong phần nội dung của trang web mới này, hãy nhập nội dung sauThí dụ. PHP-NHẬN 644Bây giờ, hãy đặt hai tệp này ( 7045 và 7047) vào thư mục 8 và tải tệp đầu tiên trong trình duyệt của bạn. (URL phải là 7058. ) Nhấp vào liên kết trong trang đầu tiên đó để yêu cầu tập lệnh PHP. Trang kết quả sẽ hiển thị “Chào mừng đến với trang web của chúng tôi, Tom. ”, như trong hình bên dướiChúng ta hãy xem xét kỹ hơn đoạn mã đã biến điều này thành hiện thực. Đây là dòng quan trọng nhất 645Sử dụng những gì bạn đã học được từ phần “Mảng” ở trên, bạn có thể hình dung ra dòng này làm gì. Nó gán giá trị được lưu trữ trong phần tử 7059 của mảng có tên là 7060 cho một biến mới có tên là 7061. Nhưng mảng 7060 đến từ đâu?Hóa ra 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 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. 7060 là một mảng kết hợp, vì vậy giá trị của biến 7048 được truyền trong chuỗi truy vấn có thể được truy cập dưới dạng 7067. Tập lệnh 7047 của bạn gán giá trị này cho một biến PHP thông thường ( 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 6205 646Giá trị của biến 7061 được chèn vào chuỗi đầu ra bằng cách sử dụng toán tử nối chuỗi ( 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 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 7061. Mặc dù biến 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 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 7048Để xem nó hoạt động như thế nào, hãy nhấp lại vào liên kết trong 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 647Chỉnh sửa URL để chèn thẻ 7079 trước tên và thẻ 7080 sau tên 648Nhấn enter để tải URL mới này và lưu ý rằng tên trong trang hiện được in đậm, như thể hiện trong hình ảnh sau Ghi chú. bạn có thể nhận thấy rằng một số trình duyệt sẽ tự động chuyển đổi các ký tự 6291 và 6290 thành các chuỗi thoát URL (lần lượt là ____57083 và 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ẻ 7079 thì không có vấn đề gì, nhưng người dùng ác ý có thể bao gồm mã JavaScript tinh vi thực hiện một số hành động tầm thường như đánh cắp mật khẩu của người dùng. Tất cả những gì kẻ tấn công phải làm là xuất bản liên kết đã sửa đổi trên một số trang web khác dưới sự kiểm soát của kẻ tấn công, sau đó lôi kéo một trong những người dùng của bạn nhấp vào liên kết đó. Kẻ tấn công thậm chí có thể nhúng liên kết vào email và gửi cho người dùng của bạn. Nếu một trong những người dùng của bạn nhấp vào liên kết, mã của kẻ tấn công sẽ được đưa vào trang của bạn và cái bẫy sẽ được bung raTôi không muốn làm bạn sợ khi nói về những tin tặc nguy hiểm tấn công người dùng của bạn bằng cách biến mã PHP của chính bạn chống lại bạn, đặc biệt khi bạn chỉ mới học ngôn ngữ này. Thực tế là điểm yếu lớn nhất của PHP với tư cách là một ngôn ngữ là việc đưa ra các vấn đề bảo mật như thế này quá dễ dàng. Một số người có thể nói rằng phần lớn năng lượng bạn bỏ ra để học cách viết PHP theo tiêu chuẩn chuyên nghiệp được dành cho việc tránh các vấn đề bảo mật. Tuy nhiên, bạn càng sớm tiếp xúc với những vấn đề này, bạn càng sớm quen với việc tránh chúng và chúng sẽ càng ít trở ngại cho bạn trong tương lai. Vì vậy, làm thế nào chúng ta có thể tạo một trang chứa tên người dùng mà không bị kẻ tấn công lạm dụng? . Đây là một sự khác biệt tinh tế, vì vậy hãy để tôi chỉ cho bạn ý của tôi Mở lại tệp 7047 của bạn và chỉnh sửa mã PHP chứa trong tệp để nó trông giống như mã bên dướiThí dụ. PHP-GET-Sát trùng 649Có rất nhiều thứ đang diễn ra trong mã này, vì vậy hãy để tôi chia nhỏ nó cho bạn. Dòng đầu tiên giống như dòng trước, gán cho 7061 giá trị của phần tử 7059 từ mảng 7060. Nhưng câu lệnh 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 7061 — trần trụi — vào câu lệnh 6205, phiên bản mã này sử dụng hàm PHP tích hợp sẵn 7094 để thực hiện chuyển đổi quan trọngHãy nhớ rằng, lỗ hổng bảo mật xảy ra bởi vì, trong 7047, mã HTML trong biến 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à 7094 làm là chuyển đổi “các ký tự HTML đặc biệt” như 6291 và 6290 thành các thực thể ký tự HTML như 7100 và 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 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ả 800Đối số đầu tiên là biến 7061 (văn bản sẽ được chuyển đổi). Đối số thứ hai là PHP “hằng số” 7104, yêu cầu 7094 chuyển đổi dấu ngoặc đơn và dấu ngoặc kép bên cạnh các ký tự đặc biệt khácGhi chú. hằng số PHP giống như một biến có giá trị mà bạn không thể thay đổi. Không giống như biến, hằng số không bắt đầu bằng ký hiệu đô la. PHP đi kèm với một số hằng số dựng sẵn như 7104 được sử dụng để kiểm soát các hàm dựng sẵn như 7094Tham số thứ ba là chuỗi 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 801Phần tử này cho trình duyệt nhận trang này biết rằng mã HTML của trang được mã hóa dưới dạng văn bản UTF-8 UTF-8 là một trong nhiều tiêu chuẩn để biểu thị văn bản dưới dạng một chuỗi các số 1 và 0 trong bộ nhớ máy tính, được gọi là mã hóa ký tự. Nếu bạn tò mò muốn tìm hiểu tất cả về mã hóa ký tự, hãy xem “Hướng dẫn cơ bản về mã hóa ký tự web” Trong một vài trang nữa, chúng ta sẽ đến phần “Truyền biến trong biểu mẫu”. Bằng cách mã hóa các trang của bạn dưới dạng UTF-8, người dùng của bạn có thể gửi văn bản chứa hàng nghìn ký tự nước ngoài mà trang web của bạn không thể xử lý nếu không Thật không may, nhiều hàm tích hợp sẵn của PHP, chẳng hạn như 7094, cho rằng bạn đang sử dụng mã hóa ký tự ISO-8859-1 (hoặc Latin-1) đơn giản hơn nhiều theo mặc định. Do đó, bạn cần cho họ biết bạn đang sử dụng UTF-8 khi sử dụng các chức năng nàyNếu có thể, bạn cũng nên yêu cầu trình soạn thảo văn bản của mình lưu các tệp HTML và PHP dưới dạng văn bản được mã hóa UTF-8. Điều này chỉ bắt buộc nếu bạn muốn nhập các ký tự nâng cao (chẳng hạn như dấu ngoặc kép hoặc dấu gạch ngang) hoặc ký tự nước ngoài (như “é”) vào mã HTML hoặc PHP của bạn. Mã trong cuốn sách này an toàn và sử dụng các tham chiếu thực thể HTML (ví dụ: 7110 cho một trích dẫn cong bên phải), mã này sẽ hoạt động bất kểMở 7045 trong trình duyệt của bạn và nhấp vào liên kết hiện trỏ đến 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ẻ 7079 và 7080 xung quanh tên 648Khi bạn nhấn enter lần này, thay vì tên được in đậm trong trang, bạn sẽ thấy văn bản thực mà bạn đã nhập, như minh họa trong hình dưới đây Nếu bạn xem mã nguồn của trang, bạn có thể xác nhận rằng hàm 7094 đã thực hiện công việc của mình và chuyển đổi các ký tự 6291 và 6290 thành các tham chiếu thực thể 7100 và 7101 tương ứng. Điều này ngăn người dùng độc hại tiêm mã không mong muốn vào trang web của bạn. Nếu họ thử bất cứ điều gì như vậy, mã sẽ được hiển thị vô hại dưới dạng văn bản thuần túy trên trangChúng tôi sẽ sử dụng rộng rãi hàm 7094 trong suốt cuốn sách này để đề phòng loại lỗ hổng bảo mật này. Không cần quá lo lắng nếu bạn đang gặp khó khăn trong việc nắm bắt chi tiết cách sử dụng ngay lúc này. Chẳng bao lâu, bạn sẽ thấy việc sử dụng nó trở thành bản chất thứ hai. Bây giờ, hãy xem xét một số cách nâng cao hơn để chuyển giá trị cho tập lệnh PHP khi chúng tôi yêu cầu chúngTruyền một biến duy nhất trong chuỗi truy vấn là tốt, nhưng hóa ra bạn có thể truyền nhiều hơn một giá trị nếu muốn. Hãy xem xét một phiên bản phức tạp hơn một chút của ví dụ trước. Mở lại tệp 7045 của bạn và thay đổi liên kết để trỏ đến 7047 bằng chuỗi truy vấn phức tạp hơn này 803Lần này, liên kết của chúng tôi vượt qua hai biến. 7123 và 7124. Các biến được phân tách trong chuỗi truy vấn bằng dấu và ( 7125, nên được viết là 7126 trong HTML — có, ngay cả trong URL liên kết. … mặc dù, nếu bạn sử dụng sai 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 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 7047 của mìnhThí dụ. PHP-GET-TwoVars 804Tuyên bố 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 ( 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 7132 (an toàn để hiển thị bằng cách sử dụng 7094), một khoảng trắng, giá trị của 7134 (một lần nữa, được xử lý bằng 7094) và Kết quả là hình bên dưới Điều này là tốt và tốt, nhưng chúng tôi vẫn chưa đạt được mục tiêu tương tác người dùng thực sự, nơi người dùng có thể nhập thông tin tùy ý và xử lý thông tin đó bằng PHP. Để tiếp tục với ví dụ của chúng tôi về thông báo chào mừng được cá nhân hóa, chúng tôi muốn mời người dùng nhập tên của họ và tên đó sẽ xuất hiện trên trang kết quả. Để cho phép người dùng nhập một giá trị, chúng tôi sẽ cần sử dụng biểu mẫu HTML Truyền biến trong biểu mẫuXóa mã liên kết khỏi 7045 và thay thế bằng mã HTML này để tạo biểu mẫuThí dụ. PHP-GET-Biểu mẫu 805Hình ảnh dưới đây cho thấy cách trình duyệt hiển thị biểu mẫu được tạo từ mã này Ghi chú. Tôi đã thêm một số CSS vào biểu mẫu (có sẵn trong 7137 trong mã mẫu) để làm cho nó trông đẹp hơn một chút. CSS tôi đã sử dụng rất chung chung và có thể được sử dụng để hiển thị bất kỳ biểu mẫu nào ở định dạng ngắt dòng nhãn đầu vào. Tôi sẽ đưa tệp CSS này vào bất kỳ trang nào có chứa biểu mẫuTuy nhiên, vì đây là một cuốn sách về PHP và MySQL nên tôi sẽ không đi vào chi tiết về cách thức hoạt động của CSS. Hãy xem HTML5 & CSS3 dành cho Thế giới thực của SitePoint để được tư vấn về cách tạo kiểu cho biểu mẫu của bạn bằng CSS Biểu mẫu này có tác dụng chính xác giống như liên kết thứ hai mà chúng tôi đã xem xét trong phần “Chuyển biến trong liên kết” ở trên (với 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 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 7140 và lấy giá trị từ văn bản do người dùng nhập vào trường văn bảnThuộc tính 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 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ố 7145 trong biểu mẫu để cho phép người dùng nhập một lượng lớn văn bản? . Giải pháp thay thế là để trình duyệt chuyển thông tin một cách vô hình, đằng sau hậu trườngChỉnh sửa tệp 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 7147 806Giá trị mới này cho thuộc tính phương thức hướng dẫn trình duyệt gửi các biến biểu mẫu một cách vô hình như một phần của yêu cầu trang, thay vì nhúng chúng vào chuỗi truy vấn của URL Vì chúng tôi không còn gửi các biến như một phần của chuỗi truy vấn, chúng sẽ ngừng xuất hiện trong mảng 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”. 7149. Do đó, chúng tôi phải sửa đổi 7047 để lấy các giá trị từ mảng mới nàyThí dụ. PHP-POST-Biểu mẫu 807Hình ảnh bên dưới hiển thị trang kết quả trông như thế nào sau khi biểu mẫu mới này được gửi Biểu mẫu có chức năng giống hệt với biểu mẫu trước. Điểm khác biệt duy nhất là URL của trang được tải khi người dùng nhấp vào nút GO sẽ không có chuỗi truy vấn. Một mặt, điều này cho phép bạn bao gồm các giá trị lớn (hoặc giá trị nhạy cảm chẳng hạn như mật khẩu và số thẻ tín dụng) trong dữ liệu được gửi bởi biểu mẫu mà chúng không xuất hiện trong chuỗi truy vấn. Mặt khác, nếu người dùng đánh dấu trang xuất phát từ việc gửi biểu mẫu, thì dấu trang đó sẽ vô dụng vì nó thiếu các giá trị đã gửi. Tình cờ, đây là lý do chính tại sao các công cụ tìm kiếm sử dụng chuỗi truy vấn để gửi cụm từ tìm kiếm. Nếu bạn đánh dấu một trang kết quả tìm kiếm trên Google, bạn có thể sử dụng dấu trang đó để thực hiện lại cùng một tìm kiếm sau đó vì các cụm từ tìm kiếm được chứa trong URL Ghi chú. theo quy tắc chung, bạn chỉ nên sử dụng biểu mẫu 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 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 7152 cũng an toàn hơn. Mọi thứ được gửi qua 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 mayBâ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 3 và đưa mã PHP vào đó để tạo nội dung trang một cách nhanh chóng. Không tệ cho một ngày làm việcTuy nhiên, trước khi chúng ta tiếp tục, tôi muốn dừng lại và xem xét kỹ lưỡng các ví dụ mà chúng ta đã thảo luận cho đến nay. Giả sử mục tiêu của bạn là tạo các trang web dựa trên cơ sở dữ liệu đáp ứng các tiêu chuẩn chuyên nghiệp, có một vài nhược điểm khó coi mà chúng tôi cần phải làm sạch Các kỹ thuật trong phần còn lại của chương này sẽ giúp nâng cao kỹ năng lập trình của bạn vượt qua trình độ mới bắt đầu, giúp chúng trở nên chuyên nghiệp nhất định. Tôi sẽ dựa vào những kỹ thuật này trong suốt phần còn lại của cuốn sách này để đảm bảo rằng, cho dù ví dụ có đơn giản đến đâu, bạn vẫn có thể cảm thấy tự tin vào chất lượng của sản phẩm mà bạn đang phân phối. Mẫu PHPTrong 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 7156. Với câu lệnh 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” 6413 mà chúng ta đã xem trước đóBắt đầu bằng cách tạo một tệp mới, 7159, trong thư mục 8 của bạn. Mở tệp để chỉnh sửa và nhập mã này 808Vâng, đó là mã hoàn chỉnh cho tệp này. Nó không chứa mã HTML nào. Bây giờ vòng lặp 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
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ã 7156, như thể 7156 là một hàm giống như 7179 hoặc 7094, điều này khác xa với trường hợp. Ví dụ: thay vì 7181, bạn có thể thấy 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 6205, một lớp lót phổ biến khácVì dòng cuối cùng của tệp 7159 của chúng tôi bao gồm tệp 7170, bạn nên tạo tệp đó tiếp theoThí dụ. PHP-Đếm-Mẫu 809Tệp này gần như hoàn toàn là HTML đơn giản, ngoại trừ một dòng xuất giá trị của biến 7163. Đây chính là biến 7163 được tạo bởi tệp 7159Những gì chúng tôi đã tạo ở đây là một mẫu PHP. một trang HTML chỉ có các đoạn mã PHP rất nhỏ chèn các giá trị được tạo động vào một trang HTML tĩnh khác. Thay vì nhúng mã PHP phức tạp để tạo các giá trị đó vào trang, chúng tôi đặt mã để tạo các giá trị trong một tập lệnh PHP riêng — trong trường hợp này là 7159Sử dụng các mẫu PHP như thế này cho phép bạn giao các mẫu của mình cho các nhà thiết kế ngoại vi mà không phải lo lắng về những gì họ có thể làm với mã PHP của bạn. Nó cũng cho phép bạn tập trung vào mã PHP của mình mà không bị phân tâm bởi mã HTML xung quanh Tôi muốn đặt tên cho các tệp mẫu PHP của mình để chúng kết thúc bằng 7190. Tuy nhiên, đối với máy chủ web của bạn, đây vẫn là các tệp 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 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 7159 được hiển thị trong mẫu 7170 của chúng tôiMối quan tâm về an ninhMộ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ã 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 7170. Nếu bạn nhập 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. 7199Tốt hơn hết là đừng để mọi người chạy mã theo cách mà bạn không mong đợi. Tùy thuộc vào những gì trang đang làm, điều này có thể cho phép họ vượt qua kiểm tra bảo mật mà bạn có tại chỗ và xem nội dung mà họ không nên có quyền truy cập. Ví dụ: xem xét đoạn mã sau 740Nhìn vào mã này, có vẻ như bạn cần gửi biểu mẫu và nhập 7400 vào hộp mật khẩu để xem nội dung được bảo vệ trong 7401. Tuy nhiên, nếu ai đó có thể điều hướng trực tiếp đến 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 8Bạn có thể đã tự hỏi trước đó tại sao môi trường phát triển đã tạo một thư mục 8 bên trong thư mục 7405 và sau đó chúng tôi đã ghi tất cả các tệp của mình vào thư mục 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 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 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 7405, chứa thư mục 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 741Và đây là giao diện của nó khi sử dụng môi trường Docker mà chúng tôi đang sử dụng 742Mặc dù phương pháp này sẽ hoạt động, nhưng nó không được mong muốn vì nó liên kết mã trang web của bạn với cấu hình máy chủ web của bạn. Bởi vì chúng tôi đang sử dụng Docker, nên việc triển khai trang web cũng sẽ sử dụng cùng một môi trường Docker, vì vậy đây không thực sự là vấn đề trong những ngày này. Tuy nhiên, lý tưởng nhất là bạn có thể thả trang web dựa trên PHP của mình vào bất kỳ máy chủ web hỗ trợ PHP nào và chỉ cần xem nó chạy. Điều đó là không thực tế nếu mã của bạn đề cập đến các ổ đĩa và thư mục dành riêng cho một máy chủ cụ thể. Ngay cả khi bạn có khả năng làm việc trên một máy chủ duy nhất, bạn sẽ tự trách mình nếu cần di chuyển trang web của mình sang một ổ đĩa/thư mục khác trên máy chủ đó Một phương pháp tốt hơn là sử dụng đường dẫn tương đối — nghĩa là vị trí của tệp so với tệp hiện tại. Khi bạn sử dụng 7411, đây thực sự là một đường dẫn tương đối. 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 743Bit 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 7170 trong thư mục 7405 thay vì thư mục 8Tiếp tục và di chuyển 7170 lên một cấp vào thư mục 7405 và sửa đổi 7159 để tham chiếu vị trí mớiThí dụ. PHP-Count-Template-Secured 744Nếu bạn chạy mã ở trên, nó sẽ hoạt động. Nhưng có một vấn đề tiềm ẩn khi bạn bao gồm các tệp theo cách này. Đường dẫn tương đối liên quan đến tập lệnh đã được chạy, không liên quan đến từng tệp Nghĩa là, nếu bạn mở 7420 và thêm dòng 7421, bạn sẽ mong đợi 7422 được đưa vào từ thư mục 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 7421 từ 7170 sẽ thực sự cố tải 7422 từ thư mục 8Thư mục làm việc hiện tại được đặt ở đầu tập lệnh và áp dụng cho tất cả các câu lệnh 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 7429Vì điều này, chúng tôi không thể dựa vào những điều sau đây 743Nó sẽ hoạt động, nhưng nếu thư mục bị thay đổi hoặc bản thân 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à 7431 (đó là hai dấu gạch dưới, trước và sau từ 7432) sẽ luôn chứa đường dẫn chứa tệp hiện tạiVí dụ: bạn có thể tạo một tệp có tên 7433 bên trong thư mục 8 với mã sau 746Điều này sẽ hiển thị 7435, đây là đường dẫn đầy đủ đến thư mục chứa 7433. Để đọc 7170 từ thư mục trên 8, có thể kết hợp toán tử 7439 và hằng số 7431 747Điều này bây giờ sẽ bao gồm tệp 7441. Tức là PHP sẽ tìm trong thư mục 8, sau đó tăng một cấp thành 7405 và bao gồm cả 7170Cách tiếp cận này sẽ hoạt động trên bất kỳ máy chủ nào, vì 7431 sẽ khác nhau tùy thuộc vào nơi tệp được lưu trữ và nó không phụ thuộc vào việc thay đổi thư mục làm việc hiện tại. Tôi sẽ sử dụng phương pháp này để bao gồm các tệp trong suốt cuốn sách nàyTừ giờ trở đi, chúng tôi sẽ chỉ ghi các tệp vào thư mục 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 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 7156 sẽ được đặt bên ngoài thư mục 8 để người dùng không thể truy cập trực tiếp vào chúngKhi cuốn sách tiếp tục, tôi sẽ giới thiệu với bạn một số loại tệp bao gồm khác nhau. Để giữ mọi thứ ngăn nắp, nên lưu trữ các loại tệp bao gồm khác nhau trong các thư mục khác nhau. Chúng tôi sẽ lưu trữ các tệp mẫu (có phần mở rộng 7190) bên trong thư mục có tên là 7451 bên trong thư mục 7405. Sau đó, chúng tôi có thể tham chiếu chúng trong một câu lệnh 7156 bằng cách sử dụng 7454Nhiều mẫu, một bộ điều khiểnĐiều thú vị khi sử dụng các câu lệnh 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 7156 trong một tập lệnh PHP, cũng như để nó hiển thị các mẫu khác nhau trong các trường hợp khác nhauTập lệnh PHP đáp ứng yêu cầu của trình duyệt bằng cách chọn một trong số các mẫu PHP để điền vào và gửi lại thường được gọi là “bộ điều khiển”. Bộ điều khiển chứa logic kiểm soát mẫu nào được gửi tới trình duyệt Hãy cùng xem lại một ví dụ nữa từ phần đầu của chương này — biểu mẫu chào mừng nhắc khách nhập họ và tên Chúng ta sẽ bắt đầu với mẫu PHP cho biểu mẫu. Đối với điều này, chúng tôi chỉ có thể sử dụng lại tệp 7045 mà chúng tôi đã tạo trước đó. Tạo một thư mục 7451 bên trong 7405 nếu bạn chưa tạo và lưu một bản sao của 7045 có tên là 7461 vào thư mục này. Mã duy nhất bạn cần thay đổi trong tệp này là thuộc tính hành động của thẻ biểu mẫuThí dụ. PHP-Form-Controller 748Như bạn có thể thấy, chúng tôi đang để trống thuộc tính hành động. Điều này yêu cầu trình duyệt gửi biểu mẫu trở lại cùng một URL mà nó đã nhận nó từ đó — trong trường hợp này, URL của bộ điều khiển bao gồm tệp mẫu này Hãy xem bộ điều khiển cho ví dụ này. Tạo một tệp 7462 bên trong thư mục 8 chứa đoạn mã sau 749Mã này thoạt nhìn sẽ khá quen thuộc. Nó rất giống kịch bản 7047 mà chúng tôi đã viết trước đó. Hãy để tôi giải thích sự khác biệt
Tất cả những gì còn lại là ghi tệp 7486 vào thư mục 7451. Đây rồi 0Đó là nó. Khởi động trình duyệt của bạn và trỏ nó vào 7489. Bạn sẽ được nhắc nhập tên của mình và khi gửi biểu mẫu, bạn sẽ thấy thông báo chào mừng phù hợp. URL phải giữ nguyên trong suốt quá trình nàyBạn sẽ nhận thấy rằng tôi đã yêu cầu bạn đặt tên tệp là 7462 thay vì 7047 hoặc tương tự. Lý do tôi sử dụng 7462 là vì nó có ý nghĩa đặc biệt. 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 7462 và hiển thị tệp đó. Hãy thử chỉ gõ 7495 vào trình duyệt của bạn và bạn sẽ thấy trang chỉ mụcGhi chú. máy chủ web có thể có các cấu hình khác nhau và chỉ định một tệp khác làm chỉ mục thư mục. Tuy nhiên, 7462 sẽ hoạt động trên hầu hết các máy chủ web mà không cần cấu hình thêmMột trong những lợi ích của việc duy trì cùng một URL trong suốt quá trình nhắc tên người dùng và hiển thị thông báo chào mừng này là người dùng có thể đánh dấu trang bất kỳ lúc nào trong quá trình này và nhận được kết quả hợp lý. Cho dù đó là trang biểu mẫu hay thông báo chào mừng được đánh dấu trang, khi người dùng quay lại, biểu mẫu sẽ xuất hiện trở lại. Trong phiên bản trước của ví dụ này, khi thông báo chào mừng có URL riêng, việc quay lại URL đó mà không gửi biểu mẫu sẽ tạo ra thông báo chào mừng bị hỏng (“Chào mừng đến với trang web của chúng tôi,. ”) hoặc thông báo lỗi PHP nếu, giống như của chúng tôi, máy chủ đang chạy với tính năng báo cáo lỗi được bật Ghi chú. trong Chương 11, nơi chúng ta thảo luận về "phiên", tôi chỉ cho bạn cách nhớ tên người dùng giữa các lần truy cập Đưa vào cơ sở dữ liệuTrong 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àytom 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
|