Mảng

Một mảng là một loại đặc biệt của biến có chứa nhiều giá trị. Nếu bạn nghĩ về một biến là một hộp chứa một giá trị, 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 và chứa các giá trị bạn muốn lưu trữ, được phân tách bằng dấu phẩy: [  ]
$myArray = ['one', 2, '3'];

các từ khóa array

Mảng trong PHP cũng có thể được định nghĩa bằng cách sử dụng từ khóa. Đoạn mã sau tương đương với ký hiệu dấu ngoặc vuông ở trên: array
$myArray = array('one', 2, 3);
Ký hiệu dấu ngoặc vuông được giới thiệu trong PHP 5.4 và được các nhà phát triển PHP ưa thích hơn, vì nó ít 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 và vòng lặp. if  while
Mã này tạo ra một mảng gọi là có chứa ba giá trị: , và Giống như một biến thông thường, mỗi không gian 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, không gian thứ nhất và thứ ba chứa các chuỗi, trong khi không gian thứ hai chứa một số. $myArray  'one'  2  '3'
Để 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ị đầu tiên (hoặc phần tử) của một mảng có chỉ số 0, thứ hai có chỉ số 1, 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à nFL 1. Khi bạn biết chỉ mục của giá trị bạn quan tâm, bạn có thể truy xuất giá trị đó bằng cách đặt chỉ mục đó trong ngoặc vuông sau tên biến mảng:
echo $myArray[0]; // outputs 'one'
echo $myArray[1]; // outputs '2'
echo $myArray[2]; // outputs '3'
Mỗi giá trị được lưu trữ trong một mảng được gọi là một phần tử . Bạn có thể sử dụng một khóa trong ngoặc vuông để thêm các phần tử mới hoặc gán giá trị mới cho các phần tử mảng hiện có:
$myArray[1] = 'two'; // assign a new value
$myArray[3] = 'four'; // create a new element
Bạn cũng có thể thêm các phần tử vào cuối một mảng bằng toán tử gán như bình thường, nhưng để trống các dấu ngoặc vuông theo tên biến:
$myArray[] = 'five';
echo $myArray[4]; // outputs 'five'
Các phần tử mảng có thể được sử dụ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 hoặc 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òn nhớ trò chơi súc sắc từ phần cuối không? Nó sẽ thân thiện với người dùng hơn nếu nó hiển thị từ tiếng Anh hơn là chữ số cho kết quả. Ví dụ, thay vì “ ” hoặc “ ”, nó có thể là đẹp hơn để đọc “ ” hoặc “ ”. You rolled a 3  You rolled a 6  You rolled a three  You rolled a six
Để làm điều này, chúng ta cần một số cách chuyển đổi từ một chữ số sang từ tiếng Anh cho số đó. Điều này là có thể với một loạt các tuyên bố: if
PHP-DiceRoll-Tiếng Anh-Nếu
$roll = rand(1, 6);
if ($roll == 1) {
$english = 'one';
}
else if ($roll == 2) {
$english = 'two';
}
else if ($roll == 3) {
$english = 'three';
}
else if ($roll == 4) {
$english = 'four';
}
else if ($roll == 5) {
$english = 'five';
}
else if ($roll == 6) {
$english = 'six';
}
echo '<p>You rolled a ' . $english . '</p>';
if ($roll == 6) {
echo '<p>You win!</p>';
}
else {
echo '<p>Sorry, you didn\'t win, better luck next time!</p>';
}
Giải pháp này hoạt động, nhưng nó rất không hiệu quả, vì bạn cần viết một tuyên bố 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: if
$english = [
1 => 'one',
2 => 'two',
3 => 'three',
4 => 'four',
5 => 'five',
6 => 'six'
];
Các ký hiệu cho phép bạn xác định cả các phím và các giá trị khi tạo mảng. Điều này tương đương với: =>
$english = [];
$english[1] = 'one';
$english[2] = 'two';
$english[3] = 'three';
$english[4] = 'four';
$english[5] = 'five';
$english[6] = 'six';
Mặc dù các giá trị này là tương đương, nhưng mã cần thiết để sử dụng ký hiệu tốc ký nhanh hơn rất nhiều để nhập, dễ đọc hơn và dễ hiểu hơn.
Bây giờ mảng đã được tạo, có thể đọc từng từ tiếng Anh từ nó:
echo $english[3]; //Prints "three"
echo $english[5]; //Prints "five"
Trong PHP, một số như nó 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ụ: 3
$var1 = 3;
$var2 = 5;
echo $english[$var1]; //Prints "three"
echo $english[$var2]; //Prints "five"
Biết được điều này, chúng ta có thể ghép tất cả lại với nhau và điều chỉnh trò chơi súc sắc để hiển thị từ tiếng Anh của cuộn súc sắc bằng cách đọc giá trị liên quan từ mảng bằng biến: $roll
PHP-DiceRoll-Tiếng Anh-Mảng
$english = [
1 => 'one',
2 => 'two',
3 => 'three',
4 => 'four',
5 => 'five',
6 => 'six'
];
$roll = rand(1, 6);
echo '<p>You rolled a ' . $english[$roll]
. '</p>';
if ($roll == 6) {
echo '<p>You win!</p>';
}
else {
echo '<p>Sorry, you didn\'t win, better luck
next time!</p>';
}
Như bạn có thể thấy, điều này sạch sẽ và gọn gàng hơn rất nhiều so với một danh sách dài các tuyên bố. Có hai lợi thế lớn ở đây: if
  1. Nếu bạn muốn đại diện cho một con xúc xắc 10 mặt, việc thêm vào mảng sẽ dễ dàng hơn rất nhiều so với việc thêm một câu lệnh cho mỗi số. if
  2. Các mảng có thể tái sử dụng. Đối với phiên bản có hai con xúc xắc, bạn chỉ có thể sử dụng lại mảng thay vì lặp lại tất cả các câu lệnh cho mỗi cuộn súc sắc: $english  if
PHP-DiceRoll-English-If-TwoDice
$roll1 = rand(1, 6);
$roll2 = rand(1, 6);
if ($roll1 == 1) {
$english = 'one';
}
else if ($roll1 == 2) {
$english = 'two';
}
else if ($roll1 == 3) {
$english = 'three';
}
else if ($roll1 == 4) {
$english = 'four';
}
else if ($roll1 == 5) {
$english = 'five';
}
else if ($roll1 == 6) {
$english = 'six';
}
if ($roll2 == 1) {
$englishRoll2 = 'one';
}
else if ($roll2 == 2) {
$englishRoll2 = 'two';
}
else if ($roll2 == 3) {
$englishRoll2 = 'three';
}
else if ($roll2 == 4) {
$englishRoll2 = 'four';
}
else if ($roll2 == 5) {
$englishRoll2 = 'five';
}
else if ($roll2 == 6) {
$englishRoll2 = 'six';
}
echo '<p>You rolled a ' . $english . ' and a '
. $englishRoll2 . '</p>';
Thay vào đó, mảng có thể được sử dụng cho cả hai cuộn:
PHP-DiceRoll-English-Array-TwoDice
$english = [
1 => 'one',
2 => 'two',
3 => 'three',
4 => 'four',
5 => 'five',
6 => 'six'
];
$roll1 = rand(1, 6);
$roll2 = rand(1, 6);
echo '<p>You rolled a ' . $english[$roll1] . ' and
a ' . $english[$roll2] . '</p>';
Trong khi các số là lựa chọn phổ biến nhất cho các chỉ số mảng, có một khả năng khác. Bạn cũng có thể sử dụng các chuỗi như các chỉ mục để tạo ra cái được gọi là mảng kết hợp . Nó được gọi là 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ưới dạng một chuỗi) với mỗi ba tên:
$birthdays['Kevin'] = '1978-04-12';
$birthdays['Stephanie'] = '1980-05-16';
$birthdays['David'] = '1983-09-09';
Giống như các chỉ mục số, bạn cũng có thể sử dụng ký hiệu tốc ký cho các mảng kết hợp:
$birthdays = [
'Kevin' => '1978-04-12',
'Stephanie' => '1980-05-16',
'David' => '1983-09-09'
];
Bây giờ, nếu chúng ta muốn biết ngày sinh của Kevin, chúng tôi sẽ tìm kiếm nó bằng cách sử dụng tên làm chỉ mục:
echo 'Kevin\'s birthday is: ' . $birthdays['Kevin'];
Kiểu mảng này đặc biệt quan trọng khi nói đến tương tác người dùng trong PHP, như chúng ta sẽ thấy trong phần tiếp theo. Tôi sẽ chứng minh các cách sử dụng khác của mảng trong suốt cuốn sách này.

Báo giá thoát

Vì 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 đoạn mã để PHP coi nó là một phần của chuỗi, thay vì đánh dấu kết thúc. Kevin's  \

Tương tác và biểu mẫu của người dùng

