tek4

Xử lý form trong PHP

by - September. 21, 2021
Kiến thức
Học
<p>Biểu mẫu l&agrave; một kh&aacute;i niệm quan trọng trong khi lập tr&igrave;nh. Trong b&agrave;i viết n&agrave;y, ta sẽ c&ugrave;ng t&igrave;m hiểu về c&aacute;ch xử l&yacute; form trong PHP c&ugrave;ng với v&iacute; dụ dẫn chứng.</p> <p>C&aacute;c biểu mẫu hay Form được sử dụng để gửi th&ocirc;ng tin của người d&ugrave;ng đến m&aacute;y chủ v&agrave; trả về kết quả trở lại tr&igrave;nh duyệt. V&iacute; dụ, nếu ta muốn biết th&ocirc;ng tin chi tiết về kh&aacute;ch truy cập v&agrave;o trang web của m&igrave;nh v&agrave; thu thập c&aacute;c th&ocirc;ng tin hoặc phản hồi từ họ, ta c&oacute; thể thu thập th&ocirc;ng tin người d&ugrave;ng bằng c&aacute;ch xử l&yacute; biểu mẫu. Ng&ocirc;n ngữ PHP cung cấp c&aacute;c phương thức được sử dụng để thao t&aacute;c với c&aacute;c biểu mẫu.</p> <h1>Xử l&yacute; form trong PHP</h1> <h2>Tạo một biểu mẫu HTML đơn giản</h2> <p>V&iacute; dụ dưới đ&acirc;y sẽ hiển thị một biểu mẫu HTML đơn giản với một trường nhập đầu v&agrave;o cho t&ecirc;n của người d&ugrave;ng v&agrave; n&uacute;t gửi đi biểu mẫu như sau.</p> <pre class="EnlighterJSRAW" data-enlighter-language="html">&lt;html&gt; &lt;body&gt; &lt;form action="index.php" method="post"&gt; Ten nguoi dung: &lt;input type="text" name="name"&gt;&lt;br&gt; &lt;input type="submit"&gt; &lt;/form&gt; &lt;/body&gt; &lt;/html&gt;</pre> <p>Khi người d&ugrave;ng điền v&agrave;o biểu mẫu v&agrave; nhấp v&agrave;o n&uacute;t gửi (submit), dữ liệu trong biểu mẫu sẽ được gửi tới một tệp c&oacute; đu&ocirc;i l&agrave; PHP c&oacute; t&ecirc;n index.php để xử l&yacute;. Dữ liệu của biểu mẫu được gửi bằng phương thức HTTP POST.</p> <p><strong><span style="background-color: #ffff00;">Ch&uacute; &yacute;: C&aacute;c biến to&agrave;n cục trong PHP bao gồm $ _GET v&agrave; $ _POST được sử dụng để thu thập dữ liệu của biểu mẫu.</span></strong></p> <p>Để hiển thị dữ liệu đ&atilde; gửi, ta c&oacute; thể l&agrave;m như trong v&iacute; dụ b&ecirc;n dưới.</p> <p>V&iacute; dụ:</p> <pre class="EnlighterJSRAW" data-enlighter-language="php">&lt;html&gt; &lt;body&gt; &lt;form action="index.php" method="post"&gt; Ten nguoi dung: &lt;input type="text" name="name"&gt;&lt;br&gt; &lt;input type="submit"&gt; &lt;/form&gt; Xin men chao &lt;?php echo $_POST["name"]; ?&gt;&lt;br&gt; &lt;/body&gt; &lt;/html&gt;</pre> <p>Kết quả:</p> <pre>Xin men chao Nguyen A</pre> <p>Ta cũng c&oacute; thể sử dụng phương thức HTTP Get như sau.</p> <p>V&iacute; dụ:</p> <pre class="EnlighterJSRAW" data-enlighter-language="html">&lt;html&gt; &lt;body&gt; &lt;form action="index2.php" method="get"&gt; Ten nguoi dung: &lt;input type="text" name="name"&gt;&lt;br&gt; &lt;input type="submit"&gt; &lt;/form&gt; &lt;/body&gt; &lt;/html&gt;</pre> <p>Trong đoạn m&atilde; tr&ecirc;n, ta sẽ gửi th&ocirc;ng tin của biểu mẫu tới một trang kh&aacute;c l&agrave; index2.php để in ra dữ liệu sau khi người d&ugrave;ng nhập th&ocirc;ng tin biểu mẫu.</p> <p>Để in ra dữ liệu, ta sẽ mở file index2.php v&agrave; th&ecirc;m đoạn m&atilde; sau:</p> <pre class="EnlighterJSRAW" data-enlighter-language="php">&lt;html&gt; &lt;body&gt; Xin men chao &lt;?php echo $_GET["name"]; ?&gt;&lt;br&gt; &lt;/body&gt; &lt;/html&gt;</pre> <p>Kết quả sẽ c&oacute; ở trạng index2.php như sau:</p> <pre>Xin men chao Nguyen A</pre> <h2>Sự kh&aacute;c biệt giữa 2 phương thức GET v&agrave; POST</h2> <ul> <li>Cả GET v&agrave; POST đều tạo ra một mảng (v&iacute; dụ: mảng (key1 =&gt; value1, key2 =&gt; value2, key3 =&gt; value3, ...)). Mảng n&agrave;y chứa c&aacute;c cặp kh&oacute;a v&agrave; gi&aacute; trị, trong đ&oacute; c&aacute;c kh&oacute;a l&agrave; t&ecirc;n của biểu mẫu v&agrave; gi&aacute; trị l&agrave; dữ liệu đầu v&agrave;o từ người d&ugrave;ng.</li> <li>Cả GET v&agrave; POST đều được xem l&agrave; c&aacute;c biết $ _GET v&agrave; $ _POST. Đ&acirc;y l&agrave; những biến to&agrave;n cục, c&oacute; nghĩa l&agrave; ch&uacute;ng lu&ocirc;n c&oacute; thể truy cập được, bất kể phạm vi v&agrave; ta c&oacute; thể truy cập ch&uacute;ng từ bất kỳ h&agrave;m, lớp hoặc tệp n&agrave;o m&agrave; kh&ocirc;ng cần phải l&agrave;m g&igrave;.</li> <li>$ _GET l&agrave; một mảng c&aacute;c biến được truyền cho tập lệnh hiện tại th&ocirc;ng qua c&aacute;c tham số URL.</li> <li>$ _POST l&agrave; một mảng c&aacute;c biến được truyền cho tập lệnh hiện tại th&ocirc;ng qua phương thức HTTP POST.</li> </ul> <h2>Khi n&agrave;o sử dụng phương thức GET?</h2> <p>Th&ocirc;ng tin được gửi từ biểu mẫu với phương thức GET được hiển thị cho mọi người (tất cả c&aacute;c t&ecirc;n biến v&agrave; gi&aacute; trị được hiển thị trong URL). GET cũng c&oacute; giới hạn về số lượng th&ocirc;ng tin được gửi. Giới hạn l&agrave; khoảng 2000 k&yacute; tự. Tuy nhi&ecirc;n, v&igrave; c&aacute;c biến được hiển thị trong URL, n&ecirc;n c&oacute; thể lưu lại dấu trang. Điều n&agrave;y c&oacute; thể hữu &iacute;ch trong một số trường hợp. GET c&oacute; thể được sử dụng để gửi dữ liệu kh&ocirc;ng nhạy cảm.</p> <p><strong><span style="background-color: #ffff00;">Ch&uacute; &yacute;: GET kh&ocirc;ng bao giờ n&ecirc;n được sử dụng để gửi mật khẩu hoặc th&ocirc;ng tin nhạy cảm kh&aacute;c.</span></strong></p> <h2>Khi n&agrave;o sử dụng phương thức POST?</h2> <p>Th&ocirc;ng tin được gửi từ biểu mẫu c&oacute; phương thức POST được ẩn đối với những người kh&aacute;c (tất cả c&aacute;c t&ecirc;n v&agrave; gi&aacute; trị đều được nh&uacute;ng trong nội dung của y&ecirc;u cầu HTTP) v&agrave; kh&ocirc;ng c&oacute; giới hạn về lượng th&ocirc;ng tin được gửi. Hơn nữa, POST cũng hỗ trợ chức năng n&acirc;ng cao như hỗ trợ đầu v&agrave;o nhị ph&acirc;n nhiều phần trong khi tải tệp l&ecirc;n m&aacute;y chủ. Tuy nhi&ecirc;n, v&igrave; c&aacute;c biến kh&ocirc;ng được hiển thị trong URL, n&ecirc;n kh&ocirc;ng thể lưu dấu trang. Hầu hết c&aacute;c lập tr&igrave;nh vi&ecirc;n thường sử dụng phương thức POST để gửi dữ liệu biểu mẫu.</p> <h2>Kiểm tra t&iacute;nh hợp lệ của biểu mẫu</h2> <p>Kiểm tra t&iacute;nh hợp lệ của biểu mẫu nhằm x&aacute;c định xem người d&ugrave;ng c&oacute; nhập đ&uacute;ng c&aacute;c trường v&agrave; đ&uacute;ng với c&aacute;c y&ecirc;u cầu m&agrave; một biểu mẫu y&ecirc;u cầu hay kh&ocirc;ng.</p> <p>Trong đoạn m&atilde; sau, ch&uacute;ng ta đ&atilde; th&ecirc;m một số biến mới bao gồm biến $a v&agrave; $b. C&aacute;c biến n&agrave;y sẽ lưu giữ c&aacute;c th&ocirc;ng b&aacute;o lỗi cho c&aacute;c trường bắt buộc. Ch&uacute;ng ta cũng đ&atilde; th&ecirc;m c&acirc;u lệnh if else cho mỗi biến $ _POST. Điều n&agrave;y sẽ kiểm tra xem biến $_POST c&oacute; trống rỗng hay kh&ocirc;ng. Nếu n&oacute; trống rỗng, một th&ocirc;ng b&aacute;o lỗi được lưu trữ trong c&aacute;c biến kh&aacute;c nhau v&agrave; nếu n&oacute; kh&ocirc;ng rỗng, n&oacute; sẽ gửi dữ liệu đầu v&agrave;o của người d&ugrave;ng th&ocirc;ng qua h&agrave;m check().</p> <p>V&iacute; dụ:</p> <pre class="EnlighterJSRAW" data-enlighter-language="php">&lt;!DOCTYPE HTML&gt; &lt;html&gt; &lt;head&gt; &lt;style&gt; .error {color: #FF0000;} &lt;/style&gt; &lt;/head&gt; &lt;body&gt; &lt;?php $a = $b = ""; $name = $email = ""; if ($_SERVER["REQUEST_METHOD"] == "POST") { if (empty($_POST["name"])) { $a = "Xin mời bạn nhập t&ecirc;n!"; } else { $name = check($_POST["name"]); } if (empty($_POST["email"])) { $b = "Xin mời bạn nhập địa chỉ email!"; } else { $email = check($_POST["email"]); } } function check($data) { $data = trim($data); $data = stripslashes($data); $data = htmlspecialchars($data); return $data; } ?&gt; &lt;p&gt;Biểu mẫu&lt;/p&gt; &lt;form method="post" action="&lt;?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?&gt;"&gt; T&ecirc;n người d&ugrave;ng: &lt;input type="text" name="name"&gt; &lt;span class="error"&gt;&lt;?php echo $a;?&gt;&lt;/span&gt; &lt;br&gt;&lt;br&gt; Địa chỉ email: &lt;input type="text" name="email"&gt; &lt;span class="error"&gt;&lt;?php echo $b;?&gt;&lt;/span&gt; &lt;br&gt;&lt;br&gt; &lt;input type="submit" name="submit" value="Submit"&gt; &lt;/form&gt; &lt;?php echo "Th&ocirc;ng tin người d&ugrave;ng:"; echo $name; echo "&lt;br&gt;"; echo $email; echo "&lt;br&gt;"; ?&gt; &lt;/body&gt; &lt;/html&gt;</pre> <p>Trong đoạn m&atilde; tr&ecirc;n, h&agrave;m check() được sử dụng để kiểm tra an to&agrave;n cho c&aacute;c trường nhập đầu v&agrave;o, trong đ&oacute;, ta c&oacute; sử dụng c&aacute;c h&agrave;m kh&aacute;c gồm:</p> <ul> <li>Trim() được sử dụng để loại bỏ c&aacute;c khoảng trắng hoặc c&aacute;c k&yacute; tự kh&aacute;c kh&ocirc;ng cần thiết như xuống d&ograve;ng hay tab l&ugrave;i đầu d&ograve;ng.</li> <li>Stripslashes() được sử dụng để loại bỏ tất cả c&aacute;c k&yacute; tự \ trong chuỗi k&yacute; tự.</li> <li>Htmlspecialchars() được sử dụng để chuyển đổi c&aacute;c k&yacute; tự đặc biệt th&agrave;nh c&aacute;c thực thể HTML. Điều n&agrave;y c&oacute; nghĩa l&agrave; n&oacute; sẽ thay thế c&aacute;c k&yacute; tự HTML như &lt; v&agrave; &gt; bằng &amp; lt; v&agrave; &amp; gt ;. Điều n&agrave;y gi&uacute;p ngăn chặn những kẻ tấn c&ocirc;ng khai th&aacute;c đoạn m&atilde; bằng c&aacute;ch ch&egrave;n m&atilde; HTML hoặc Javascript v&agrave;o c&aacute;c trường của biểu mẫu.</li> <li>Ta c&ograve;n c&oacute; sử dụng biến $ _SERVER ["PHP_SELF"], l&agrave; một biến to&agrave;n cục trả về t&ecirc;n của tệp chứa tập lệnh hiện đang thực thi. Điều n&agrave;y c&oacute; nghĩa l&agrave; $ _SERVER ["PHP_SELF"] sẽ gửi dữ liệu của biểu mẫu trong đoạn m&atilde; b&ecirc;n tr&ecirc;n đến ch&iacute;nh trang đ&oacute;, thay v&igrave; chuyển sang một trang kh&aacute;c.</li> </ul> <p>Tr&ecirc;n đ&acirc;y l&agrave; kh&aacute;i niệm v&agrave; v&iacute; dụ cơ bản về xử l&yacute; form trong PHP. Hy vọng mọi người c&oacute; thể &aacute;p dụng v&agrave;o trong chương tr&igrave;nh của m&igrave;nh. Mọi người h&atilde;y tiếp tục theo d&otilde;i c&aacute;c b&agrave;i tiếp theo v&agrave; cập nhật c&aacute;c b&agrave;i mới nhất tr&ecirc;n <a href="http://tek4.vn">tek4</a> nh&eacute;!</p> <p>P/s: Cảm ơn mọi người!</p>