login form

PHP cơ bản : Tạo form đăng ký, đăng nhập (phần 1)

Đối với những diễn đàn, hay các website thương mại điện tử, web shop,… đều có chức năng đăng ký thành viên, để thành viên có thể có những quyền hạn nhất định nào đó như mua hàng, bình luận bài viết,…Đây là một trong những chức năng quan trọng và gần như là cần phải có đối với các website kể trên. Chính vì thế hôm nay mình chia sẽ đến các bạn bài viết về hướng dẫn tạo form đăng ký và đăng nhập trong lập trình website PHP.
Lưu ý :

Đối với các bạn mới bắt đầu học lập trình PHP các bạn nên gõ theo từng đoạn code để nhớ bài và hiểu vấn đề hơn, đừng copy nguyên đoạn code như vậy sẽ không nắm được lâu kiến thức.
Chuẩn bị :

Để bắt đầu thực hành bài này, các bạn hãy chuẩn bị cho mình những điều cần thiết sau :
– Đã khởi chạy (start) môi trường để lập trình PHP (coi lại bài Hướng dẫn cài đặt môi trường lập trình PHP)
– Chuẩn bị công cụ editor phù hợp để có thể code (các bạn có thể tham khảo bài Giới thiệu về các editor cho nhà phát triển web)

– Trong thư mục gốc của website (ở đây mình dùng wamp nên thư mục gốc sẽ là www, còn đối với các bạn dùng xampp, thì thư mục gốc sẽ là htdocs), các bạn tạo 1 folder đặt tên là my_website để chưa tất cả source code mà mình sẽ hướng dẫn các bạn từng bước làm 1 website hoàn chỉnh bằng ngôn ngữ lập trình PHP từ đây trở về sau.

Trong thư mục my_website , các bạn tạo cho mình cấu trúc thư mục như sau :

thư mục chính php

1. Tạo form đăng ký :

Đầu tiên mình sẽ thiết kế một form đăng ký, đặt tên là register.php, (đặt trong thư mục my_website) bao gồm các trường :
– trường để người dùng nhập nickname
– trường để người dùng nhập mật khẩu
– trường để người dùng nhập họ tên
– trường để người dùng nhập địa chỉ email

<html>
<head>
	<title>kungfuphp - Form đăng ký thành viên</title>
</head>
<body>
	<form action="register.php" method="post">
		<table>
			<tr>
				<td colspan="2">Form dang ky</td>
			</tr>	
			<tr>
				<td>Username :</td>
				<td><input type="text" id="username" name="username"></td>
			</tr>
			<tr>
				<td>Password :</td>
				<td><input type="password" id="pass" name="pass"></td>
			</tr>
			<tr>
				<td>Ho Ten :</td>
				<td><input type="text" id="name" name="name"></td>
			</tr>
			<tr>
				<td>Email :</td>
				<td><input type="text" id="email" name="email"></td>
			</tr>
			<tr>
				<td colspan="2" align="center"><input type="submit" name="btn_submit" value="Dang ky"></td>
			</tr>

		</table>
		
	</form>
</body>
</html>