Đối với hầu hết các trang web điều khiển cơ sở dữ liệu hiện nay, bạn cần phải làm nhiều 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à một hộp tìm kiếm.
Các cựu chiến binh của JavaScript có xu hướng nghĩ về tính tương tác về mặt người nghe sự kiện, điều này cho phép bạn phản ứng trực tiếp với hành động của người dùng, ví dụ, chuyển động của con trỏ qua một liên kết trên trang. 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 yêu cầu được gửi đến máy chủ, tương tác người dùng chỉ diễn ra theo kiểu ngược lại: người dùng gửi yêu cầu đến máy chủ và máy chủ trả lời các trang được tạo động. (Trong một chừng mực nào đó, Sự phát triển của các kỹ thuật Ajax trong thế giới JavaScript trong những năm gần đây đã thay đổi điều này. Giờ đây, mã JavaScript có thể phản hồi lại hành động của người dùng như chuyển động chuột chuột để gửi yêu cầu đến máy chủ web, gọi một tập lệnh PHP. của cuốn sách này, tuy nhiên, chúng tôi sẽ sử dụng các ứng dụng không phải là Ajax. Nếu bạn muốn tìm hiểu tất cả về Ajax, hãy xem JavaScript: Novice to Ninja của Darren Jones: http://www.sitepoint.com/books/jsninja2/.)
Chìa khóa để tạo tính 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.

Vượt qua các biến trong liên kết

Cách đơn giản nhất để gửi thông tin cùng với yêu cầu trang là sử dụng chuỗi truy vấn URL. Nếu bạn đã từng nhận thấy một URL chứa một dấu hỏi theo tên tệp, bạn đã thấy kỹ thuật này được sử dụng. Ví dụ: nếu bạn tìm kiếm trên Site SitePoint trên Google, nó sẽ đưa bạn đến trang kết quả tìm kiếm với URL như sau:
http://www.google.com/search?hl=en&q=SitePoint
Xem dấu hỏi trong URL? Văn bản theo dấu chấm hỏi chứa truy vấn tìm kiếm của bạn ( ). Thông tin đó đang được gửi cùng với yêu cầu . SitePoint  http://www.google.com/search
Hãy viết mã một ví dụ dễ dàng của riêng chúng ta. Tạo một tệp HTML thông thường được gọi là (không yêu cầu mở rộng tên tệp, 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: name.html  .php
<a href="name.php?name=Kevin">Hi, I&rsquo;m Kevin!</a>
Đây là một liên kết đến một tệp được gọi , nhưng cũng như liên kết đến tệp, bạn cũng chuyển một biến cùng với yêu cầu trang. Biến được truyền như một phần của chuỗi truy vấn, là phần của URL theo dấu chấm hỏi. Biến được gọi , và giá trị của nó là Vì vậy, bạn đã tạo một liên kết tải và thông báo mã PHP có trong tệp đó bằng . name.php  name  Kevin  name.php  name  Kevin
Để 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 Tạo nó dưới dạng tệp HTML mới, nhưng lần này, lưu ý phần mở rộng tên tệp: điều này cho máy chủ web biết rằng nó có thể mong đợi để giải thích một số mã PHP trong tệp. Trong phần thân của trang web mới này, hãy nhập như sau: name.php  .php
PHP-NHẬN
$name = $_GET['name'];
echo 'Welcome to our website, ' . $name . '!';
?>
Bây giờ, đặt hai tệp này ( và ) vào thư mục và tải tệp đầu tiên trong trình duyệt của bạn (URL phải là ). 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ẽ nói rằng Chào mừng bạn đến với trang web của chúng tôi, Kevin!, Như được hiển thị trong hình ảnh sau đây: name.html  name.php  Project  http://192.168.10.10/name.html
Thông điệp chào mừng, được thấy trong trình duyệt
Thông điệp chào mừng, được thấy trong trình duyệt
Chúng ta hãy xem xét kỹ hơn về mã làm cho điều này có thể. Đây là dòng quan trọng nhất:
$name = $_GET['name'];
Sử dụng những gì bạn đã học được từ phần Mảng ở trên, bạn có thể tìm ra dòng này làm gì. Nó gán giá trị được lưu trữ trong phần tử của mảng được gọi cho một biến mới được gọi Nhưng mảng đến từ đâu? 'name'  $_GET  $name  $_GET
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. PHP tạo như 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. là một mảng kết hợp, vì vậy giá trị của biến được truyền trong chuỗi truy vấn có thể được truy cập dưới dạng Tập lệnh của bạn gán giá trị này cho một biến PHP thông thường ( ), sau đó hiển thị nó như một phần của chuỗi văn bản bằng cách sử dụng câu lệnh: $_GET  $_GET  $_GET  name  $_GET['name']  name.php  $name  echo
echo 'Welcome to our website, ' . $name . '!';
Giá trị của biến được chèn vào chuỗi đầu ra bằng cách sử dụng toán tử nối chuỗi ( ) mà chúng ta đã xem trong phần Biến, Toán tử và Nhận xét. $name  .
Nhưng xem ra! Có một lỗ hổng bảo mật ẩn giấu 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 cũng rất dễ dàng để giới thiệu các vấn đề bảo mật vào các trang web bằng PHP nếu bạn không biết nên thực hiện các biện pháp phòng ngừa nào. Trước khi chúng ta tiến xa hơn với ngôn ngữ, tôi muốn đảm bảo rằng bạn có thể phát hiện và khắc phục sự cố 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ừ việc tập lệnh đang tạo một trang có 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. Mặc dù biến 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, một người dùng độc hại có thể chỉnh sửa URL để gửi một giá trị khác cho biến. name.php  $name  $name  name.html  name
Để xem làm thế nào điều này sẽ làm việc, bấm vào liên kết một lần nữa. Khi bạn thấy trang kết quả (với thông báo chào mừng có chứa tên Kevin Kevin), hãy xem URL trong thanh địa chỉ của trình duyệt của bạn. Nó sẽ trông giống như thế này: name.html
http://192.168.10.10/name.php?name=Kevin
Chỉnh sửa URL để chèn thẻ trước tên và thẻ theo tên: <b>  </b>
http://192.168.10.10/name.php?name=<b>Kevin</b>
Nhấn Enter để tải URL mới này và lưu ý rằng tên trong trang hiện được in đậm, như được hiển thị trong hình ảnh sau: (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ự và ký tự thành chuỗi thoát URL ( và tương ứng), nhưng dù bằng cách nào, PHP sẽ nhận được cùng một giá trị.) <  >  %3C  %3E
Tên được in đậm
Tên được in đậm
Xem những gì đang xảy ra ở đây? Người dùng có thể nhập bất kỳ mã HTML nào vào URL và tập lệnh PHP của bạn bao gồm mã đó trong mã của trang được tạo mà không có câu hỏi. Nếu mã vô hại như thẻ, không có vấn đề gì, nhưng người dùng độc hại có thể bao gồm mã JavaScript tinh vi thực hiện một số hành động thấp như đánh cắp mật khẩu của người dùng. Tất cả những kẻ tấn công sẽ 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 và 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à bẫy sẽ bị bung ra! <b>
Tôi ghét 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 biến mã PHP của bạn chống lại bạn, đặc biệt khi bạn chỉ học ngôn ngữ. Thực tế là điểm yếu lớn nhất của ngôn ngữ PHP là việc giới thiệu các vấn đề bảo mật như thế này dễ dàng như thế nào. Một số người có thể nói rằng phần lớn năng lượng bạn dành để học 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, thì bạn càng sớm quen với việc tránh chúng và càng ít vấp ngã thì chúng sẽ dành cho bạn trong tương lai.
Vậy, làm thế nào chúng ta có thể tạo một trang có chứa tên người dùng mà không mở ra để lạm dụng bởi những kẻ tấn công? Giải pháp là coi giá trị được cung cấp cho biến là văn bản thuần túy sẽ được hiển thị trên trang của bạn, chứ không phải là HTML được bao gồm trong mã của trang. Đây là một sự khác biệt tinh tế, vì vậy hãy để tôi chỉ cho bạn những gì tôi muốn nói. $name
Mở lại tệp của bạn và chỉnh sửa mã PHP chứa nó để nó trông như thế này: name.php
PHP-GET-Vệ sinh
<?php
$name = $_GET['name'];
echo 'Welcome to our website, ' .
htmlspecialchars($name, ENT_QUOTES, 'UTF-8') . '!';
?>
Có rất nhiều điều đang diễn ra trong mã này, vì vậy hãy để tôi chia sẻ nó cho bạn. Dòng đầu tiên giống như trước đây, gán cho giá trị của phần tử từ mảng. Nhưng tuyên bố theo sau nó là rất khác nhau. Trong khi trước đây chúng ta chỉ đơn giản chuyển biến, trần trụi vào câu lệnh, phiên bản mã này sử dụng hàm PHP tích hợp để thực hiện chuyển đổi quan trọng. $name  'name'  $_GET  echo  $name  echo  htmlspecialchars
Hãy nhớ rằng, lỗ hổng bảo mật xảy ra bởi vì, trong , mã HTML trong biến đượ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. Điều gì làm chuyển đổi các ký tự HTML đặc biệt của Viking, giống như và thành các thực thể ký tự HTML như thế nào , và điều đó ngăn không cho chúng được hiểu là mã HTML bởi trình duyệt. Tôi sẽ chứng minh điều này cho bạn trong giây lát. name.php  $name  htmlspecialchars  <  >  &lt;  &gt;
Đầu tiên, chúng ta hãy xem xét kỹ hơn về mã mới này. Cuộc gọi đến hàm là ví dụ đầu tiên trong cuốn sách này về hàm PHP có nhiều hơn một đối số. Đây là hàm gọi tất cả: htmlspecialchars
htmlspecialchars($name, ENT_QUOTES, 'UTF-8')
Đối số đầu tiên là biến (văn bản sẽ được chuyển đổi). Đối số thứ hai là PHP thường xuyên . (A PHP liên tục giống như một biến mà giá trị của bạn không thể thay đổi. Không giống như các biến, hằng số không bắt đầu với một dấu đô la. PHP đi kèm với một số được xây dựng trong các hằng số như rằng được sử dụng để kiểm soát các hàm dựng sẵn như ./span> , dùng để chuyển đổi các dấu ngoặc đơn và dấu ngoặc kép ngoài các ký tự đặc biệt khác. Tham số thứ ba là chuỗi , cho PHP biết mã hóa ký tự nào sẽ sử dụng để diễn giải văn bản bạn đưa ra nó.) $name  ENT_QUOTES  htmlspecialchars  ENT_QUOTES  htmlspecialchars  'UTF-8'

Mã hóa văn bản

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 thẻ meta sau gần đầu trang:
<meta charset="utf-8">
Thẻ này cho trình duyệt nhận trang này 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 loạt các số và số 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 http://www.sitepoint.com/article/guide-web-character-encoding/ .)
Trong một vài trang, chúng ta sẽ đến phần về Biến Vượt qua 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 ngàn ký tự nước ngoài mà trang web của bạn sẽ không thể xử lý.
Thật không may, nhiều hàm dựng sẵn của PHP, chẳng hạn như , 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. Do đó, bạn cần cho họ biết bạn đang sử dụng UTF-8 khi sử dụng các chức năng này. htmlspecialchars
Nếu bạn có thể, bạn cũng nên nói với 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ỉ được yêu cầu 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ư mật ong) vào mã HTML hoặc PHP của bạn. Mã trong cuốn sách này chơi an toàn và sử dụng các tham chiếu thực thể HTML (ví dụ: cho một trích dẫn bên phải cong), sẽ hoạt động bất kể. &rsquo;
Mở trong trình duyệt của bạn và nhấp vào liên kết bây giờ trỏ đến cập nhật của bạn Một lần nữa, bạn sẽ thấy thông báo về Chào mừng đến với trang web của chúng tôi, Kevin! Như bạn đã làm trước đây, sửa đổi URL để bao gồm và các thẻ xung quanh tên: name.html  name.php  <b>  </b>
http://192.168.10.10/name.php?name=<b>Kevin</b>
Khi bạn nhấn Enter lần này, thay vì tên được in đậm trong trang, bạn sẽ thấy văn bản thực tế mà bạn đã nhập như thể hiện trong hình ảnh sau:
Nó chắc chắn là xấu, nhưng nó an toàn!
Nó chắc chắn là xấu, nhưng nó an toàn!
Nếu bạn xem mã nguồn của trang, bạn có thể xác nhận rằng hàm đã thực hiện công việc của nó và chuyển đổi các ký tự và ký tự thành các tham chiếu và thực thể 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ẽ hiển thị vô hại dưới dạng văn bản thuần túy trên trang. htmlspecialchars  <  >  &lt;  &gt;
Chúng tôi sẽ sử dụng rộng rãi chức năng trong suốt cuốn sách này để bảo vệ chống lại lỗ hổng bảo mật này. Không cần phải lo lắng quá nhiều nếu bạn gặp khó khăn trong việc nắm bắt các chi tiết về cách sử dụng nó chỉ trong một phút. 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. Hiện tại, chúng ta hãy xem xét một số cách nâng cao hơn để chuyển các giá trị cho các tập lệnh PHP khi chúng ta yêu cầu chúng. htmlspecialchars
Truyền một biến duy nhất trong chuỗi truy vấn là tốt, nhưng hóa ra bạn có thể truyền nhiều hơn một giá trị nếu bạn 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 của bạn và thay đổi liên kết để trỏ đến với chuỗi truy vấn phức tạp hơn này: name.html  name.php
<a href="name.php?firstname=Kevin&amp;lastname=Yank">
Hi, I&rsquo;m Kevin Yank!</a>
Lần này, liên kết của chúng tôi vượt qua hai biến: và Các biến được tách ra trong chuỗi truy vấn bằng ký hiệu ( , mà nên được viết như sau trong HTML-vâng, thậm chí trong một URL liên kết! ... mặc dù, nếu bạn sử dụng sai , trình duyệt sẽ chủ yếu là sửa chữa nó cho bạn). Bạn có thể vượt qua nhiều biến số hơn bằng cách tách từng cặp tiếp theo với dấu và. firstname  lastname  &  &amp;  &  name=value
Như trước đây, chúng ta có thể sử dụng hai giá trị biến trong tệp của mình: name.php
PHP-GET-TwoVars
$firstName = $_GET['firstname'];
$lastName = $_GET['lastname'];
echo 'Welcome to our website, ' .
htmlspecialchars($firstName, ENT_QUOTES, 'UTF-8') . ' ' .
htmlspecialchars($lastName, ENT_QUOTES, 'UTF-8') . '!';
?>
Các tuyên bố đang trở thành khá đáng kể bây giờ, nhưng nó vẫn nên có ý nghĩa với bạn. Sử dụng một loạt các chuỗi nối ( ), nó tạo ra Chào mừng bạn đến với trang web của chúng tôi, theo sau là giá trị (được tạo an toàn để hiển thị bằng cách sử dụng ), một khoảng trắng, giá trị của (một lần nữa, được xử lý ) và cuối cùng là dấu chấm than. echo  .  $firstName  htmlspecialchars  $lastName  htmlspecialchars
Kết quả trông như thế này:
Lời chào mừng vang vọng
Lời chào mừng vang vọng
Đây là tất cả 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ự của chúng tôi, nơi người dùng có thể nhập thông tin tùy ý và xử lý bằng PHP. Để tiếp tục với ví dụ về thông điệp 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à để nó xuất hiện trong trang kết quả. Để cho phép người dùng nhập giá trị, chúng tôi sẽ cần sử dụng biểu mẫu HTML.

Biến các biến trong các hình thức

Xé liên kết ra và thay thế nó bằng mã HTML này để tạo biểu mẫu: name.html
PHP-GET-Form
<form action="name.php" method="get">
<label for="firstname">First name:</label>
<input type="text" name="firstname" id="firstname">
<label for="lastname">Last name:</label>
<input type="text" name="lastname" id="lastname">
<input type="submit" value="GO">
</form>
Đây là cách trình duyệt hiển thị biểu mẫu được tạo từ mã này:
Các hình thức như nó xuất hiện trong một trình duyệt
Các hình thức như nó xuất hiện trong một trình duyệt

Thêm một số CSS

Tôi đã thêm một số CSS vào biểu mẫu (có sẵn 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ỳ dạng nào trong định dạng ngắt dòng đầu vào nhãn. Tôi sẽ đưa tệp CSS này vào bất kỳ trang nào có chứa biểu mẫu. form.css
Vì đây là một cuốn sách về PHP và MySQL, tuy nhiên, tôi sẽ không đi sâu vào chi tiết về cách CSS hoạt động. Hãy xem SitePoint [ The CSS3 Anthology để đượ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 ta đã xem trong phần Biến đổi qua đường trong phần Liên kết ở trên (với chuỗi truy vấn), ngoại trừ 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ự động tải và thêm các biến và giá trị của chúng vào chuỗi truy vấn cho bạn. Nó lấy tên của các biến từ các thuộc tính tên của đầu vào và lấy các giá trị từ văn bản được người dùng nhập vào các trường văn bản. firstname=Kevin&amp;lastname=Yank  name.php  type="text"
Các thuộc tính của thẻ hình thức được sử dụng để cho trình duyệt làm thế nào để gửi các biến và giá trị của họ cùng với yêu cầu. Một giá trị (như được sử dụng ở trên) làm cho chúng được truyền qua chuỗi truy vấn (và xuất hiện trong mảng PHP PHP ), nhưng có một cách khác. Nó có thể là không mong muốn, hoặc thậm chí là không khả thi về mặt kỹ thuật để có các giá trị xuất hiện trong chuỗi truy vấn. Điều gì xảy ra nếu chúng tôi bao gồm một yếu tố textarea trong biểu mẫu, để cho phép người dùng nhập một lượng lớn văn bản? Một URL có chuỗi truy vấn chứa một số đoạn văn bản sẽ dài một cách lố bịch và có thể vượt quá độ dài tối đa cho một URL trong các trình duyệt ngày nay. Thay thế là để trình duyệt truyền thông tin vô hình, đằng sau hậu trường. method  get  name.html  $_GET
Chỉnh sửa tập tin 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 : name.html  post
<form action="name.php" method="post">
<label for="firstname">First name:</label>
<input type="text" name="firstname" id="firstname">
<label for="lastname">Last name:</label>
<input type="text" name="lastname" id="lastname">
<input type="submit" value="GO">
</form>
Giá trị mới này cho thuộc tính phương thức hướng dẫn trình duyệt gửi các biến biểu mẫu một cách vô hình như một phần của yêu cầu trang, thay vì nhúng chúng vào chuỗi truy vấn của URL.
Vì chúng tôi không còn gửi các biến như một phần của chuỗi truy vấn, chúng sẽ ngừng xuất hiện trong mảng PHP 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 hình thức được đăng tải của : Do đó, chúng tôi phải sửa đổi để lấy các giá trị từ mảng mới này: $_GET  $_POST  name.php
PHP-POST-Form
<?php
$firstname = $_POST['firstname'];
$lastname = $_POST['lastname'];
echo 'Welcome to our website, ' .
htmlspecialchars($firstname, ENT_QUOTES, 'UTF-8') . ' ' .
htmlspecialchars($lastname, ENT_QUOTES, 'UTF-8') . '!';
?>
Đây là trang kết quả trông như thế nào khi mẫu mới này được gửi:
Trang kết quả sau khi biểu mẫu được gửi
Trang kết quả sau khi biểu mẫu được gửi
Các hình thức là chức năng giống hệt như trước đây. Sự 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 các giá trị nhạy cảm 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à 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 kết quả từ việc gửi biểu mẫu, dấu trang đó sẽ vô dụng, vì nó thiếu các giá trị được gửi. Điều này, tình cờ, 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 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 thuật ngữ tìm kiếm được chứa trong URL.

NHẬN hay BÀI VIẾT?

Theo nguyên tắc thông thường, bạn chỉ nên sử dụng biểu mẫu GET nếu, khi biểu mẫu được gửi, không có gì trên máy chủ thay đổi đối với các ứng dụng như khi bạn yêu cầu danh sách kết quả tìm kiếm. Vì các thuật ngữ tìm kiếm nằm trong URL, người dùng có thể đánh dấu trang kết quả tìm kiếm và quay lại nó 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 hoặc cơ sở dữ liệu được cập nhật hoặc bản ghi được chèn, bạn nên sử dụng POST. Lý do chính cho điều này là nếu người dùng đánh dấu trang (hoặc nhấn trong trình duyệt của họ) thì nó sẽ không kích hoạt lại lần gửi biểu mẫu và có khả năng tạo một bản ghi trùng lặp. back
Điều đó bao gồm những điều cơ bản về việc sử dụng các biểu mẫu để tạo ra sự tương tác người dùng thô sơ 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.

Giấu các đường may

Bây giờ bạn đã có 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 một phần mở rộng tên tệp và đưa mã PHP vào đó để tạo nội dung trang một cách nhanh chóng. Không tệ cho một ngày làm việc! .php
Tuy nhiên, trước khi chúng ta tiến xa hơn, tôi muốn dừng lại và đưa ra một cái nhìn quan trọng về các ví dụ chúng ta đã thảo luận cho đến nay. Giả sử mục tiêu của bạn là tạo ra các trang web điều khiển cơ sở dữ liệu theo 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.
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 cấp độ mới bắt đầu, mang lại cho họ một sự đánh bóng chuyên nghiệp nhất định. Tôi sẽ dựa vào các 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, dù ví dụ đơn giản đến đâu, bạn có thể cảm thấy tin tưởng vào chất lượng sản phẩm bạn đang phân phối.

Mẫu PHP

Trong các ví dụ đơn giản mà chúng ta đã thấy cho đến nay, việc chèn mã PHP trực tiếp vào các trang HTML của bạn là một cách tiếp cận hợp lý. Tuy nhiên, khi số lượng mã PHP đi vào 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ó kiểm soát.
Đặ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 am hiểu, thông thái về PHP, việc có các khối mã PHP khó hiểu xen kẽ với HTML là một công thức cho 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 lỗi mà họ sẽ không thể sửa.
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 cho phần lớn HTML không bị ô nhiễm bởi mã PHP.
Chìa khóa để làm điều này là câu lệnh PHP Với một câu lệnh, bạn có thể 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. Để cho bạn thấy cách thức hoạt động của nó, chúng ta hãy xây dựng lại số đếm vòng tròn thành mười ví dụ vòng lặp mà chúng ta đã xem xét trước đó. include  include  for
Bắt đầu bằng cách tạo một tệp mới , trong thư mục này. Mở tệp để chỉnh sửa và nhập mã này: count.php
<?php
$output = '';
for ($count = 1; $count <= 10; $count++) {
$output .= $count . ' ';
}
include 'count.html.php';
Vâng, đó là mã hoàn chỉnh cho tập tin này. Nó không chứa mã HTML nào. Các vòng lặp nên quen thuộc đối với bạn bây giờ, nhưng hãy để tôi chỉ ra những phần thú vị của mã này: for
  • Thay vì lấy ra các số từ 1 đến 10, tập lệnh này sẽ thêm các số này vào một biến có tên Do đó, khi bắt đầu tập lệnh này, chúng tôi đặt biến này để chứa một chuỗi rỗng. echo  $output
  • Dòng thêm mỗi số (theo sau là khoảng trắng) vào cuối biến. Các nhà điều hành mà bạn nhìn thấy ở đây là một cách viết tắt của việc thêm một giá trị đến hết một biến chuỗi đang tồn tại, bằng cách kết hợp các toán tử nối phân và chuỗi thành một. Phiên bản tay dài của dòng này là , nhưng toán tử giúp bạn tiết kiệm một số thao tác gõ. $output .= $count . ' ';  $output  .=  $output = $output . $count . ' ';  .=
  • Câu lệnh hướng dẫn PHP thực thi nội dung của tệp tại vị trí này (Bên ngoài cuốn sách này, bạn sẽ thường thấy được mã hóa bằng dấu ngoặc đơn bao quanh tên tệp, như thể là một hàm giống hoặc khác với trường hợp này. dấu ngoặc đơn, khi được sử dụng, chỉ dùng để làm phức tạp biểu thức tên tệp và do đó được tránh trong cuốn sách này. Cũng giống như vậy , một lớp lót phổ biến khác.) Bạn có thể nghĩ câu lệnh như một loại sao chép và dán . Bạn sẽ nhận được kết quả tương tự bằng cách mở ra , sao chép nội dung và dán chúng vào , ghi đè lên dòng. include  count.html.php  include  include  date  htmlspecialchars  echo  include  count.html.php  count.php  include
  • Cuối cùng, bạn có thể nhận thấy rằng tệp không kết thúc bằng một khớp với phần mở Bạn có thể đặt nó vào nếu bạn thực sự muốn, nhưng nó không cần thiết. Nếu một tệp PHP kết thúc bằng mã PHP, thì không cần phải chỉ ra mã đó kết thúc ở đâu; phần cuối của tập tin sẽ làm điều đó cho bạn. Những bộ não lớn của thế giới PHP thường thích loại bỏ nó khỏi phần cuối của các tệp như thế này chỉ chứa mã PHP. ?>  <?php
Vì dòng cuối cùng của tệp này bao gồm tệp, bạn nên tạo dòng tiếp theo: count.html.php
PHP-Count-Template
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Counting to Ten</title>
</head>
<body>
<p>
<?php echo $output; ?>
</p>
</body>
</html>
Tệp này gần như hoàn toàn là HTML đơn giản, ngoại trừ một dòng xuất giá trị của biến. Đây là cùng một biến được tạo bởi tập tin. $output  $output  index.php
Những gì chúng tôi đã tạo ở đây là một mẫu PHP: một trang HTML chỉ có các đoạn mã PHP rất nhỏ chèn các giá trị được tạo động vào một trang HTML tĩnh khác. Thay vì nhúng mã PHP phức tạp tạo ra các giá trị đó trong trang, chúng tôi đặt mã để tạo các giá trị trong tập lệnh PHP riêng biệt trong trường hợp này. index.php
Sử dụng các mẫu PHP như thế này cho phép bạn bàn giao các mẫu của mình cho các nhà thiết kế am hiểu HTML 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 Tuy nhiên, đối với máy chủ web của bạn, đây vẫn là các tệp; các hậu tố đóng vai trò như một lời nhắc nhở hữu ích mà những tập tin này chứa cả HTML và PHP mã. .html.php  .php  .html.php

Quan ngại về an ninh

Một vấn đề với việc tách mã HTML và PHP thành các tệp khác nhau là ai đó có khả năng có thể chạy mã mà không cần có nó từ một tệp PHP tương ứng. Đây không phải là một vấn đề lớn, nhưng bất cứ ai cũng có thể truy cập trực tiếp. Nếu bạn nhập 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 : . .html.php  include  count.html.php  http://192.168.10.10/count.html.php  Notice: Undefined variable: output in /home/vagrant/Code/Project/public/count.html.php on line 9
Tốt hơn hết là đừng để mọi người chạy mã theo cách 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ọ bỏ 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 truy cập. Ví dụ, hãy xem xét mã sau đây:
if ($_POST['password'] == 'secret') {
include 'protected.html.php';
}
Nhìn vào mã này, có vẻ như bạn cần gửi một biểu mẫu và nhập vào hộp mật khẩu để xem nội dung được bảo vệ Tuy nhiên, nếu ai đó có thể điều hướng trực tiếp đến và xem nội dung của trang, điều đó sẽ khiến việc kiểm tra bảo mật trở nên dư thừa. Có các vấn đề bảo mật tiềm năng khác được giới thiệu bằng cách 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. Tránh các vấn đề bảo mật như thế này là 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 với thư mục. secret  protected.html.php  protected.html.php  public
Bạn có thể đã tự hỏi trước đó tại sao chúng tôi tạo một thư mục và sau đó viết tất cả các tệp của chúng tôi vào thư mục bên trong 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 có thể truy cập được thông qua một URL (bằng cách ai đó nhập tên tệp vào trình duyệt web của họ). Project  public  Project  public
Các lệnh có thể được tinh chỉnh để bao gồm các file từ thư mục khác . Trong trường hợp của chúng tôi, thư mục đó sẽ chuyển đến thư mục chứa các tệp chúng tôi đã làm việc cho đến nay. include  Project
Vì vậy, câu hỏi là, khi tệp bao gồm trong một thư mục khác , làm thế nào một tập lệnh PHP tìm thấy nó? Phương pháp rõ ràng nhất là chỉ định vị trí của tệp bao gồm là một đường dẫn tuyệt đối. Đây là giao diện của máy chủ Windows:
<?php include 'C:/Program Files/Apache Software Foundation/Apache2.2/protected.html.php'; ?>
Và đây là giao diện của nó khi sử dụng hộp Cải tiến Homestead:
<?php include '/home/vagrant/Code/Project/protected.html.php'; ?>
Mặc dù phương pháp này sẽ hoạt động, nhưng nó không 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. 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 này đặc biệt quan trọng vì nhiều nhà phát triển sẽ xây dựng một trang web trên một máy chủ, sau đó triển khai công khai trên một máy chủ khác. Đ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ể. Thậm chí nếu bạn làm có sự sang trọng của làm việc trên một máy chủ duy nhất, bạn sẽ được đá chính mình nếu bạn đã bao giờ cần phải di chuyển trang web của bạn vào một ổ đĩa / thư mục trên máy chủ đó.
Một phương pháp tốt hơn là sử dụng một đường dẫn tương đối . Đó là, vị trí của một tập tin liên quan đến tập tin hiện tại. Khi bạn sử dụng đây thực sự là một đường dẫn tương đối , sẽ được bao gồm từ cùng thư mục với tập lệnh đã được thực thi. include 'count.html.php'  count.html.php
Để bao gồm một tệp từ thư mục trên , bạn có thể sử dụng mã sau đây:
include '../count.html.php';
 ../ bảo 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 trong thư mục thay vì thư mục. count.html.php  Project  public
Đi trước và di chuyển lên một cấp vào thư mục và sửa đổi để tham chiếu vị trí mới: count.html.php  Project  count.php
PHP-Count-Template-Secured
<?php
$output = '';
for ($count = 1; $count <= 10; $count++) {
$output .= $count . ' ';
}
include '../count.html.php';
Nếu bạn chạy mã ở trên, nó sẽ hoạt động. Nhưng có một vấn đề tiềm ẩn khi bạn bao gồm các tệp theo cách này. Đường dẫn tương đối liên quan đến tập lệnh đã được chạy, không phải cho mỗi tệp.
Đó là, nếu bạn mở ra và thêm dòng bạn sẽ được bao gồm từ thư mục. Tuy nhiên, đường dẫn có liên quan đến một thứ 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ữ. Vì vậy, chạy từ thực tế sẽ cố gắng tải từ thư mục! Project/count.html.php  include 'count2.html.php';  count2.html.php  Project  include 'count2.html.php';  count.html.php  count2.html.php  public
Thư mục làm việc hiện tại được đặt ở đầu tập lệnh và áp dụng cho tất cả các câu lệnh, bất kể chúng nằm trong tập tin 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 cách sử dụng hàm. include  chdir()
Vì điều này, chúng tôi không thể dựa vào điều này:
include '../count.html.php';
Nó sẽ hoạt động, nhưng nếu thư mục bị thay đổi, hoặc chính nó là một tệp bao gồm, nó có thể không có kết quả mà chúng ta mong đợi. count.php
Để khắc phục điều này, chúng tôi thực sự cần phải sử dụng các đường dẫn tương đối. May mắn thay, PHP cung cấp một hằng số được gọi (đó là hai ký tự gạch dưới, trước và sau từ TRỰC TIẾP ) sẽ luôn chứa đường dẫn chứa tệp hiện tại . __DIR__
Ví dụ: bạn có thể tạo một tệp được gọi trong thư mục với mã sau: dir.php  public
echo __DIR__;
Điều này sẽ hiển thị , đó là đường dẫn đầy đủ đến thư mục chứa Để đọc từ thư mục trên , có thể kết hợp toán tử và hằng số: /home/vagrant/Code/Project/public  dir.php  count.html.php  public  /../  __DIR__
include __DIR__ . '/../count.html.php';
Điều này bây giờ sẽ bao gồm các tập tin Đó là, PHP sẽ xem trong thư mục, sau đó đi lên một cấp và bao gồm . /home/vagrant/Code/Project/public/../count.html  public  Project  count.html.php
Cách tiếp cận này sẽ hoạt động trên bất kỳ máy chủ nào, bởi vì 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 thư mục làm việc hiện tại đang thay đổi Tôi sẽ sử dụng phương pháp này để bao gồm các tệp trong suốt cuốn sách này. __DIR__
Từ giờ trở đi, chúng tôi sẽ chỉ ghi các tệp vào thư mục 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 sẽ chứa bất kỳ tập lệnh PHP nào mà người dùng cần truy cập trực tiếp cùng với bất kỳ tệp hình ảnh, JavaScript và CSS nào được yêu cầu bởi trình duyệt. Bất kỳ tệp nào chỉ được tham chiếu bởi một câu lệnh sẽ được đặt bên ngoài thư mục để người dùng không thể truy cập trực tiếp vào chúng. public  public  include  public
Khi cuốn sách tiếp tục, tôi sẽ giới thiệu cho bạn một số loại tệp đính kèm khác nhau Để giữ mọi thứ ngăn nắp, việc lưu trữ các loại tệp bao gồm trong các thư mục khác nhau là điều hợp lý. Chúng tôi sẽ lưu trữ các tệp mẫu (có phần mở rộng) bên trong một thư mục được gọi trong thư mục. Sau đó chúng ta có thể tham chiếu chúng trong một tuyên bố bằng cách sử dụng . .html.php  templates  Project  include  include __DIR__ . '../templates/file.html.php';

Nhiều mẫu, một bộ điều khiển

Điều tuyệt vời khi sử dụng các câu lệnh để 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 trong một tập lệnh PHP, cũng như để nó hiển thị các mẫu khác nhau trong các trường hợp khác nhau! include  include
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 một số mẫu PHP để điền và gửi lại thường được gọi là bộ điều khiển . Một bộ điều khiển chứa logic điều khiển mẫu nào được gửi tới trình duyệt.
Chúng ta hãy xem lại một ví dụ nữa từ trước đó trong chương này: biểu mẫu chào mừng nhắc nhở khách truy cập cho tên và họ.
Chúng ta sẽ bắt đầu với mẫu PHP cho mẫu. Đối với điều này, chúng ta chỉ có thể sử dụng lại các tập tin chúng ta đã tạo trước đó. Tạo một thư mục bên trong nếu bạn chưa có và lưu một bản sao được gọi vào thư mục này. Mã duy nhất bạn cần thay đổi trong tệp này là thuộc tính hành động của thẻ biểu mẫu: name.html  templates  Project  name.html  form.html.php
Trình điều khiển biểu mẫu PHP
<html>
<head>
<title>Enter your name</title>
<link rel="stylesheet" href="form.css" />
<meta charset="utf-8">
</head>
<body>
<form action="" method="post">
<label for="firstname">First name:</label>
<input type="text" name="firstname" id="firstname">
<label for="lastname">Last name:</label>
<input type="text" name="lastname" id="lastname">
<input type="submit" value="GO">
</form>
</body>
</html>
Như bạn có thể thấy, chúng tôi để trống thuộc tính. Đ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 được từ mạng trong trường hợp này, URL của bộ điều khiển có chứa tệp mẫu này. action
Chúng ta hãy xem bộ điều khiển cho ví dụ này. Tạo một bên trong thư mục chứa mã sau đây: index.php  public
<?php
if (!isset($_POST['firstname'])) {
include __DIR__ . '/../templates/form.html.php';
} else {
$firstName = $_POST['firstname'];
$lastName = $_POST['lastname'];
if ($firstName == 'Kevin' && $lastName == 'Yank') {
$output = 'Welcome, oh glorious leader!';
} else {
$output = 'Welcome to our website, ' .
htmlspecialchars($firstName, ENT_QUOTES, 'UTF-8') . ' ' .
htmlspecialchars($lastName, ENT_QUOTES, 'UTF-8') . '!';
}
include __DIR__ . '/../templates/welcome.html.php';
}
Mã này thoạt nhìn khá quen thuộc. Nó rất giống với kịch bản chúng tôi đã viết trước đó. Hãy để tôi giải thích sự khác biệt: name.php
  • Nhiệm vụ đầu tiên của bộ điều khiển là quyết định xem yêu cầu hiện tại có phải là đệ trình của biểu mẫu hay không. Bạn có thể làm điều này bằng cách kiểm tra xem yêu cầu có chứa biến không. Nếu có, PHP sẽ lưu trữ giá trị trong . form.html.php  firstname  $_POST['firstname']
     isset là một hàm PHP tích hợp sẽ cho bạn biết nếu một biến cụ thể (hoặc phần tử mảng) đã được gán một giá trị hay chưa. Nếu có giá trị, sẽ đúng. Nếu không được đặt, sẽ là sai. $_POST['firstname']  isset($_POST['firstname'])  $_POST['firstname']  isset($_POST['firstname'])
    Để dễ đọc, tôi muốn đặt mã gửi biểu mẫu trong trình điều khiển của mình trước. Chúng tôi cần điều này tuyên bố để kiểm tra xem là không thiết lập. Để làm điều này, chúng tôi sử dụng toán tử không ( ). Bằng cách đặt toán tử này trước tên của hàm, bạn đảo ngược giá trị mà hàm trả về từ từ đúng thành sai hoặc từ sai thành đúng. if  $_POST['firstname']  !
    Do đó, nếu yêu cầu không chứa biến, thì nó sẽ trả về true và phần thân của câu lệnh sẽ được thực thi. firstname  !isset($_POST['firstname'])  if
  • Nếu yêu cầu không phải là đệ trình biểu mẫu, bộ điều khiển bao gồm tệp để hiển thị biểu mẫu. form.html.php
  • Nếu yêu cầu  một biểu mẫu, thay vào đó , phần thân của câu lệnh sẽ được thực thi. else
    Mã này kéo và các biến ra khỏi mảng, và sau đó tạo thông báo chào mừng thích hợp cho tên được gửi. firstname  lastname  $_POST
  • Thay vì ing thông điệp chào mừng, bộ điều khiển lưu thông điệp chào mừng trong một biến có tên . echo  $output
  • Sau khi tạo thông báo chào mừng thích hợp, bộ điều khiển bao gồm mẫu, sẽ hiển thị thông báo chào mừng đó. welcome.html.php
Tất cả chỉ còn lại là ghi vào thư mục. Đây là: welcome.html.php  templates
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Form Example</title>
</head>
<body>
<p>
<?php echo $output; ?>
</p>
</body>
</html>
Đó là nó! Bật trình duyệt của bạn và chỉ vào nó Bạn sẽ được nhắc tên của mình và khi bạn gửi biểu mẫu, bạn sẽ thấy thông báo chào mừng thích hợp. URL phải giữ nguyên trong suốt quá trình này. http://192.168.10.10/index.php
Bạn sẽ nhận thấy tôi yêu cầu bạn đặt tên cho tệp thay vì hoặc tương tự. Lý do tôi sử dụng là vì nó có ý nghĩa đặc biệt. được gọi là một chỉ mục thư mục . Nếu bạn không chỉ định tên tệp khi bạn truy cập URL trong trình duyệt của mình, máy chủ sẽ tìm tệp có tên và hiển thị tệp đó. Hãy thử gõ vào trình duyệt của bạn và bạn sẽ thấy trang chỉ mục. index.php  name.php  index.php  index.php  index.php  http://192.169.10.10

Post a Comment

Mới hơn Cũ hơn