hệ thống đăng ký người dùng php mysql. Xây dựng một hệ thống đăng ký đơn giản đáng kinh ngạc với PHP và MySQL

Ban đầu, việc tạo một trang web dựa trên thành viên có vẻ như là một nhiệm vụ khó khăn. Nếu bạn đã từng muốn làm điều này một mình, nhưng bạn đã từ bỏ khi bắt đầu nghĩ rằng bạn sẽ kết hợp nó với nhau như thế nào bằng các kỹ năng PHP của mình, thì bài viết này là dành cho bạn. Chúng tôi sẽ hướng dẫn bạn mọi khía cạnh của việc tạo trang web dựa trên tư cách thành viên, với khu vực thành viên an toàn được bảo vệ bằng mật khẩu.

Toàn bộ quá trình bao gồm hai phần lớn: đăng ký người dùng và xác thực người dùng. Trong phần đầu tiên, chúng ta sẽ đề cập đến việc tạo biểu mẫu đăng ký và lưu trữ dữ liệu trong cơ sở dữ liệu MySQL. Trong phần thứ hai, chúng tôi sẽ tạo biểu mẫu đăng nhập và sử dụng nó để cho phép người dùng truy cập trong khu vực an toàn.

Tải xuống mã

Bạn có thể tải xuống toàn bộ mã nguồn cho hệ thống đăng ký / đăng nhập từ liên kết bên dưới:

Cấu hình & Tải lên
Tệp ReadMe chứa các hướng dẫn chi tiết.

Mở source \ include \ Memberite_config.php tệp trong trình soạn thảo văn bản và cập nhật cấu hình. (Đăng nhập cơ sở dữ liệu, tên trang web của bạn, địa chỉ email của bạn, v.v.).

Tải lên toàn bộ nội dung thư mục. Kiểm tra register.php bằng cách gửi biểu mẫu.

Mẫu đăng ký

Để tạo tài khoản người dùng, chúng tôi cần thu thập một lượng thông tin tối thiểu từ người dùng. Chúng tôi cần tên của anh ấy, địa chỉ email và tên người dùng và mật khẩu mong muốn của anh ấy. Tất nhiên, chúng tôi có thể yêu cầu thêm thông tin vào thời điểm này, nhưng một hình thức dài luôn là một điểm tắt. Vì vậy, chúng ta hãy giới hạn bản thân mình chỉ trong những lĩnh vực đó.

Đây là mẫu đăng ký:

Đăng ký

Vì vậy, chúng tôi có các trường văn bản cho tên, email và mật khẩu. Lưu ý rằng chúng tôi đang sử dụng để có khả năng sử dụng tốt hơn.

Xác thực biểu mẫu

Tại thời điểm này, bạn nên đặt một số dạng mã xác thực tại chỗ, vì vậy chúng tôi đảm bảo rằng chúng tôi có tất cả dữ liệu cần thiết để tạo tài khoản người dùng. Chúng tôi cần kiểm tra xem tên, email và mật khẩu đã được điền và email có đúng định dạng hay không.

Xử lý việc gửi biểu mẫu

Bây giờ chúng ta phải xử lý dữ liệu biểu mẫu được gửi.

Đây là trình tự (xem tệp fg_membersite.php trong nguồn đã tải xuống):

function RegisterUser () (if (! Isset ($ _ POST ["submit"])) (return false;) $ formvars = array (); if (! $ this-> ValidateRegistrationSubmission ()) (return false;) $ this- > CollectRegistrationSubmission ($ formvars); if (! $ This-> SaveToDatabase ($ formvars)) (return false;) if (! $ This-> SendUserConfirmationEmail ($ formvars)) (return false;) $ this-> SendAdminIntimationEmail ($ formvars); trả về true;)

Đầu tiên, chúng tôi xác nhận việc gửi biểu mẫu. Sau đó, chúng tôi thu thập và ‘làm sạch’ dữ liệu gửi biểu mẫu (luôn làm điều này trước khi gửi email, lưu vào cơ sở dữ liệu, v.v.). Sau đó, việc gửi biểu mẫu được lưu vào bảng cơ sở dữ liệu. Chúng tôi gửi một email đến người dùng yêu cầu xác nhận. Sau đó, chúng tôi thân mật với quản trị viên mà một người dùng đã đăng ký.

Lưu dữ liệu trong cơ sở dữ liệu

Bây giờ chúng tôi đã thu thập tất cả dữ liệu, chúng tôi cần lưu trữ nó vào cơ sở dữ liệu.
Đây là cách chúng tôi lưu biểu mẫu gửi vào cơ sở dữ liệu.

function SaveToDatabase (& $ formvars) (if (! $ this-> DBLogin ()) ($ this-> HandleError ("Đăng nhập cơ sở dữ liệu không thành công!"); return false;) if (! $ this-> Ensuretable ()) ( return false;) if (! $ this-> IsFieldUnique ($ formvars, "email")) ($ this-> HandleError ("Email này đã được đăng ký"); return false;) if (! $ this-> IsFieldUnique ( $ formvars, "tên người dùng")) ($ this-> HandleError ("Tên người dùng này đã được sử dụng. Vui lòng thử tên người dùng khác"); return false;) if (! $ this-> InsertIntoDB ($ formvars)) ($ this- > HandleError ("Chèn vào Cơ sở dữ liệu không thành công!"); Return false;) return true;)

Lưu ý rằng bạn đã định cấu hình chi tiết đăng nhập Cơ sở dữ liệu trong tệp memberite_config.php. Trong hầu hết các trường hợp, bạn có thể sử dụng “localhost” cho máy chủ cơ sở dữ liệu.
Sau khi đăng nhập, chúng tôi đảm bảo rằng bảng đang tồn tại. (Nếu không, script sẽ tạo bảng cần thiết).
Sau đó, chúng tôi đảm bảo rằng tên người dùng và email là duy nhất. Nếu nó không phải là duy nhất, chúng tôi trả lại lỗi cho người dùng.

Cấu trúc bảng cơ sở dữ liệu

Đây là cấu trúc bảng. Hàm CreateTable () trong tệp fg_membersite.php tạo bảng. Đây là mã:

function CreateTable () ($ qry = "Create Table $ this-> tablename (". "id_user INT NOT NULL AUTO_INCREMENT,". "name VARCHAR (128) NOT NULL,". "email VARCHAR (64) NOT NULL,". "phone_number VARCHAR (16) NOT NULL,". "username VARCHAR (16) NOT NULL,". "password VARCHAR (32) NOT NULL,". "confirmcode VARCHAR (32),". "PRIMARY KEY (id_user)". ")"; if (! mysql_query ($ qry, $ this-> connection)) ($ this-> HandleDBError ("Lỗi khi tạo bảng \ nquery là \ n $ qry"); return false;) return true;)

Trường id_user sẽ chứa id duy nhất của người dùng và cũng là khóa chính của bảng. Lưu ý rằng chúng tôi cho phép 32 ký tự cho trường mật khẩu. Chúng tôi làm điều này bởi vì, như một biện pháp bảo mật bổ sung, chúng tôi sẽ lưu trữ mật khẩu trong cơ sở dữ liệu được mã hóa bằng MD5. Xin lưu ý rằng vì MD5 là phương pháp mã hóa một chiều nên chúng tôi sẽ không thể khôi phục mật khẩu trong trường hợp người dùng quên.

Chèn đăng ký vào bảng

Đây là đoạn mã mà chúng tôi sử dụng để chèn dữ liệu vào cơ sở dữ liệu. Chúng tôi sẽ có sẵn tất cả dữ liệu của mình trong mảng $ formvars.

function InsertIntoDB (& $ formvars) ($ confirmcode = $ this-> MakeConfirmationMd5 ($ formvars ["email"]); $ insert_query = "insert into". $ this-> tablename. "(tên, email, tên người dùng, mật khẩu, verifycode) các giá trị ("". $ this-> SanifyingForSQL ($ formvars ["name"]). "", "". $ this-> SanifyingForSQL ($ formvars ["email"]). "", "" . $ this-> SanifyingForSQL ($ formvars ["username"]). "", "". md5 ($ formvars ["password"]). "", "". $ confirmcode. "") "; if (! mysql_query ($ insert_query, $ this-> connection)) ($ this-> HandleDBError ("Lỗi khi chèn dữ liệu vào bảng \ nquery: $ insert_query"); return false;) return true;)

Lưu ý rằng chúng tôi sử dụng hàm md5 () của PHP để mã hóa mật khẩu trước khi chèn nó vào cơ sở dữ liệu.
Ngoài ra, chúng tôi tạo mã xác nhận duy nhất từ ​​địa chỉ email của người dùng.

Gửi e-mail

Bây giờ chúng tôi đã đăng ký trong cơ sở dữ liệu của mình, chúng tôi sẽ gửi một email xác nhận cho người dùng. Người dùng phải nhấp vào liên kết trong email xác nhận để hoàn tất quá trình đăng ký.

function SendUserConfirmationEmail (& $ formvars) ($ mailer = new PHPMailer (); $ mailer-> CharSet = "utf-8"; $ mailer-> AddAddress ($ formvars ["email"], $ formvars ["name"]) ; $ mailer-> Subject = "Đăng ký của bạn với". $ this-> sitename; $ mailer-> From = $ this-> GetFromAddress (); $ confirmcode = urlencode ($ this-> MakeConfirmationMd5 ($ formvars ["email" " ])); $ verify_url = $ this-> GetAbsoluteURLFolder (). "/ confirmreg.php? code =". $ confirmcode; $ mailer-> Body = "Xin chào". $ formvars ["name"]. "\ r \ n \ r \ n "." Cảm ơn bạn đã đăng ký với ". $ this-> sitename." \ r \ n "." Vui lòng nhấp vào liên kết bên dưới để xác nhận đăng ký của bạn. \ r \ n "." $ verify_url \ r \ n "." \ r \ n "." Trân trọng, \ r \ n "." Quản trị viên web \ r \ n ". $ this-> sitename; if (! $ mailer-> Send ()) ($ this-> HandleError ("Không gửi được email xác nhận đăng ký."); Return false;) return true;)

cập nhật

Ngày 9 tháng 1 năm 2012
Các tính năng Đặt lại Mật khẩu / Thay đổi Mật khẩu được thêm vào
Mã hiện được chia sẻ tại GitHub.

chào mừng trở lạiUserFullName (); ?>!

Giấy phép


Mã được chia sẻ theo giấy phép LGPL. Bạn có thể thoải mái sử dụng nó trên các trang web thương mại hoặc phi thương mại.

Không có bài viết liên quan.

Bình luận về cụm từ này được đóng.

Xin chào! Bây giờ chúng tôi sẽ cố gắng thực hiện đăng ký đơn giản nhất trên trang web bằng PHP + MySQL. Để làm điều này, Apache phải được cài đặt trên máy tính của bạn. Cách hoạt động của tập lệnh của chúng tôi được hiển thị bên dưới.

1. Hãy bắt đầu bằng cách tạo bảng người dùng trong cơ sở dữ liệu.
Nó sẽ chứa dữ liệu người dùng (đăng nhập và mật khẩu). Hãy vào phpmyadmin (nếu bạn tạo cơ sở dữ liệu trên PC của mình http: // localhost / phpmyadmin /). Tạo một người dùng bảng, nó sẽ có 3 trường.

Tôi tạo nó trong cơ sở dữ liệu mysql, bạn có thể tạo nó trong một cơ sở dữ liệu khác. Tiếp theo, đặt các giá trị, như trong hình:

2. Cần có kết nối với bảng này.
Hãy tạo một tệp bd.php. Nội dung của nó:

$ db = mysql_connect ("máy chủ MySQL của bạn", "đăng nhập vào máy chủ này", "mật khẩu vào máy chủ này");
mysql_select_db ("tên cơ sở dữ liệu cần kết nối", $ db);
?>

Lưu bd.php.
Xuất sắc! Chúng tôi có một bảng trong cơ sở dữ liệu, một kết nối với nó. Bây giờ bạn có thể bắt đầu tạo một trang nơi người dùng sẽ để lại dữ liệu của họ.

3. Tạo một tệp reg.php với nội dung (tất cả các nhận xét bên trong):



Sự đăng ký


Sự đăng ký
















4. Tạo một tệp sẽ nhập dữ liệu vào cơ sở dữ liệu và lưu người dùng. save_user.php (nhận xét bên trong):

if (Isset ($ _ POST ["login"])) ($ login = $ _POST ["login"]; if ($ login == "") (unset ($ login);)) // đặt thông tin đăng nhập bằng người dùng vào biến $ login, nếu nó trống, thì chúng tôi hủy biến


if (trống ($ đăng nhập) hoặc trống ($ mật khẩu)) // nếu người dùng chưa nhập thông tin đăng nhập hoặc mật khẩu, thì chúng tôi sẽ đưa ra lỗi và dừng tập lệnh
{

}
// nếu thông tin đăng nhập và mật khẩu được nhập, thì chúng tôi sẽ xử lý chúng để các thẻ và tập lệnh không hoạt động, bạn không bao giờ biết những gì mọi người có thể nhập


$ password = striplashes ($ password);

// xóa các khoảng trắng thừa
$ đăng nhập = trim ($ đăng nhập);

// kết nối với cơ sở dữ liệu
// kiểm tra sự tồn tại của người dùng có cùng thông tin đăng nhập
$ result = mysql_query ("CHỌN id TỪ người dùng TẠI ĐÂU đăng nhập =" $ đăng nhập "", $ db);

if (! rỗng ($ myrow ["id"])) (
exit ("Xin lỗi, tên người dùng bạn nhập đã được đăng ký. Vui lòng nhập tên người dùng khác.");
}
// nếu không có thì lưu dữ liệu
$ result2 = mysql_query ("CHÈN VÀO người dùng (đăng nhập, mật khẩu) GIÁ TRỊ (" $ đăng nhập "," $ password ")");
// Kiểm tra xem có lỗi không
if ($ result2 == "TRUE")
{
echo "Bạn đã đăng ký thành công! Bây giờ bạn có thể vào trang web. Trang chính";
}
khác(
echo "Lỗi! Bạn chưa đăng nhập.";
}

5. Bây giờ người dùng của chúng tôi có thể đăng ký!
Tiếp theo, bạn cần tạo một "cửa" để vào trang web cho những người đã đăng ký. index.php (bình luận bên trong):

// toàn bộ thủ tục hoạt động trên các phiên. Nó nằm trong đó dữ liệu của người dùng được lưu trữ trong khi anh ta ở trên trang web. Điều rất quan trọng là phải khởi chạy chúng ở đầu trang !!!
session_start ();
?>


Trang chính


Trang chính










Đăng ký



// Kiểm tra xem biến đăng nhập và id người dùng có trống không
nếu (trống ($ _ SESSION ["đăng nhập"]) hoặc trống ($ _ SESSION ["id"]))
{
// Nếu trống, chúng tôi không hiển thị liên kết
echo "Bạn đã đăng nhập với tư cách khách
Liên kết này chỉ có sẵn cho người dùng đã đăng ký ";
}
khác
{

Trong tệp index.php, chúng tôi sẽ hiển thị một liên kết sẽ chỉ mở cho người dùng đã đăng ký. Đây là toàn bộ điểm của tập lệnh - để hạn chế quyền truy cập vào bất kỳ dữ liệu nào.

6. Có một tập tin xác minh thông tin đăng nhập và mật khẩu đã nhập. testreg.php (bình luận bên trong):

session_start (); // toàn bộ thủ tục hoạt động trên các phiên. Nó nằm trong đó dữ liệu của người dùng được lưu trữ trong khi anh ta ở trên trang web. Điều rất quan trọng là phải khởi chạy chúng ở đầu trang !!!
if (Isset ($ _ POST ["login"])) ($ login = $ _POST ["login"]; if ($ login == "") (unset ($ login);)) // đặt thông tin đăng nhập bằng người dùng vào biến $ login, nếu nó trống, thì chúng tôi hủy biến
if (Isset ($ _ POST ["password"])) ($ password = $ _ POST ["password"]; if ($ password == "") (unset ($ password);))
// đưa mật khẩu do người dùng nhập vào biến $ password, nếu trống thì hủy biến
if (trống ($ đăng nhập) hoặc trống ($ mật khẩu)) // nếu người dùng chưa nhập thông tin đăng nhập hoặc mật khẩu, thì chúng tôi sẽ đưa ra lỗi và dừng tập lệnh
{
exit ("Bạn đã không nhập tất cả thông tin, hãy quay lại và điền vào tất cả các trường!");
}
// nếu thông tin đăng nhập và mật khẩu được nhập, thì chúng tôi sẽ xử lý chúng để các thẻ và tập lệnh không hoạt động, bạn không bao giờ biết những gì mọi người có thể nhập
$ đăng nhập = dải băng ($ đăng nhập);
$ login = htmlspecialchars ($ đăng nhập);
$ password = striplashes ($ password);
$ password = htmlspecialchars ($ password);
// xóa các khoảng trắng thừa
$ đăng nhập = trim ($ đăng nhập);
$ password = trim ($ mật khẩu);
// kết nối với cơ sở dữ liệu
include ("bd.php"); // tệp bd.php phải nằm trong cùng thư mục với những người khác, nếu không phải thì chỉ cần thay đổi đường dẫn

$ result = mysql_query ("CHỌN * TỪ người dùng WHERE đăng nhập =" $ đăng nhập "", $ db); // truy xuất tất cả dữ liệu về người dùng với thông tin đăng nhập đã nhập từ cơ sở dữ liệu
$ myrow = mysql_fetch_array ($ kết quả);
if (trống ($ myrow ["password"]))
{
// nếu người dùng có thông tin đăng nhập đã nhập không tồn tại

}
khác(
// nếu tồn tại, hãy kiểm tra mật khẩu
if ($ myrow ["password"] == $ password) (
// nếu mật khẩu khớp, thì chúng tôi bắt đầu phiên cho người dùng! Bạn có thể chúc mừng anh ấy, anh ấy đã bước vào!
$ _SESSION ["đăng nhập"] = $ myrow ["đăng nhập"];
$ _SESSION ["id"] = $ myrow ["id"]; // dữ liệu này rất thường được sử dụng, vì vậy người dùng đã đăng nhập sẽ "mang theo" chúng
echo "Bạn đã đăng nhập thành công vào trang web! Trang chính";
}
khác(
// nếu mật khẩu không khớp

Exit ("Xin lỗi, thông tin đăng nhập hoặc mật khẩu bạn đã nhập không chính xác.");
}
}
?>

OK, tất cả đã kết thúc! Có thể bài học nhàm chán, nhưng rất hữu ích. Chỉ ý tưởng đăng ký được hiển thị ở đây, bạn có thể cải thiện nó hơn nữa: thêm bảo vệ, thiết kế, trường dữ liệu, tải lên hình đại diện, đăng xuất khỏi tài khoản (đối với điều này, chỉ cần xóa các biến khỏi phiên bằng hàm unset) và Sớm. Chúc may mắn!

Reg.ru: tên miền và lưu trữ

Nhà đăng ký và nhà cung cấp dịch vụ lưu trữ lớn nhất ở Nga.

Hơn 2 triệu tên miền được cung cấp dịch vụ.

Quảng cáo, thư cho miền, giải pháp cho doanh nghiệp.

Hơn 700 nghìn khách hàng trên khắp thế giới đã lựa chọn.

* Di chuột để tạm dừng cuộn.

Lùi về phía trước

Tạo một hệ thống đăng ký người dùng đơn giản trong PHP và MySQL

Tạo một hệ thống đăng ký là rất nhiều công việc. Bạn phải viết mã xác thực địa chỉ email, gửi email xác nhận đăng ký, xác thực phần còn lại của các trường biểu mẫu và hơn thế nữa.

Và ngay cả sau khi bạn viết tất cả những điều này, người dùng sẽ miễn cưỡng đăng ký, bởi vì. nó đòi hỏi một số nỗ lực từ phía họ.

Trong hướng dẫn này, chúng tôi sẽ tạo một hệ thống đăng nhập rất đơn giản mà không yêu cầu hoặc lưu trữ mật khẩu! Kết quả là sẽ dễ dàng sửa đổi và thêm vào một trang web PHP đã có sẵn. Bạn muốn tìm hiểu xem nó hoạt động như thế nào? Đọc bên dưới.



Đây là cách hệ thống siêu đơn giản của chúng tôi sẽ hoạt động:

Chúng tôi sẽ kết hợp biểu mẫu ủy quyền và đăng ký. Biểu mẫu này sẽ có một trường để nhập địa chỉ email và nút đăng ký;
- Khi điền vào trường địa chỉ email, bằng cách nhấp vào nút đăng ký, một bản ghi về người dùng mới sẽ được tạo, nhưng chỉ khi địa chỉ email đã nhập không được tìm thấy trong cơ sở dữ liệu.

Sau đó, một tập hợp ký tự (mã thông báo) duy nhất ngẫu nhiên nhất định được tạo, được gửi đến thư do người dùng chỉ định dưới dạng một liên kết có liên quan trong 10 phút;
- Bằng cách nhấp vào liên kết, người dùng truy cập trang web của chúng tôi. Hệ thống xác định sự hiện diện của mã thông báo và ủy quyền cho người dùng;

Ưu điểm của phương pháp này:

Không cần lưu trữ mật khẩu và xác nhận các trường;
- Không cần khôi phục mật khẩu, câu hỏi bí mật, v.v.;
- Kể từ thời điểm người dùng đã đăng ký / đăng nhập, bạn luôn có thể chắc chắn rằng người dùng này sẽ ở trong vùng truy cập của bạn (rằng địa chỉ email là đúng);
- Quá trình đăng ký cực kỳ đơn giản;

Flaws:

Bảo mật tài khoản người dùng. Nếu ai đó có quyền truy cập vào thư của người dùng, anh ta có thể đăng nhập.
- Email không an toàn và có thể bị chặn. Hãy nhớ rằng câu hỏi này cũng có liên quan trong trường hợp mật khẩu bị quên và cần được khôi phục hoặc trong bất kỳ hệ thống ủy quyền nào không sử dụng HTTPS để truyền dữ liệu (đăng nhập / mật khẩu);
- Miễn là bạn thiết lập máy chủ thư khi cần, có khả năng các thư có liên kết ủy quyền sẽ bị chuyển thành thư rác;

So sánh những ưu và nhược điểm của hệ thống của chúng tôi, chúng tôi có thể nói rằng hệ thống có tính tiện dụng cao (thuận tiện tối đa cho người dùng cuối) và đồng thời có chỉ số bảo mật thấp.

Vì vậy, nó được đề xuất sử dụng nó cho các đăng ký trên các diễn đàn và dịch vụ không hoạt động với thông tin quan trọng.

Cách sử dụng hệ thống này

Trong trường hợp bạn chỉ cần sử dụng hệ thống để cấp quyền cho người dùng trên trang web của mình và bạn không muốn tách biệt bài học này, đây là những gì bạn cần làm:

Bạn cần tải các file nguồn đính kèm trong bài
- Tìm tệp trong kho lưu trữ table.sql Nhập nó vào cơ sở dữ liệu của bạn bằng cách sử dụng tùy chọn nhập trong phpMyAdmin. Cách khác: mở tệp này bằng trình soạn thảo văn bản, sao chép truy vấn SQL và chạy nó;
- Mở bao gồm / main.php và điền vào các cài đặt để kết nối với cơ sở dữ liệu của bạn (chỉ định người dùng và mật khẩu để kết nối với cơ sở dữ liệu, cũng như máy chủ và tên của cơ sở dữ liệu). Trong cùng một tệp, bạn cũng phải chỉ định một địa chỉ email sẽ được sử dụng làm địa chỉ ban đầu cho các thư được gửi bởi hệ thống. Một số máy chủ sẽ chặn các email gửi đi cho đến khi biểu mẫu hiển thị địa chỉ email thực được tạo từ bảng điều khiển của máy chủ, vì vậy hãy nhập địa chỉ thực;
- Tải xuống tất cả các tệp index.php, protected.php và các tài sản và bao gồm các thư mục qua FTP đến máy chủ của bạn;
- Thêm mã bên dưới vào mỗi trang PHP nơi bạn muốn hiển thị biểu mẫu ủy quyền;

Request_once "bao gồm / main.php"; $ user = new User (); if (! $ user- & gtloggedIn ()) (redirect ("index.php");)
- Sẳn sàng!

Đối với những ai quan tâm đến cách tất cả hoạt động, hãy đọc tiếp phần bên dưới!

Bước đầu tiên là viết mã HTM cho biểu mẫu ủy quyền. Mã này nằm trong tệp index.php. Tệp này cũng chứa mã PHP xử lý dữ liệu biểu mẫu và các tính năng hữu ích khác của hệ thống ủy quyền. Bạn có thể tìm hiểu thêm về điều này trong phần đánh giá mã PHP bên dưới.

index.php

Hướng dẫn: Hệ thống đăng ký siêu đơn giản với PHP & MySQL

đăng nhập hay đăng ký

Nhập địa chỉ email của bạn ở trên và chúng tôi sẽ gửi
bạn đăng nhập liên kết.

Trong phần đầu (giữa các thẻ và) Tôi đã bao gồm các phong cách chính (chúng không được phân tích trong hướng dẫn này, vì vậy bạn có thể tự xem chúng. Thư mục tài sản / css / style.css). Trước thẻ đóng Tôi đã bao gồm thư viện jQuery và tệp script.js, chúng tôi sẽ viết và phân tích bên dưới.


JavaScript

jQuery theo dõi trạng thái của nút "Đăng ký / Đăng nhập" với một chức năng e.preventDefault () và gửi các yêu cầu AJAX. Tùy thuộc vào phản hồi của máy chủ, hiển thị một thông báo cụ thể và xác định các hành động tiếp theo /

property / js / script.js

$ (function () (var form = $ ("# login-register"); form.on ("submit", function (e) (if (form.is (". loading, .loggedIn")) (trả về false ;) var email = form.find ("input"). val (), messageHolder = form.find ("span"); e.preventDefault (); $ .post (this.action, (email: email), function (m) (if (m.error) (form.addClass ("error"); messageHolder.text (m.message);) else (form.removeClass ("error"). addClass ("loggedIn"); messageHolder. text (m.message);)));)); $ (tài liệu) .ajaxStart (function () (form.addClass ("loading");)); $ (tài liệu) .ajaxComplete (function () (form. removeClass ("đang tải");));));

đã được thêm vào biểu mẫu để hiển thị trạng thái hiện tại của yêu cầu AJAX (điều này có thể thực hiện được nhờ các phương thức ajaxStart ()) và ajaxComplete (), bạn có thể tìm thấy ở cuối tệp).

Lớp này hiển thị một tệp gif hoạt hình xoay tròn (như thể gợi ý cho chúng tôi rằng yêu cầu đang được xử lý) và cũng hoạt động như một lá cờ để ngăn biểu mẫu được gửi lại (khi nút đăng ký đã được nhấp một lần). Lớp .đăng nhập- đây là một cờ khác - được đặt khi email được gửi. Cờ này ngay lập tức chặn bất kỳ hành động nào khác trên biểu mẫu.

Lược đồ cơ sở dữ liệu

Hệ thống ghi nhật ký cực kỳ đơn giản của chúng tôi sử dụng 2 bảng MySQL (mã SQL có trong tệp table.sql). Đầu tiên lưu trữ dữ liệu về tài khoản người dùng. Thứ hai lưu trữ thông tin về số lần đăng nhập.


Lược đồ bảng người dùng.

Hệ thống không sử dụng mật khẩu, có thể thấy trong sơ đồ. Trên đó, bạn có thể thấy cột mã thông báo với mã thông báo liền kề với cột token_validity. Mã thông báo được đặt ngay sau khi người dùng kết nối với hệ thống, đặt email của anh ta để gửi tin nhắn (thêm một chút về điều này trong khối tiếp theo). Cột token_validityđặt thời gian 10 phút sau, sau đó mã thông báo không còn hợp lệ.


Lược đồ bảng đếm số lần ủy quyền.

Trong cả hai bảng, địa chỉ IP được lưu trữ ở dạng đã xử lý, sử dụng hàm ip2long, trong trường số nguyên.

Bây giờ chúng ta có thể viết một số mã PHP. Chức năng chính của hệ thống được gán cho lớp user.class.php mà bạn có thể xem bên dưới.

Lớp này tích cực sử dụng idorm (docs), các thư viện này là công cụ cần thiết tối thiểu để làm việc với cơ sở dữ liệu. Nó xử lý quyền truy cập cơ sở dữ liệu, tạo mã thông báo và xác nhận. Đây là một giao diện đơn giản giúp bạn dễ dàng kết nối hệ thống đăng ký với trang web của mình nếu nó sử dụng PHP.

user.class.php

Người dùng lớp (// Trường hợp ORM riêng tư private $ orm; / ** * Tìm người dùng bằng mã thông báo. Chỉ những mã thông báo hợp lệ mới được xem xét. Mã thông báo chỉ được tạo trong 10 phút kể từ khi được tạo * @param string $ token . Đây là mã bạn đang tìm kiếm mã thông báo * @return Người dùng. Trả về giá trị của hàm Người dùng * / hàm tĩnh công khai findByToken ($ token) (// tìm mã thông báo trong cơ sở dữ liệu và đảm bảo dấu thời gian chính xác được đặt $ result = ORM :: for_table ("reg_users") -> where ("token", $ token) -> where_raw ("token_validity> NOW ()") -> find_one (); if (! $ result) (return false; ) trả về Người dùng mới ($ result);) / ** * Cấp quyền hoặc đăng ký người dùng * @param string $ email.Địa chỉ email của người dùng * @return User * / public static function loginOrRegister ($ email) (// Nếu người dùng như vậy đã tồn tại, hãy trả về giá trị của hàm Người dùng từ địa chỉ email được chỉ định được lưu trữ trong cơ sở dữ liệu nếu (Người dùng :: tồn tại ($ email)) (trả về Người dùng mới ($ email);) // Nếu không, hãy tạo người dùng mới tel trong cơ sở dữ liệu và trả về giá trị của hàm User :: create từ email được chỉ định return User :: create ($ email); ) / ** * Tạo người dùng mới và lưu vào cơ sở dữ liệu * @param string $ email. Địa chỉ email người dùng * @return Người dùng * / hàm tĩnh riêng tạo ($ email) (// Đăng ký người dùng mới và trả về kết quả của hàm Người dùng từ các giá trị này $ result = ORM :: for_table ("reg_users") - > create (); $ result-> email = $ email; $ result-> save (); trả về Người dùng mới ($ result);) / ** * Kiểm tra xem người dùng đó có tồn tại trong cơ sở dữ liệu hay không và trả về giá trị boolean của biến * @param string $ email. Địa chỉ email người dùng * @return boolean * / public static function tồn tại ($ email) (// Người dùng có tồn tại trong cơ sở dữ liệu không? $ Result = ORM :: for_table ("reg_users") -> where ("email", $ email ) -> count (); return $ result == 1;) / ** * Tạo đối tượng người dùng mới * @param instance $ param ORM, id, email or 0 * @return User * / public function __construct ($ param = null) (if ($ param instanceof ORM) (// Kiểm tra ORM đã vượt qua $ this-> orm = $ param;) else if (is_string ($ param)) (// Kiểm tra email đã vượt qua $ this-> orm = ORM :: for_table ("reg_users") -> where ("email", $ param) -> find_one ();) else ($ id = 0; if (is_numeric ($ param)) (// id người dùng được chuyển giá trị $ biến tham số $ id = $ param;) else if (Isset ($ _ SESSION ["loginid"])) (// Nếu không, hãy xem phiên $ id = $ _SESSION ["loginid"];) $ this-> orm = ORM :: for_table ("reg_users") -> where ("id", $ id) -> find_one ();)) / ** * Tạo mã thông báo ủy quyền SHA1 mới, viết vào cơ sở dữ liệu và trả về giá trị của nó * @return string * / public function createToken () (// Tạo mã thông báo cho người dùng được ủy quyền và lưu nó vào cơ sở dữ liệu $ token = sha1 ($ this-> email.time (). rand (0, 1000000)); // Lưu trữ mã thông báo trong cơ sở dữ liệu // Và đánh dấu nó là chỉ hợp lệ trong 10 phút tới $ this-> orm-> set ("token", $ token); $ this-> orm-> set_expr ("token_validity", "ADDTIME (NOW ()," 0:10 ")"); $ this-> orm-> save (); trả lại $ token; ) / ** * Cấp quyền cho người dùng * @return void * / public function login () (// Đánh dấu người dùng là đã đăng nhập $ _SESSION ["loginid"] = $ this-> orm-> id; // Cập nhật giá trị của trường cơ sở dữ liệu last_login $ this-> orm-> set_expr ("last_login", "NOW ()"); $ this-> orm-> save ();) / ** * Hủy phiên và đăng xuất người dùng * @return void * / public function logout () ($ _SESSION = array (); unset ($ _ SESSION);) / ** * Kiểm tra xem người dùng đã đăng nhập chưa * @return boolean * / public function loggedIn () (return Isset ($ this-> orm-> id) && $ _SESSION ["loginid"] == $ this-> orm-> id;) / ** * Kiểm tra xem người dùng có phải là quản trị viên không * @return boolean * / public function isAdmin () (return $ this-> rank () = = "administrator";) / ** * Tìm kiểu người dùng, có thể là quản trị viên hoặc thông thường * @return string * / public function rank () (if ($ this-> orm- > rank == 1) (return "administrator";) return "normal";) / ** * Một phương thức cho phép bạn lấy thông tin cá nhân * dưới dạng thuộc tính của đối tượng Người dùng * @param string $ key Tên của thuộc tính được truy cập * @return hỗn hợp * / hàm công khai __get ($ key) (if (Isset ($ this-> orm -> $ key)) (trả về $ this-> orm -> $ key; ) trả về null; ))

Mã thông báo được tạo bằng thuật toán SHA1 và được lưu trữ trong cơ sở dữ liệu. Tôi đang sử dụng các hàm thời gian của MySQL để đặt giới hạn hết hạn mã thông báo 10 phút.

Khi mã thông báo vượt qua thủ tục xác thực, chúng tôi trực tiếp nói với người xử lý rằng chúng tôi chỉ đang xem xét các mã thông báo chưa hết hạn, được lưu trữ trong cột token_validity.

Xin lưu ý rằng tôi đang sử dụng phương pháp ma thuật __lấy thư viện tài liệu ở cuối tệp để chặn quyền truy cập vào các thuộc tính của đối tượng Người dùng.

Nhờ đó, có thể truy cập thông tin được lưu trữ trong cơ sở dữ liệu, nhờ các thuộc tính $ user-> email, $ user-> mã thông báo vv Trong đoạn mã sau, hãy lấy một ví dụ về cách sử dụng các lớp này.


Trang được bảo vệ

Một tệp khác lưu trữ chức năng hữu ích và cần thiết là tệp functions.php. Có một số cái gọi là trình trợ giúp ở đây - các chức năng trợ giúp cho phép bạn tạo mã sạch hơn và dễ đọc hơn trong các tệp khác.

functions.php

Hàm send_email ($ from, $ to, $ subject, $ message) (// Người trợ giúp gửi email $ headers = "MIME-Version: 1.0". "\ R \ n"; $ headers. = "Content-type: text / trơn; charset = utf-8 "." \ r \ n "; $ headers. =" From: ". $ from." \ r \ n "; return mail ($ to, $ subject, $ message, $ headers );) function get_page_url () (// Lấy URL tệp PHP $ url = "http". (rỗng ($ _ SERVER ["HTTPS"])? "": "s"). ": //". $ _ SERVER [ "SERVER_NAME"]; if (Isset ($ _ SERVER ["REQUEST_URI"]) && $ _SERVER ["REQUEST_URI"]! = "") ($ Url. = $ _SERVER ["REQUEST_URI"];) else ($ url. = $ _SERVER ["PATH_INFO"];) return $ url;) function rate_limit ($ ip, $ limit_hour = 20, $ limit_10_min = 10) (// Số lần đăng nhập trong giờ qua tại địa chỉ IP này $ count_hour = ORM: : for_table ("reg_login_attempt") -> where ("ip", sprintf ("% u", ip2long ($ ip))) -> where_raw ("ts> SUBTIME (NOW ()," 1:00 ")") -> count (); // Số lần đăng nhập trong 10 phút qua tại địa chỉ IP này $ count_10_min = ORM :: for_table ("reg_login_attempt") -> where ("ip", sprint f ("% u", ip2long ($ ip)))) -> where_raw ("ts> SUBTIME (NOW ()," 0:10 ")") -> count (); if ($ count_hour> $ limit_hour || $ count_10_min> $ limit_10_min) (ném Ngoại lệ mới ("Quá nhiều lần đăng nhập!");)) function rate_limit_tick ($ ip, $ email) (// Tạo mục nhập mới trong bảng đếm số lần đăng nhập $ login_attempt = ORM :: for_table ("reg_login_attempt") -> create (); $ login_attempt-> email = $ email; $ login_attempt-> ip = sprintf ("% u", ip2long ($ ip) ); $ login_attempt-> save ();) chức năng redirect ($ url) (header ("Vị trí: $ url"); exit;)

Chức năng rate_limitrate_limit_tick theo dõi số lần thử ủy quyền trong khoảng thời gian đã trôi qua kể từ lần thử đầu tiên. Nỗ lực đăng nhập được ghi lại trong cơ sở dữ liệu trong cột reg_login_attempt. Các hàm này được gọi khi dữ liệu biểu mẫu đang được xử lý và gửi, như bạn có thể thấy từ đoạn mã sau.

Đoạn mã dưới đây được lấy từ tệp index.php và nó xử lý việc gửi biểu mẫu. Nó trả về một phản hồi JSON lần lượt được xử lý bởi jQuery trong một tệp property / js / script.js mà chúng ta đã thảo luận trước đó.

index.php

Thử (if (! Blank ($ _ POST) && Isset ($ _ SERVER ["HTTP_X_REQUESTED_WITH"])) (// Xuất tiêu đề đầu trang JSON ("Content-type: application / json"); // Địa chỉ email này có hợp lệ không nếu (! Isset ($ _ POST ["email"]) ||! filter_var ($ _ POST ["email"], FILTER_VALIDATE_EMAIL)) (ném Ngoại lệ mới ("Vui lòng nhập một email hợp lệ.");) // Kiểm tra. Có phải là người dùng được phép đăng nhập, anh ta đã vượt quá số lượng kết nối được phép chưa? (tệp functions.php để biết thêm thông tin) rate_limit ($ _ SERVER ["REMOTE_ADDR"]); // Ghi lại lần đăng nhập này rate_limit_tick ($ _ SERVER ["REMOTE_ADDR"] , $ _POST ["email"]); // Gửi email tới người dùng $ message = ""; $ email = $ _POST ["email"]; $ subject = "Liên kết đăng nhập của bạn"; if (! User :: tồn tại ($ email)) ($ subject = "Cảm ơn bạn đã đăng ký!"; $ message = "Cảm ơn bạn đã đăng ký tại trang web của chúng tôi! \ n \ n";) // Cố gắng ủy quyền hoặc đăng ký người dùng $ user = Người dùng :: loginOrRegister ($ _ POST ["email"]); $ message. = "Bạn có thể đăng nhập từ URL này: \ n" ; $ message. = get_page_url (). "? tkn =". $ user-> createToken (). "\ n \ n"; $ message. = "Liên kết sẽ tự động hết hạn sau 10 phút."; $ result = send_email ($ fromEmail, $ _POST ["email"], $ chủ đề, $ tin nhắn); if (! $ result) (ném Ngoại lệ mới ("Đã xảy ra lỗi khi gửi email của bạn. Vui lòng thử lại.");) die (json_encode (array ("message" => "Cảm ơn bạn! Chúng tôi" đã gửi một liên kết vào hộp thư đến của bạn. Kiểm tra cả thư mục spam của bạn. "))));)) catch (Exception $ e) (die (json_encode (array (" error "=> 1," message "=> $ e-> getMessage ( ))));)

Sau khi ủy quyền / đăng ký thành công, đoạn mã trên sẽ gửi cho người dùng một liên kết để ủy quyền. Mã thông báo trở nên khả dụng bởi vì nó được chuyển dưới dạng một biến trong liên kết được tạo bởi phương thức $ _ NHẬN với điểm đánh dấu tkn

index.php

If (Isset ($ _ GET ["tkn"])) (// Mã thông báo này có hợp lệ để ủy quyền không? $ User = User :: findByToken ($ _ GET ["tkn"]); if ($ user) (// Có, là. Chuyển hướng đến trang được bảo vệ $ user-> login (); redirect ("protected.php");) // Không, mã thông báo không hợp lệ. Chuyển hướng đến trang có chuyển hướng biểu mẫu đăng nhập / đăng ký ("index." php ");)

$ user-> login ()

sẽ tạo các biến cần thiết cho phiên để người dùng, xem các trang tiếp theo của trang web, sẽ vẫn được ủy quyền mọi lúc.

Tương tự, việc xử lý chức năng thoát khỏi hệ thống được sắp xếp.

index.php

If (Isset ($ _ GET ["logout"])) ($ user = new User (); if ($ user-> loggedIn ()) ($ user-> logout ();) redirect ("index.php") ;)

Ở cuối mã, tôi lại chuyển hướng đến index.php, vì vậy tham số ? đăng xuất = 1được chuyển bởi URL là không bắt buộc.

Hồ sơ của chúng tôi index.php yêu cầu bổ sung bảo vệ - chúng tôi không muốn những người đã từng đăng nhập vào hệ thống nhìn thấy lại mẫu đăng ký. Với những mục đích này, chúng tôi sử dụng phương pháp $ user-> loggedIn ().

index.php

$ user = new User (); if ($ user-> loggedIn ()) (redirect ("protected.php");)

Cuối cùng, đây là một đoạn mã cho phép bạn bảo vệ các trang trên trang web của mình và chỉ cung cấp nó sau khi được ủy quyền.

protected.php

// Để bảo mật mỗi trang trên trang web của bạn, hãy bao gồm một tệp // main.php và tạo một đối tượng Người dùng mới. Đó là cách dễ dàng nó là! request_once "bao gồm / main.php"; $ user = new User (); if (! $ user-> loggedIn ()) (redirect ("index.php");)

Sau khi kiểm tra này, bạn có thể chắc chắn rằng người dùng đã được ủy quyền thành công. Bạn cũng có thể truy cập thông tin được lưu trữ trong cơ sở dữ liệu bằng cách sử dụng thuộc tính đối tượng $ người dùng. Để hiển thị email và trạng thái của người dùng, hãy sử dụng mã này:

echo "Email của bạn:". $ user-> email; echo "Xếp hạng của bạn:". $ user-> rank ();

Phương pháp thứ hạng()được sử dụng ở đây vì các số thường được lưu trữ trong cơ sở dữ liệu (0 đối với người dùng bình thường, 1 đối với quản trị viên) và chúng tôi cần chuyển đổi dữ liệu này thành các trạng thái mà chúng thuộc về, đó là những gì phương pháp này giúp chúng tôi.

Để đặt một người dùng thông thường làm quản trị viên, chỉ cần chỉnh sửa mục nhập của người dùng thông qua phpMyAdmin (hoặc bất kỳ chương trình nào khác cho phép bạn quản lý cơ sở dữ liệu). Trạng thái quản trị viên không cung cấp bất kỳ đặc quyền nào, trong ví dụ này, trang sẽ hiển thị rằng bạn là quản trị viên - và thế là xong.

Nhưng phải làm gì với nó - tùy theo quyết định của bạn, bạn có thể tự viết và soạn mã để đặt ra những đặc quyền và cơ hội nhất định cho quản trị viên.

Đã được thực hiện!

Với hình dạng cực kỳ siêu đơn giản này, chúng ta đã hoàn thành! Bạn có thể sử dụng nó trong các trang web PHP của mình, nó khá đơn giản. Bạn cũng có thể sửa đổi nó cho chính mình và làm cho nó theo cách bạn muốn.

Tài liệu được chuẩn bị bởi Denis Malyshok đặc biệt cho trang web

P.S. Bạn có muốn tiến xa hơn trong việc thành thạo PHP và OOP không? Hãy xem các hướng dẫn cao cấp về các khía cạnh khác nhau của việc xây dựng trang web, bao gồm cả lập trình PHP, cũng như khóa học miễn phí về xây dựng hệ thống PHP CMS của bạn từ đầu bằng OOP:

Thích tài liệu và muốn cảm ơn?
Chỉ cần chia sẻ với bạn bè và đồng nghiệp của bạn!


Xin chào! Bây giờ chúng tôi sẽ cố gắng thực hiện đăng ký đơn giản nhất trên trang web bằng PHP + MySQL. Để làm điều này, Apache phải được cài đặt trên máy tính của bạn. Cách hoạt động của tập lệnh của chúng tôi được hiển thị bên dưới.

1. Hãy bắt đầu bằng cách tạo bảng người dùng trong cơ sở dữ liệu. Nó sẽ chứa dữ liệu người dùng (đăng nhập và mật khẩu). Hãy truy cập phpmyadmin (nếu bạn tạo cơ sở dữ liệu trên PC của mình http: // localhost / phpmyadmin /). Tạo bảng người dùng, nó sẽ có 3 trường.

Tôi tạo nó trong cơ sở dữ liệu mysql, bạn có thể tạo nó trong một cơ sở dữ liệu khác. Tiếp theo, đặt các giá trị, như trong hình:

2. Cần có kết nối với bảng này. Hãy tạo một tệp bd.php. Nội dung của nó:

$ db = mysql_connect ("máy chủ MySQL của bạn", "đăng nhập vào máy chủ này", "mật khẩu vào máy chủ này");
mysql_select_db ("tên cơ sở dữ liệu cần kết nối", $ db);
?>

Trong trường hợp của tôi, nó trông như thế này:

$ db = mysql_connect ("localhost", "người dùng", "1234");
mysql_select_db ("mysql", $ db);
?>

Chúng tôi tiết kiệm bd.php.
Xuất sắc! Chúng tôi có một bảng trong cơ sở dữ liệu, một kết nối với nó. Bây giờ bạn có thể bắt đầu tạo một trang nơi người dùng sẽ để lại dữ liệu của họ.

3. Tạo một tệp reg.php với nội dung (tất cả các nhận xét bên trong):



Sự đăng ký


Sự đăng ký
















4. Tạo tệp, sẽ nhập dữ liệu vào cơ sở dữ liệu và lưu người dùng. save_user.php(ý kiến ​​bên trong):



{
}
// nếu thông tin đăng nhập và mật khẩu được nhập, thì chúng tôi sẽ xử lý chúng để các thẻ và tập lệnh không hoạt động, bạn không bao giờ biết những gì mọi người có thể nhập


// xóa các khoảng trắng thừa
$ đăng nhập = trim ($ đăng nhập);
$ password = trim ($ mật khẩu);
// kết nối với cơ sở dữ liệu
// kiểm tra sự tồn tại của người dùng có cùng thông tin đăng nhập
$ result = mysql_query ("CHỌN id TỪ người dùng TẠI ĐÂU đăng nhập =" $ đăng nhập "", $ db);
if (! rỗng ($ myrow ["id"])) (
exit ("Xin lỗi, tên người dùng bạn nhập đã được đăng ký. Vui lòng nhập tên người dùng khác.");
}
// nếu không có thì lưu dữ liệu
$ result2 = mysql_query ("CHÈN VÀO người dùng (đăng nhập, mật khẩu) GIÁ TRỊ (" $ đăng nhập "," $ password ")");
// Kiểm tra xem có lỗi không
if ($ result2 == "TRUE")
{
echo "Bạn đã đăng ký thành công! Bây giờ bạn có thể vào trang web. Trang chính";
}
khác(
echo "Lỗi! Bạn chưa đăng nhập.";
}
?>

5. Bây giờ người dùng của chúng tôi có thể đăng ký! Tiếp theo, bạn cần tạo một "cửa" để vào trang web cho những người đã đăng ký. index.php(ý kiến ​​bên trong):

// toàn bộ thủ tục hoạt động trên các phiên. Nó nằm trong đó dữ liệu của người dùng được lưu trữ trong khi anh ta ở trên trang web. Điều rất quan trọng là phải khởi chạy chúng ở đầu trang !!!
session_start ();
?>


Trang chính


Trang chính











Đăng ký



// Kiểm tra xem biến đăng nhập và id người dùng có trống không
nếu (trống ($ _ SESSION ["đăng nhập"]) hoặc trống ($ _ SESSION ["id"]))
{
// Nếu trống, chúng tôi không hiển thị liên kết
echo "Bạn đã đăng nhập với tư cách khách
Liên kết này chỉ có sẵn cho người dùng đã đăng ký ";
}
khác
{

Trong tập tin index.php chúng tôi sẽ hiển thị một liên kết sẽ chỉ mở cho người dùng đã đăng ký. Đây là toàn bộ điểm của tập lệnh - để hạn chế quyền truy cập vào bất kỳ dữ liệu nào.

6. Có một tập tin xác minh thông tin đăng nhập và mật khẩu đã nhập. testreg.php (bình luận bên trong):

session_start (); // toàn bộ thủ tục hoạt động trên các phiên. Nó nằm trong đó dữ liệu của người dùng được lưu trữ trong khi anh ta ở trên trang web. Điều rất quan trọng là phải khởi chạy chúng ở đầu trang !!!
if (Isset ($ _ POST ["login"])) ($ login = $ _POST ["login"]; if ($ login == "") (unset ($ login);)) // đặt thông tin đăng nhập bằng người dùng vào biến $ login, nếu nó trống, thì chúng tôi hủy biến
if (Isset ($ _ POST ["password"])) ($ password = $ _ POST ["password"]; if ($ password == "") (unset ($ password);))
// đưa mật khẩu do người dùng nhập vào biến $ password, nếu trống thì hủy biến
if (trống ($ đăng nhập) hoặc trống ($ mật khẩu)) // nếu người dùng chưa nhập thông tin đăng nhập hoặc mật khẩu, thì chúng tôi sẽ đưa ra lỗi và dừng tập lệnh
{
exit ("Bạn đã không nhập tất cả thông tin, hãy quay lại và điền vào tất cả các trường!");
}
// nếu thông tin đăng nhập và mật khẩu được nhập, thì chúng tôi sẽ xử lý chúng để các thẻ và tập lệnh không hoạt động, bạn không bao giờ biết những gì mọi người có thể nhập
$ đăng nhập = dải băng ($ đăng nhập);
$ login = htmlspecialchars ($ đăng nhập);
$ password = striplashes ($ password);
$ password = htmlspecialchars ($ password);
// xóa các khoảng trắng thừa
$ đăng nhập = trim ($ đăng nhập);
$ password = trim ($ mật khẩu);
// kết nối với cơ sở dữ liệu
include ("bd.php"); // tệp bd.php phải nằm trong cùng thư mục với những người khác, nếu không phải thì chỉ cần thay đổi đường dẫn

$ result = mysql_query ("CHỌN * TỪ người dùng WHERE đăng nhập =" $ đăng nhập "", $ db); // truy xuất tất cả dữ liệu về người dùng với thông tin đăng nhập đã nhập từ cơ sở dữ liệu
$ myrow = mysql_fetch_array ($ kết quả);
if (trống ($ myrow ["password"]))
{
// nếu người dùng có thông tin đăng nhập đã nhập không tồn tại
}
khác(
// nếu tồn tại, hãy kiểm tra mật khẩu
if ($ myrow ["password"] == $ password) (
// nếu mật khẩu khớp, thì chúng tôi bắt đầu phiên cho người dùng! Bạn có thể chúc mừng anh ấy, anh ấy đã bước vào!
$ _SESSION ["đăng nhập"] = $ myrow ["đăng nhập"];
$ _SESSION ["id"] = $ myrow ["id"]; // dữ liệu này rất thường được sử dụng, vì vậy người dùng đã đăng nhập sẽ "mang theo" chúng
echo "Bạn đã đăng nhập thành công vào trang web! Trang chính";
}
khác(
// nếu mật khẩu không khớp

Exit ("Xin lỗi, thông tin đăng nhập hoặc mật khẩu bạn đã nhập không chính xác.");
}
}
?>

OK, tất cả đã kết thúc! Có thể bài học nhàm chán, nhưng rất hữu ích. Chỉ ý tưởng đăng ký được hiển thị ở đây, sau đó bạn có thể cải thiện nó: thêm bảo vệ, thiết kế, trường dữ liệu, tải lên hình đại diện, đăng xuất khỏi tài khoản của bạn (đối với điều này, chỉ cần hủy các biến khỏi phiên bằng hàm không đặt) và như thế. Chúc may mắn!

Đã kiểm tra mọi thứ, nó hoạt động tốt!

Quá trình tạo một hệ thống đăng ký là khá nhiều công việc. Bạn cần viết mã kiểm tra tính hợp lệ của địa chỉ email, gửi email xác nhận, cung cấp khôi phục mật khẩu, lưu trữ mật khẩu ở nơi an toàn, xác thực biểu mẫu nhập và hơn thế nữa. Ngay cả khi bạn làm tất cả những điều này, người dùng sẽ miễn cưỡng đăng ký, vì ngay cả những đăng ký tối thiểu nhất cũng yêu cầu hoạt động của họ.

Trong hướng dẫn hôm nay, chúng ta sẽ phát triển một hệ thống đăng nhập đơn giản mà bạn không cần mật khẩu! Kết quả là chúng ta sẽ có được một hệ thống có thể dễ dàng sửa đổi hoặc tích hợp vào một trang PHP hiện có. Nếu bạn quan tâm, hãy tiếp tục đọc.

PHP

Bây giờ chúng ta đã sẵn sàng chuyển sang mã PHP. Chức năng chính của hệ thống đăng ký được cung cấp bởi lớp Người dùng, bạn có thể xem bên dưới. Lớp sử dụng (), là một thư viện cơ sở dữ liệu tối giản. Lớp Người dùng chịu trách nhiệm truy cập cơ sở dữ liệu, tạo mã thông báo để đăng nhập và xác thực chúng. Nó cung cấp cho chúng tôi một giao diện đơn giản có thể dễ dàng kết hợp vào hệ thống đăng ký trên các trang web dựa trên PHP của bạn.

user.class.php

// Cá thể ORM riêng tư
riêng $ orm;

/**
* Tìm người dùng bằng chuỗi mã thông báo. Chỉ những mã thông báo hợp lệ mới được đưa vào
* Sự xem xét. Mã thông báo có hiệu lực trong 10 phút sau khi được tạo.
* @param string $ token Mã thông báo cần tìm kiếm
* @returnUser
*/

public static function findByToken ($ token) (

// tìm nó trong cơ sở dữ liệu và đảm bảo rằng dấu thời gian là chính xác


-> ở đâu ("mã thông báo", $ mã thông báo)
-> where_raw ("token_validity> NOW ()")
-> find_one ();

Nếu (! $ Kết quả) (
trả về sai;
}

Trả lại người dùng mới ($ kết quả);
}

/**
* Đăng nhập hoặc đăng ký người dùng.
* @returnUser
*/

Đăng nhập chức năng tĩnh công khaiOrRegister ($ email) (

// Nếu người dùng như vậy đã tồn tại, hãy trả lại

Nếu (Người dùng :: tồn tại ($ email)) (
trả lại Người dùng mới ($ email);
}

// Nếu không, hãy tạo nó và trả về

Người dùng trở lại :: tạo ($ email);
}

/**
* Tạo người dùng mới và lưu vào cơ sở dữ liệu
* @param string $ email Địa chỉ email của người dùng
* @returnUser
*/

Tạo hàm tĩnh riêng tư ($ email) (

// Ghi một người dùng mới vào cơ sở dữ liệu và trả về

$ result = ORM :: for_table ("reg_users") -> create ();
$ result-> email = $ email;
$ result-> save ();

Trả lại người dùng mới ($ kết quả);
}

/**
* Kiểm tra xem người dùng như vậy có tồn tại trong cơ sở dữ liệu hay không và trả về boolean.
* @param string $ email Địa chỉ email của người dùng
* @return boolean
*/

Chức năng tĩnh công khai tồn tại ($ email) (

// Người dùng có tồn tại trong cơ sở dữ liệu không?
$ result = ORM :: for_table ("reg_users")
-> ở đâu ("email", $ email)
-> count ();

trả về $ kết quả == 1;
}

/**
* Tạo một đối tượng người dùng mới
* @param $ param phiên bản ORM, id, email hoặc null
* @returnUser
*/

Hàm công khai __construct ($ param = null) (

If ($ param instanceof ORM) (

// Một phiên bản ORM đã được thông qua
$ this-> orm = $ param;
}
else if (is_string ($ param)) (

// Một email đã được thông qua
$ this->
-> ở đâu ("email", $ param)
-> find_one ();
}
khác(

If (is_numeric ($ param)) (
// Một id người dùng đã được chuyển dưới dạng một tham số
$ id = $ param;
}
else if (Isset ($ _ SESSION ["loginid"])) (

// Không có ID người dùng nào được chuyển, hãy xem phiên
$ id = $ _SESSION ["loginid"];
}

$ this-> orm = ORM :: for_table ("reg_users")
-> where ("id", $ id)
-> find_one ();
}

/**
* Tạo mã thông báo đăng nhập SHA1 mới, ghi vào cơ sở dữ liệu và trả về.
* Chuỗi @return
*/

Hàm công khai createToken () (
// tạo mã thông báo cho người dùng đã đăng nhập. Lưu nó vào cơ sở dữ liệu.

$ token = sha1 ($ this-> email.time (). rand (0, 1000000));

// Lưu mã thông báo vào cơ sở dữ liệu,
// và đánh dấu nó là hợp lệ chỉ trong 10 phút tới

$ this-> orm-> set ("mã thông báo", $ mã thông báo);
$ this-> orm-> set_expr ("token_validity", "ADDTIME (NOW ()," 0:10 ")");
$ this-> orm-> save ();

Trả lại $ token;
}

/**
* Đăng nhập người dùng này
* @return void
*/

đăng nhập chức năng công khai () (

// Đánh dấu người dùng là đã đăng nhập
$ _SESSION ["loginid"] = $ this-> orm-> id;

// Cập nhật trường db last_login
$ this-> orm-> set_expr ("last_login", "NOW ()");
$ this-> orm-> save ();
}

/**
* Hủy phiên và đăng xuất người dùng.
* @return void
*/

chức năng công khai đăng xuất () (
$ _SESSION = array ();
unset ($ _ SESSION);
}

/**
* Kiểm tra xem người dùng đã đăng nhập chưa.
* @return boolean
*/

Hàm công khai loggedIn () (
return Isset ($ this-> orm-> id) && $ _SESSION ["loginid"] == $ this-> orm-> id;
}

/**
* Kiểm tra xem người dùng có phải là quản trị viên hay không
* @return boolean
*/

Hàm công khai isAdmin () (
return $ this-> rank () == "quản trị viên";
}

/**
* Tìm kiểu người dùng. Nó có thể là quản trị viên hoặc thông thường.
* Chuỗi @return
*/

cấp bậc hàm công cộng () (
if ($ this-> orm-> rank == 1) (
trả lại "quản trị viên";
}

Trả về "thông thường";
}

/**
* Phương pháp ma thuật để truy cập các phần tử của private
* Phiên bản $ orm làm thuộc tính của đối tượng người dùng
* @param string $ key Tên thuộc tính được truy cập
* @return hỗn hợp
*/

Hàm công khai __get ($ key) (
if (Isset ($ this-> orm -> $ key)) (
return $ this-> orm -> $ key;
}

trả về null;
}
}
Mã thông báo được tạo bằng thuật toán và được lưu trữ trong cơ sở dữ liệu. Chúng tôi sử dụng từ MySQL để đặt giá trị trong cột token_validity thành 10 phút. Khi xác thực mã thông báo, chúng tôi nói với động cơ rằng chúng tôi cần mã thông báo, trường token_validity vẫn chưa hết hạn. Do đó, chúng tôi giới hạn thời gian mã thông báo có hiệu lực.

Lưu ý rằng chúng ta sử dụng phương thức magic __get () ở cuối tài liệu để truy cập các thuộc tính của đối tượng người dùng. Điều này cho phép chúng tôi truy cập dữ liệu được lưu trữ trong cơ sở dữ liệu dưới dạng các thuộc tính: $ user-> email, $ user-> token. Để làm ví dụ, hãy xem cách chúng ta có thể sử dụng lớp này trong đoạn mã sau:


Một tệp khác lưu trữ các chức năng cần thiết là functions.php. Ở đó chúng tôi có một số chức năng trợ giúp cho phép chúng tôi giữ phần còn lại của mã gọn gàng hơn.

Functions.php

Hàm send_email ($ from, $ to, $ subject, $ message) (

// Chức năng trợ giúp để gửi email

$ headers = "MIME-Phiên bản: 1.0". "\ r \ n";
$ headers. = "Loại nội dung: văn bản / trơn; charset = utf-8". "\ r \ n";
$ headers. = "Từ:". $ từ. "\ r \ n";

trả lại thư ($ tới, $ chủ đề, $ message, $ headers);
}

function get_page_url () (

// Tìm ra URL của một tệp PHP

$ url = "http". (trống ($ _ SERVER ["HTTPS"])? "": "s"). ": //". $ _ SERVER ["SERVER_NAME"];

If (Isset ($ _ SERVER ["REQUEST_URI"]) && $ _SERVER ["REQUEST_URI"]! = "") (
$ url. = $ _SERVER ["REQUEST_URI"];
}
khác(
$ url. = $ _SERVER ["PATH_INFO"];
}

Trả lại $ url;
}

function rate_limit ($ ip, $ limit_hour = 20, $ limit_10_min = 10) (

// Số lần đăng nhập trong giờ qua bằng địa chỉ IP này

$ count_hour = ORM :: for_table ("reg_login_attempt")
->
-> where_raw ("ts> SUBTIME (NOW ()," 1:00 ")")
-> count ();

// Số lần đăng nhập trong 10 phút qua bằng địa chỉ IP này

$ count_10_min = ORM :: for_table ("reg_login_attempt")
-> where ("ip", sprintf ("% u", ip2long ($ ip)))
-> where_raw ("ts> SUBTIME (NOW ()," 0:10 ")")
-> count ();

Nếu ($ count_hour> $ limit_hour || $ count_10_min> $ limit_10_min) (
ném ngoại lệ mới ("Quá nhiều lần đăng nhập!");
}
}

function rate_limit_tick ($ ip, $ email) (

// Tạo một bản ghi mới trong bảng thử đăng nhập

$ login_attempt = ORM :: for_table ("reg_login_attempt") -> create ();

$ login_attempt-> email = $ email;
$ login_attempt-> ip = sprintf ("% u", ip2long ($ ip));

$ login_attempt-> save ();
}

chuyển hướng hàm ($ url) (
header ("Vị trí: $ url");
lối ra;
}
Các hàm rate_limit và rate_limit_tick cho phép chúng tôi giới hạn số lần ủy quyền trong một khoảng thời gian nhất định. Các nỗ lực cấp phép được ghi lại trong cơ sở dữ liệu reg_login_attempt. Các chức năng này được chạy khi biểu mẫu đăng nhập được gửi, như bạn có thể thấy trong đoạn mã sau.

Đoạn mã dưới đây được lấy từ index.php và nó có trách nhiệm xác thực biểu mẫu đăng nhập. Nó trả về một phản hồi JSON được điều khiển bởi mã jQuery mà chúng ta đã thấy trong tài sản / js / script.js.

index.php

If (! Blank ($ _ POST) && Isset ($ _ SERVER ["HTTP_X_REQUESTED_WITH"])) (

// Xuất tiêu đề JSON

Header ("Loại nội dung: application / json");

// Địa chỉ email có hợp lệ không?

If (! Isset ($ _ POST ["email"]) ||! Filter_var ($ _ POST ["email"], FILTER_VALIDATE_EMAIL)) (
ném ngoại lệ mới ("Vui lòng nhập một email hợp lệ.");
}

// Điều này sẽ ném ra một ngoại lệ nếu người đó ở trên
// giới hạn lần đăng nhập được phép (xem functions.php để biết thêm):
rate_limit ($ _ SERVER ["REMOTE_ADDR"]);

// Ghi lại nỗ lực đăng nhập này
rate_limit_tick ($ _ SERVER ["REMOTE_ADDR"], $ _POST ["email"]);

// Gửi tin nhắn cho người dùng

$ message = "";
$ email = $ _POST ["email"];
$ subject = "Liên kết đăng nhập của bạn";

Nếu (! Người dùng :: tồn tại ($ email)) (
$ subject = "Cảm ơn bạn đã đăng ký!";
$ message = "Cảm ơn bạn đã đăng ký tại trang web của chúng tôi! \ n \ n";
}

// Cố gắng đăng nhập hoặc đăng ký người
$ user = User :: loginOrRegister ($ _ POST ["email"]);

$ message. = "Bạn có thể đăng nhập từ URL này: \ n";
$ message. = get_page_url (). "? tkn =". $ user-> createToken (). "\ n \ n";

$ message. = "Liên kết sẽ tự động hết hạn sau 10 phút.";

$ result = send_email ($ fromEmail, $ _POST ["email"], $ chủ đề, $ tin nhắn);

Nếu (! $ Kết quả) (
ném ngoại lệ mới ("Đã xảy ra lỗi khi gửi email của bạn. Vui lòng thử lại.");
}

Die (json_encode (array (
"message" => "Cảm ơn bạn! Chúng tôi" đã gửi một liên kết đến hộp thư đến của bạn. Kiểm tra cả thư mục thư rác của bạn. "
)));
}
}
bắt (Ngoại lệ $ e) (

Die (json_encode (array (
"error" => 1,
"message" => $ e-> getMessage ()
)));
}
Sau khi ủy quyền hoặc đăng ký thành công, mã trên sẽ gửi email đến một người có liên kết để ủy quyền. Mã thông báo (token) trở nên khả dụng dưới dạng biến $ _GET "tkn" do URL được tạo.

index.php

If (Isset ($ _ GET ["tkn"])) (

// Đây có phải là mã thông báo đăng nhập hợp lệ không?
$ user = Người dùng :: findByToken ($ _ GET ["tkn"]);

//Đúng! Đăng nhập người dùng và chuyển hướng đến trang được bảo vệ.

$ user-> login ();
redirect ("protected.php");
}

// Mã không hợp lệ. Chuyển hướng trở lại biểu mẫu đăng nhập.
redirect ("index.php");
}
Chạy $ user-> login () sẽ tạo các biến cần thiết cho phiên, cho phép người dùng tiếp tục đăng nhập vào các lần đăng nhập tiếp theo.

Đăng xuất khỏi hệ thống được thực hiện theo cách gần giống như sau:

Index.php

If (Isset ($ _ GET ["đăng xuất"])) (

$ user = new User ();

If ($ user-> loggedIn ()) (
$ user-> logout ();
}

redirect ("index.php");
}
Ở cuối đoạn mã, chúng tôi lại chuyển hướng người dùng đến index.php, do đó, tham số? Logout = 1 trong URL bị loại trừ.

Tệp index.php của chúng tôi cũng sẽ cần được bảo vệ - chúng tôi không muốn người dùng đã đăng nhập xem biểu mẫu. Để làm điều này, chúng tôi sử dụng phương thức $ user-> loggedIn ():

Index.php

$ user = new User ();

if ($ user-> loggedIn ()) (
redirect ("protected.php");
}
Cuối cùng, hãy xem cách bạn có thể bảo mật một trang trên trang web của mình và chỉ cung cấp trang đó sau khi bạn đăng nhập:

protected.php

// Để bảo vệ bất kỳ trang php nào trên trang web của bạn, hãy bao gồm main.php
// và tạo một đối tượng Người dùng mới. Nó đơn giản mà!

request_once "bao gồm / main.php";

$ user = new User ();

if (! $ user-> loggedIn ()) (
redirect ("index.php");
}
Sau khi kiểm tra này, bạn có thể chắc chắn rằng người dùng đã đăng nhập thành công. Bạn cũng sẽ có quyền truy cập vào dữ liệu được lưu trữ trong cơ sở dữ liệu dưới dạng thuộc tính của đối tượng $ user. Để hiển thị email của người dùng và xếp hạng của họ, hãy sử dụng mã sau:

echo "Email của bạn:". $ user-> email;
echo "Xếp hạng của bạn:". $ user-> rank ();
Ở đây, rank () là một phương thức vì cột xếp hạng trong cơ sở dữ liệu thường chứa các số (0 cho người dùng bình thường và 1 cho quản trị viên), và chúng ta cần chuyển tất cả những thứ này thành tên thứ hạng, được thực hiện bằng phương pháp này. Để chuyển đổi người dùng bình thường thành quản trị viên, chỉ cần chỉnh sửa mục nhập người dùng trong phpmyadmin (hoặc bất kỳ chương trình cơ sở dữ liệu nào khác). Là một quản trị viên, người dùng sẽ không được ưu đãi với bất kỳ khả năng đặc biệt nào. Bản thân bạn có quyền lựa chọn những quyền nào để trao cho quản trị viên.

Sẳn sàng!

Về điều này, hệ thống đăng ký đơn giản của chúng tôi đã sẵn sàng! Bạn có thể sử dụng nó trên một trang PHP hiện có hoặc bạn có thể nâng cấp nó theo nhu cầu của riêng mình.