Chạy đoạn code trên (vào browser gõ đường dẫn http://localhost/my_website/register.php) ta được form đăng ký đơn giản như sau

form đăng ký php

2. Tạo cơ sở dữ liệu lưu trữ

Tiếp đến, ta sẽ thiết kế cơ sở dữ liệu và tạo bảng lưu trữ thông tin người dùng, ở đây mình lấy tên cho database là “kungfuphp” và bảng là “users”. Trong bảng uses sẽ bao gồm các cột

  • id : kiểu int, khóa chính, thuộc tính tự tăng (auto increment)
  • username : tên đăng nhập, kiểu var char, độ dài là 30 kí tự
  • password  : mật khẩu, kiểu var char, độ dài 30 kí tự
  • name : tên người dùng, kiểu var char, độ dài 255 kí tự
  • email : địa chỉ email, kiểu var char, đồ dài 255 kí tự
CREATE DATABASE IF NOT EXISTS `kungfuphp` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci;
USE `kungfuphp`;

CREATE TABLE IF NOT EXISTS `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(30) NOT NULL,
  `password` varchar(30) NOT NULL,
  `name` varchar(255) NOT NULL,
  `email` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

3. Bắt đầu code

a) Tạo kết nối đến mysql để lấy dữ liệu

Để có thể select hoặc insert, update dữ liệu trong database, ta cần phải tạo một giao thức kết nối giữa PHP và Mysql. Ở đây mình sẽ tạo một file mới tên là connection.php, đặt trong thư mục lib và gõ theo như đoạn code dưới đây:

<?php
$server_username = "root";
$server_password = "";
$server_host = "localhost";
$database = 'kungfuphp';

$conn = mysqli_connect($server_host,$server_username,$server_password,$database) or die("không thể kết nối tới database");
mysqli_query($conn,"SET NAMES 'UTF8'");

Ở đoạn code trên, chúng ta dùng phương thức mysqli_connect của PHP để PHP có thể kết nối tới dữ liệu mysql với 3 tham số:

  • $server_host :tên host chưa database, ở đây mình dùng là localhost vì chạy ở máy tính cục bộ, còn khi upload website lên các host khác thì chúng ta có thể thay đổi tham số này cho phù hợp.
  • $server_username  : tên đăng nhập vào database, mặc định ở local là root
  • $server_password ; mật khẩu đăng nhập vào database, mặc định ở local là rỗng

phương thức or die nhằm kiểm tra nếu kết nối thất bại sẽ xuất ra dòng chữ “không thể kết nối tới database”

Gợi ý : Bạn là người mới và muốn tìm hiểu về Bitcoin nhưng không biết bắt đầu từ đâu? Click xem ngay Hướng Dẫn Đầu Tư Bitcoin Cho Người Mới nhé!

phương thức mysqli_query($conn,”SET NAMES ‘UTF8′”) bạn có thể thêm vào hoặc không đều được, đây là phương thức tùy chọn, dành cho trong trường hợp cơ sở dữ liệu của bạn có các kí tự đặc biệt dạng utf-8 thì khi truy vấn hoặc cập nhật dữ liệu sẽ không bị lỗi font chữ

Tiếp đến trong file register.php, bạn cần phải require file connection.php vừa tạo vào bằng cách dùng từ khóa require_once (hoặc include, include_once, require)

require_once("lib/connection.php");

Sau khi đã require_once tập tin connection.php vào, chúng ta đến giai đoạn kiểm tra thông tin đăng ký hợp lệ và lưu dữ liệu vào database, ở đây mình sẽ lấy các thông tin ở form đăng ký đã tạo ở trên bằng phương thức POST, các bạn lưu ý là :

  • Trong thẻ <form> ở trên có phương thức method mình cố tình để sẵn là method=”POST” nên các bạn phải dùng từ khóa $_POST để có thể lấy được thông tin
  • Trong PHP, từ khóa $_POST chỉ lấy được giá trị của thẻ input thông qua thuộc tính name, không phải thẻ id nhé các bạn
  • Ngoài phương thức POST, chúng ta còn có thể sử dụng phương thức GET và sử dụng từ khóa $_GET để lấy dữ liệu
  • Sự khác nhau giữa POST và GET thì mình sẽ nói rõ hơn trong các bài sau 🙂
<?php
	if (isset($_POST["btn_submit"])) {
		//lấy thông tin từ các form bằng phương thức POST
		$username = $_POST["username"];
		$password = $_POST["pass"];
		$name = $_POST["name"];
		$email = $_POST["email"];
		//Kiểm tra điều kiện bắt buộc đối với các field không được bỏ trống
		if ($username == "" || $password == "" || $name == "" || $email == "") {
			echo "bạn vui lòng nhập đầy đủ thông tin";
		}else{
			//thực hiện việc lưu trữ dữ liệu vào db
		}
	}
?>

Ở đoạn code bên trên đây, mình dùng từ khóa isset để kiểm tra button có name là btn_submit đã được click hay chưa, nếu click rồi thì mới bắt đầu lấy thông tin và insert dữ liệu vào database, tranh trường hợp khi load trang, đoạn code thực thi sẽ tự động chạy. Như đã nói ở trên, mình dùng từ khóa $_POST để lấy các thông tin username, password, name, email và kiểm tra nếu 1 trong các field này rỗng thì sẽ xuất ra thông báo là “bạn vui lòng nhập đầy đủ thông tin”, ngược lại sẽ là thực thi việc lưu trữ dữ liệu như sau:

<?php
	if (isset($_POST["btn_submit"])) {
		//lấy thông tin từ các form bằng phương thức POST
		$username = $_POST["username"];
		$password = $_POST["pass"];
		$name = $_POST["name"];
		$email = $_POST["email"];
		//Kiểm tra điều kiện bắt buộc đối với các field không được bỏ trống
		if ($username == "" || $password == "" || $name == "" || $email == "") {
			echo "bạn vui lòng nhập đầy đủ thông tin";
		}else{
			$sql = "INSERT INTO users(
										username,
										password,
										name,
										email
									) VALUES (
										'$username',
										'$password',
										'$name',
										'$email'
									)";
			// thực thi câu $sql với biến conn lấy từ file connection.php
			mysqli_query($conn,$sql);
			echo "chúc mừng bạn đã đăng ký thành công";
		}
	}

?>

Toàn bộ code đầy đủ trong file register.php sẽ như sau :

	<html>
	<head>
		<title>kungfuphp - Form đăng ký thành viên</title>
	</head>
	<body>
		<?php
		require_once("lib/connection.php");
		if (isset($_POST["btn_submit"])) {
  			//lấy thông tin từ các form bằng phương thức POST
  			$username = $_POST["username"];
  			$password = $_POST["pass"];
 			 $name = $_POST["name"];
  			$email = $_POST["email"];
  			//Kiểm tra điều kiện bắt buộc đối với các field không được bỏ trống
			  if ($username == "" || $password == "" || $name == "" || $email == "") {
				   echo "bạn vui lòng nhập đầy đủ thông tin";
  			}else{
  					// Kiểm tra tài khoản đã tồn tại chưa
  					$sql="select * from users where username='$username'";
					$kt=mysqli_query($conn, $sql);

					if(mysqli_num_rows($kt)  > 0){
						echo "Tài khoản đã tồn tại";
					}else{
						//thực hiện việc lưu trữ dữ liệu vào db
	    				$sql = "INSERT INTO users(
	    					username,
	    					password,
	    					name,
						    email
	    					) VALUES (
	    					'$username',
	    					'$password',
						    '$name',
	    					'$email'
	    					)";
					    // thực thi câu $sql với biến conn lấy từ file connection.php
   						mysqli_query($conn,$sql);
				   		echo "chúc mừng bạn đã đăng ký thành công";
					}
									    
					
			  }
	}
	?>
	<form action="register.php" method="post">
		<table>
			<tr>
				<td colspan="2">Form dang ky</td>
			</tr>	
			<tr>
				<td>Username :</td>
				<td><input type="text" id="username" name="username"></td>
			</tr>
			<tr>
				<td>Password :</td>
				<td><input type="password" id="pass" name="pass"></td>
			</tr>
			<tr>
				<td>Ho Ten :</td>
				<td><input type="text" id="name" name="name"></td>
			</tr>
			<tr>
				<td>Email :</td>
				<td><input type="text" id="email" name="email"></td>
			</tr>
			<tr>
				<td colspan="2" align="center"><input type="submit" name="btn_submit" value="Dang ky"></td>
			</tr>

		</table>

	</form>
	</body>
	</html>

Video demo (phóng to lên, chọn chế độ HD 720 xem cho rõ nhé)

Vậy là chúng ta đã thiết kế xong trang register.php cho phép người dùng nhập dữ liệu và lưu trữ vào database. Bài viết cũng khá dài nên mình tạm dừng ở đây, các bạn có thắc mắc gì thì hãy để lại comment bên dưới bài viết nhé. Trong bài tiếp theo mình sẽ nói về việc kiểm tra thông tin có trong database và tạo form đăng nhập. Các bạn nhớ đón xem, thân !

Đợi chút, bạn có muốn tự tay tạo thiết kế website bằng HTML, CSS, Bootstrap cho riêng mình ? Nếu có thì xem tại đây nhé

Nguon : kungfuphp.com

Có ích

tạo form upload trong php

Tạo phân quyền cho website PHP – Tạo website bằng PHP (Phần 8)

Đi qua một loạt 7 phần trong chuỗi seri Tạo website bằng PHP, trong phần …

99 bình luận

  1. cho e hỏi lỗi này sửa như nào ạ
    Not FoundThe requested URL was not found on this server.
    Apache/2.4.53 (Win64) OpenSSL/1.1.1n PHP/7.4.29 Server at localhost Port 80

  2. Cảm ơn anh Hiếu đã cống hiến và chia sẻ các kiến thức bổ ích cho những người đang học thiết kế website nói chung và sinh viên IT như em nói riêng. Em chúc anh thành công trong công việc và sức khỏe thật tốt để giúp nhiều người trong việc tự học. Em cảm ơn anh !

  3. hóng a làm chức năng đăng xuất ạ

  4. Anh ơi, anh giúp em tạo from đăng ký môn học giúp em với

  5. anh Hiếu cho em hỏi chút, khi e nhập thì tất cả các trường ngoại trừ trường “email ” nó không lưu là do sao ạ? em có kiểm tra câu lệnh sql thì ok rồi.

  6. Warning: mysqli_num_rows() expects parameter 1 to be mysqli_result, boolean given in /storage/sdcard0/htdocs/register.php on line 19

  7. Objet non trouvé!
    L’URL demandée n’a pas pu être trouvée sur ce serveur. La référence sur la page citée semble être erronée ou perimée. Nous vous prions d’informer l’auteur de cette page de cette erreur.

    Si vous pensez qu’il s’agit d’une erreur du serveur, veuillez contacter le webmestre.

    Error 404
    localhost
    Apache/2.4.34 (Win32) OpenSSL/1.1.0h PHP/7.2.8

    E bấm đăng ký thì bị lỗi như trên. Cho e hỏi làm sao ạ!

  8. a làm tiếp phần 2: cách login đi ạ

  9. cho em hỏi làm sao kiểm tra tên đăng nhập giống nhau thì không được đăng ký

    • trong bài hướng dẫn a có hướng dẫn mà, e xem đoạn này :

      // Kiểm tra tài khoản đã tồn tại chưa
      $sql=”select * from users where username=’$username'”;
      $kt=mysqli_query($conn, $sql);

  10. Đầu tiên mình đánh lại y chang, nó ko chạy, mình tưởng mình đánh sai, ngồi kt lỗi mà ko ra, cái copy hết toàn bộ nó vẫn ko chạy. Là sao :(( huhu

  11. em muốn thay đổi nó thành trang đăng ký của 1 khóa học gồm tên khách hàng , email, sđt và tuổi. nhưng khi đăng khí nó báo thành công nhưng hiện lỗi ở line 22 và vào cơ sở dữ liệu thì bị lỗi font chữ. vd: tên khách hàng là: Vũ Văn Hải thì lỗi thành tên k đọc được, phải sửa ntn ạ

  12. Anh cho e hỏi là e làm như trên. E viết trên notpab++ nhưng khi chạy nó lỗi, không kết nối được db và file đăng ký lại hiễn thị code ra luôn phía trên khung đăng ký. Làm sao khác phục được vậy a

  13. Anh ơi cho em hỏi, form này có dùng để lưu trữ thông tin đăng ký mua hàng được ko. E làm một cái form đăng ký mua hàng trực tiếp trên website nhưng chưa biết lưu trữ vào đâu.

  14. cảm ơn tác giả nhiều, đúng cái mình đang tìm, làm xong cho chạy rất ok

  15. cái này là lỗi kết nối rồi, nó báo ko sử dụng password kìa, e thử để password rỗng xem sao

  16. Warning: mysqli_connect(): (HY000/1045): Access denied for user ‘root’@’localhost’ (using password: NO) in D:\WampServer\wamp64\www\firstphp\lib\connectdata.php on line 11
    em bị như này . em đã thử thay đổi password của user root nhưng vẫn không được.
    Mong anh chỉ dùm em.

  17. Nếu muốn kiểm tra xem tên đăng nhập có chứa kí tự đặc biệt hay không thì làm sao vậy ad

  18. Notice: Undefined variable: conn in C:\xampp\htdocs\www\dk1\register.php on line 20

    Warning: mysqli_query() expects parameter 1 to be mysqli, null given in C:\xampp\htdocs\www\dk1\register.php on line 20

    Warning: mysqli_num_rows() expects parameter 1 to be mysqli_result, null given in C:\xampp\htdocs\www\dk1\register.php on line 22

    Notice: Undefined variable: conn in C:\xampp\htdocs\www\dk1\register.php on line 38

    Warning: mysqli_query() expects parameter 1 to be mysqli, null given in C:\xampp\htdocs\www\dk1\register.php on line 38
    chúc mừng bạn đã đăng ký thành công

    nó báo ntn là thành công chưa a

  19. Cho mình hỏi chút. Có bản phpmyadmin dùng cho winxp k nhỷ hoặc có cách nào tạo localhost trên winxp k vậy

  20. Admin ơi! mình làm theo như trên mà nhập vào form đăng ký xong nhấn đăng ký k thấy hiện thông báo cũng k thấy lưu dữ liệu. hay do mình dùng PHP8 nên code này k đc vậy

  21. Bài viết nên cho thêm hình ảnh demo

  22. Bài viết rất bổ ích.
    Mình có 1 góp ý nhỏ: bạn @kungfuphp nên có đường dẫn để tải về các source code ví dụ. Có thể đưa lên git hoặc sourceForge để track các thay đổi sau này.

  23. cho mình hỏi nếu mình muốn mã hóa password bang md5 trước khi đưa vào csdl thì làm sao nhỉ ?

  24. mình đăng ký thành công nhưng chỉ được lần đầu. các lần sau thông tin không vào csdl là bị gì nhỉ?

  25. Các bác cho em hỏi nếu mà làm form đăng kí như này. giờ mình muốn export ra files csv hay exls của exel thì phải viết code thế nào vậy

  26. ad ơi, làm sao để hiện thị được tiếng việt trên web vậy? mình có dùng mà vẫn k được 🙁

  27. mình làm y như bạn chạy dc r nhung vao database thì vẫn chưa insert dc

  28. các anh cho em hỏi tí ạ, mình thêm đoạn code kiểm tra user đã tồn tại chưa vào đâu à!
    cảm ơn ae!

  29. cho mình hỏi nếu muốn thêm phần phân quyền thì làm như nào vậy

  30. ad ơi a cho em hỏi phần tạo cơ sở dữ liệu lưu trữ khi tạo database có name kungfuphp và bảng users thì mình tạo bằng gì và lưu ở đâu ạ??? mong nhận được câu trả lời sớm nhất từ ad ạ. em cảm ơn ad ạ!!!

  31. e ko hiểu cái chỗ ở bước 2 ạ, chỗ bước 2 là dùng để làm ji ạ

  32. chỗ $database = ‘kungfuphp’; là sao ko phải là nháy kép mà là nháy đơn vậy?

  33. Tại sao anh lại không làm phần kiểm tra từ db rồi cho kết nối vào vậy ạ
    Nếu có thêm phần đó thì sẽ hay hơn

  34. Cho mình hỏi là: Mình đã chạy được trang login rồi, bây h nếu mình thêm phần register vào (là có 2 form á) thì chỉ việc lấy code trên chèn thêm vô hay phải làm cách khác.

  35. cho mình hỏi? nếu dữ liệu mới nhập vào trùng với dữ liệu đã có thì phải thêm câu lệnh như thế nào?
    minh mới học php nên nhiều chỗ chưa biết mong moi. người chỉ bảo!

  36. Khi mình đăng ký 1 thành công rồi mình refresh lại trang thì nó lại insert thêm 1 lần nữa!!! Có cách giải quyết nó không ad?

  37. Ad cho em hỏi file inc dùng để làm gì ạ?

  38. các bài biết của kungfu rất là hay và chi tiết.cảm ơn bạn nhé! cho mình xin cái fb hay email làm quen học hỏi nào! hii

  39. Nguyễn Quốc Trung

    bài viết rất hay

  40. mình cũng bị lỗi giống bạn huy.làm y chang.trong trang register mình điền đầy đủ thông tin đăng ký xong nhấn đăng ký thì chỉ hiện ra dòng thông báo ” điền đầy đủ thông tin ” mà trong phpmyadmin database vẫn chưa thấy dc insert @@ giúp với

  41. sao minhg làm giống như hướng dẫn, mà không insert dc dữ liệu vào database dc vậy, hic

    • có thông báo lỗi gì ra ngoài ko bạn ? nếu không thể insert được thì bạn thử echo biến $sql ra ngoài màng hình, và copy đoạn đó và phpmyadmin, thực thi xem có chạy được không (làm điều này để đảm bảo rằng câu lệnh $sql chạy đúng). Thân

      • mình mới edit lại code 1 tí, bạn sửa đoan này $password = $_POST[“password”]; -> thành đoạn này nhé $password = $_POST[“pass”]; . Bởi vì $_POST sẽ lấy theo thuộc tính name của input là ‘pass’.

  42. Giới thiệu về hệ quản trị cơ sở dữ liệu MySQL

Trả lời Trong Hieu Hủy

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *