Chúng tôi viết đăng ký bằng php. Tạo một hệ thống đăng ký người dùng đơn giản trong PHP và MySQL

Việc tạo một trang web dựa trên thành viên ban đầu có vẻ như là một nhiệm vụ khó khăn. Nếu bạn từng muốn tự mình làm việc này nhưng lại từ bỏ khi bắt đầu nghĩ về cách kết hợp nó bằng 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 ta 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 vào khu vực bảo mật.

Tải mã xuống

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 hướng dẫn chi tiết.

Mở nguồn\include\membersite_config.php tập tin 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, địa chỉ email và tên người dùng mong muốn của anh ấy và mật khẩu. 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 biểu mẫu dài luôn gây khó chịu. Vì vậy, hãy giới hạn bản thân trong những lĩnh vực đó.

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

Đăng ký Tên đầy đủ của bạn*: Địa chỉ Email*: Tên người dùng*: Mật khẩu*:

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 mẫu

Tại thời điểm này, bạn nên đặt một số mã xác thực biểu mẫu để đả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 ta cần kiểm tra xem tên, email và mật khẩu đã được điền chưa và email có ở định dạng phù hợp 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):

hàm 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 thực hiện việc này trước khi gửi email, lưu vào cơ sở dữ liệu, v.v.). Việc gửi biểu mẫu sau đó được lưu vào bảng cơ sở dữ liệu. Chúng tôi gửi 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à người dùng đã đăng ký.

Lưu dữ liệu vào 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("Database login failed!"); 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,"username")) ( $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; ) trả về 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 membersite_config.php. Hầu hết các trường hợp, bạn có thể sử dụng “localhost” làm máy chủ cơ sở dữ liệu.
Sau khi đăng nhập, chúng ta kiểm tra xem bảng đã tồn tại chưa. (Nếu không, script sẽ tạo bảng theo yêu cầu).
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 sẽ 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 sẽ tạo bảng. Đây là mã:

function CreateTable() ( $qry = "Tạo bảng $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 ," "tên người dùng VARCHAR(16) NOT NULL ," "mật khẩu 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 was\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 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 thức 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ã 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ó tất cả dữ liệu có sẵn trong mảng $formvars.

hàm InsertIntoDB(&$formvars) ( $confirmcode = $this->MakeConfirmationMd5($formvars["email"]); $insert_query = "insert to ".$this->tablename."(name, email, username, pass, confirmcode) giá trị ("" . $this->SanitizeForSQL($formvars["name"]) . "", "" . $this->SanitizeForSQL($formvars["email"]) . "", "" . $ this->SanitizeForSQL($formvars["username"]) . "", "" . md5($formvars["password"]) . "", "" . $confirmcode . "")"; if(! mysql_query( $insert_query ,$this->connection)) ( $this->HandleDBError("Lỗi 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 PHP md5() để 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 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ý.

hàm 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" ])); $confirm_url = $this->GetAbsoluteURLFolder()."/confirmreg.php?code=".$confirmcode; $mailer->Body ="Xin chào ".$formvars["name"]."\r\ n\r\n." "Cảm ơn cho 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". "$confirm_url\r\n". "\r\n". "Trân trọng,\r\n". "Webmaster\r\n". $this->sitename; if(!$mailer->Send()) ( $this->HandleError("Không gửi được email xác nhận đăng ký.") ; trả về sai; ) trả về đúng; )

Cập nhật

Ngày 9 tháng 1 năm 2012
Tính năng Đặt lại mật khẩu/Đổ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ại!

Giấy phép


Mã được chia sẻ theo giấy phép LGPL. Bạn có thể tự do 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.

Các biểu mẫu HTML là các thành phần giao diện phức tạp. Chúng bao gồm các thành phần chức năng khác nhau: trường nhập, danh sách, chú giải công cụ, v.v. Tất cả mã biểu mẫu đều được chứa trong tệp .

Hầu hết thông tin biểu mẫu web được truyền tải bằng phần mở rộng . Để nhập một dòng văn bản, phần tử được sử dụng; đối với nhiều dòng, phần tử được sử dụng. Phần tử tạo một danh sách thả xuống.

Phần tử tạo nhãn cho các trường biểu mẫu. Có hai cách để nhóm nhãn và trường. Nếu trường nằm trong một phần tử thì không cần chỉ định thuộc tính for.

Họ Họ Họ Tên

Các trường biểu mẫu có thể được chia thành các khối logic bằng cách sử dụng phần tử. Mỗi phần có thể được đặt tên bằng cách sử dụng phần tử.

Thông tin liên lạc Tên Email
Cơm. 1. Nhóm các trường biểu mẫu

Để làm cho biểu mẫu dễ hiểu hơn đối với người dùng, văn bản sẽ được thêm vào các trường của biểu mẫu để cung cấp ví dụ về dữ liệu đầu vào. Loại văn bản này được gọi là văn bản ký tự đại diện và được tạo bằng thuộc tính giữ chỗ.

Các trường bắt buộc cũng phải được đánh dấu. Trước HTML5, ký hiệu dấu hoa thị * được sử dụng bên cạnh tên trường. Thông số kỹ thuật mới giới thiệu một thuộc tính bắt buộc đặc biệt, cho phép bạn đánh dấu trường bắt buộc ở cấp độ đánh dấu. Thuộc tính này hướng dẫn trình duyệt (giả sử nó hỗ trợ HTML5) không gửi dữ liệu sau khi người dùng nhấp vào gửi cho đến khi các trường được chỉ định được hoàn thành.

Để thay đổi diện mạo trương Văn bản Khi nhận được tiêu điểm, lớp giả tiêu điểm sẽ được sử dụng. Ví dụ: bạn có thể làm nền của trường hiện tại tối hơn hoặc thêm khung màuđể làm cho nó nổi bật so với phần còn lại:

Đầu vào: tiêu điểm ( nền: #eaeaea; )

Một thuộc tính HTML5 hữu ích khác là thuộc tính tự động lấy nét. Nó cho phép bạn tự động đặt tiêu điểm vào trường ban đầu mong muốn cho các phần tử và (chỉ một phần tử của mỗi biểu mẫu).

Ví dụ tạo form đăng ký

đánh dấu HTML

Tên đăng ký Giới tính nam nữ E-mail Quốc gia Chọn quốc gia cư trú Nga Ukraina Belarus Gửi

Ghi chú
action="form.php" - liên kết đến tệp xử lý biểu mẫu. Tạo một tệp ở dạng mã hóa UTF-8, tải nó lên máy chủ và thay thế action="form.php" bằng đường dẫn đến tệp trên máy chủ của bạn.


Cơm. 2. Vẻ bề ngoài biểu mẫu mặc định

Như bạn có thể thấy trong hình, mỗi thành phần của biểu mẫu có kiểu trình duyệt mặc định. Hãy xóa các kiểu và tạo kiểu cho các thành phần của biểu mẫu.

Bao bọc biểu mẫu ( width: 550px; nền: #ffd500; bán kính đường viền: 20px; ) .form-wrap *(transition: .1s tuyến tính) .profile ( width: 240px; float: left; text-align: center; phần đệm : 30px; ) dạng ( nền: trắng; float: left; width: calc(100% - 240px); đệm: 30px; bán kính đường viền: 0 20px 20px 0; màu: #7b7b7b; ) .form-wrap:after, biểu mẫu div:after ( nội dung: ""; display: bảng; clear: cả hai; ) biểu mẫu div ( lề-dưới: 15px; vị trí: tương đối; ) h1 ( cỡ chữ: 24px; trọng lượng phông chữ: 400; vị trí: tương đối ; lề trên: 50px; ) h1:after ( nội dung: "\f138"; cỡ chữ: 40px; họ phông chữ: FontAwesome; vị trí: tuyệt đối; trên cùng: 50px; trái: 50%; biến đổi: dịchX(-50 %); ) /********************* kiểu dáng của các phần tử biểu mẫu ******************* * **/ nhãn, span ( display: block; font-size: 14px; Margin-bottom: 8px; ) input, input ( border-width: 0; Outline: none; Margin: 0; width: 100%; đệm: 10px 15px; nền: #e6e6e6; ) input:focus, input:focus ( box-shadow: inset 0 0 0 2px rgba(0,0,0,.2); ) .radio label ( vị trí: tương đối; phần đệm bên trái: 50px; con trỏ: con trỏ; chiều rộng: 50%; float: trái; chiều cao dòng: 40px; ) .radio đầu vào ( vị trí: tuyệt đối; độ mờ: 0; ) .radio -control ( vị trí: tuyệt đối; trên cùng: 0; trái: 0; chiều cao: 40px; chiều rộng: 40px; nền: #e6e6e6; bán kính đường viền: 50%; căn chỉnh văn bản: giữa; ) .male:trước ( nội dung: " \f222"; họ phông chữ: FontAwesome; font-weight: đậm; ) .female:trước ( nội dung: "\f221"; họ phông chữ: FontAwesome; font-weight: đậm; ) .radio label:hover input ~ . radio-control, .radiol input:focus ~ .radio-control ( box-shadow: inset 0 0 0 2px rgba(0,0,0,.2); ) .radio input:checked ~ .radio-control ( color: đỏ; ) chọn ( width: 100%; con trỏ: con trỏ; phần đệm: 10px 15px; đường viền: 0; đường viền: 0; nền: #e6e6e6; màu: #7b7b7b; -webkit-appearance: none; /* bỏ chọn webkit -browsers */ -moz-appearance: none; /*bỏ chọn trong Mozilla Firefox*/ ) select::-ms-expand ( display: none; /*bỏ chọn trong IE*/ ) .select-arrow ( location: tuyệt đối ; trên cùng: 38px; phải: 15px; chiều rộng: 0; chiều cao: 0; sự kiện con trỏ: không có; /*kích hoạt hiển thị danh sách khi bạn nhấp vào mũi tên*/ border-style: Solid; chiều rộng đường viền: 8px 5px 0 5px; màu viền: #7b7b7b trong suốt trong suốt trong suốt; ) nút ( đệm: 10px 0; chiều rộng đường viền: 0; hiển thị: khối; chiều rộng: 120px; lề: 25px tự động 0; nền: #60e6c5; màu: trắng; cỡ chữ: 14px; phác thảo: không có; chuyển đổi văn bản : chữ hoa; ) /********************* thêm khả năng thích ứng với biểu mẫu ******************* ** **/ @media (max-width: 600px) ( .form-wrap (margin: 20px auto; max-width: 550px; width:100%;) .profile, form (float: none; width: 100% ;) dạng h1 (lề trên: auto; phần đệm dưới: 50px;) (bán kính đường viền: 0 0 20px 20px;) )

Tệp Form.php

Ghi chú
Trong biến $subject, chỉ định văn bản sẽ được hiển thị làm tiêu đề của bức thư;
Your_name - tại đây bạn có thể chỉ định tên sẽ được hiển thị trong trường “bức thư đến từ ai”;
thay thế your_site_url bằng địa chỉ của trang web bằng mẫu đăng ký;
thay thế your_email bằng địa chỉ của bạn E-mail;
$headers .= "Bcc: your_email". "\r\n"; gửi bccđến địa chỉ email của bạn.

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

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 đang tạo cơ sở dữ liệu trên PC của mình http://localhost/phpmyadmin/). Chúng ta tạo một bảng user , 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 cơ sở dữ liệu khác. Tiếp theo, thiết lập 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ó:

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

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

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



Sự đăng ký


Sự đăng ký


Đăng nhập của bạn:




Mật khẩu của bạn:








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 (bình luận bên trong):

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ánh cửa” cho những người dùng đã đăng ký để vào trang web. index.php (bình luận bên trong):




Trang chủ


Trang chủ


Đăng nhập của bạn:


Mật khẩu của bạn:






Đăng ký



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

Tôi đã kiểm tra mọi thứ, nó hoạt động bình thường!

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

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

Hơn 2 triệu tên miền đang được sử dụng.

Khuyến mãi, mail tên miền, giải pháp kinh doanh.

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

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

Quay lại 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 ra 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ý, đồng thời xác thực các trường biểu mẫu khác, v.v.

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ì... điều này đò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 ký rất đơn giản mà hoàn toàn không yêu cầu hoặc lưu trữ mật khẩu! Kết quả sẽ dễ dàng sửa đổi và thêm vào trang PHP hiện có. Bạn muốn tìm hiểu nó hoạt động như thế nào? Đọc dưới đây.



Đâ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 hình thức ủy quyền và đăng ký. Biểu mẫu này sẽ có trường để nhập địa chỉ email của bạn và nút đăng ký;
- Khi điền địa chỉ email vào trường, nhấp vào nút đăng ký sẽ tạo bản ghi về người dùng mới, nhưng chỉ khi không tìm thấy địa chỉ email đã nhập trong cơ sở dữ liệu.

Sau đó, một bộ ký tự (mã thông báo) duy nhất ngẫu nhiên được tạo, được gửi đến email do người dùng chỉ định dưới dạng liên kết sẽ có liên quan trong 10 phút;
- Liên kết đưa người dùng đến 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 hoặc xác thực các trường;
- Không cần lấy lại mật khẩu, câu hỏi bảo mật vân vân.;
- 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 (địa chỉ email đó là đúng);
- Quá trình đăng ký cực kỳ đơn giản;

Sai sót:

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, họ 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 quên mật khẩu 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);
- Trong khi bạn định cấu hình máy chủ thư của mình đúng cách, 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 điểm 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 này có khả năng sử dụng cao (sự thuận tiện tối đa cho người dùng cuối), đồng thời có chỉ số bảo mật thấp.

Vì vậy, nên sử dụng nó để đă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 một hệ thống để phân quyền cho người dùng trên trang web của mình và bạn không muốn tháo rời bài học này tận xương tủy, đây là những gì bạn cần làm:

Bạn cần tải nguồn đính kèm bài học
- Tìm tệp Tables.sql trong kho lưu trữ và nhập nó vào cơ sở dữ liệu của bạn bằng tùy chọn nhập trong phpMyAdmin. Cách khác: mở tệp này thông qua trình soạn thảo văn bản, sao chép truy vấn SQL và thực thi 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 email sẽ được sử dụng làm địa chỉ ban đầu cho các tin nhắn do hệ thống gửi. Một số máy chủ chặn email gửi đi trừ khi biểu mẫu chứa địa chỉ email thực được tạo từ bảng điều khiển của máy chủ, vì vậy vui lòng cung cấp địa chỉ thực;
- Tải lên tất cả các tệp và tài sản index.php , protected.php và bao gồm các thư mục qua FTP lê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 đăng nhập;

Require_once "gồm/main.php"; $user = Người dùng mới(); if(!$user->loggedIn())( redirect("index.php"); )
- Sẵn sàng!

Đối với những người quan tâm đến cách thức hoạt động của nó, hãy đọc 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 dữ liệu khác các tính năng hữu ích các hệ thống ủy quyền. Bạn có thể tìm hiểu thêm về điều này trong phần bên dưới dành riêng cho việc đánh giá mã PHP.

chỉ mục.php

Hướng dẫn: Hệ thống đăng ký siêu đơn giản với PHP & MySQL Đăng nhập hoặc đăng ký

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

Đăng nhập/Đăng ký

Trong phần đầu (giữa thẻ và) tôi đã bao gồm các kiểu chính (chúng không được đề cập trong hướng dẫn này, vì vậy bạn có thể tự xem chúng. Nội dung thư mục/css/style.css). Trước thẻ đóng, tôi đã bao gồm thư viện jQuery và tệp script.js mà 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" bằng hàm 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ủ, nó sẽ hiển thị thông báo này hoặc thông báo khác và xác định các hành động tiếp theo/

nội dung/js/script.js

$(function())( var form = $("#login-register"); form.on("submit", function(e)( if(form.is(".loading, .loggedIn"))( return false ; ) var email = form.find("input").val(), messageHolder = form.find("span"); e.preventDefault(); $.post(this.action, (email: email), hàm (m)( if(m.error)( form.addClass("error"); messageHolder.text(m.message); ) else( form.removeClass("error").addClass("loggedIn"); messageHolder .text(m.message); ) )); )); $(document).ajaxStart(function())( form.addClass("loading"); )); $(document).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(), mà bạn có thể tìm thấy ở cuối tệp).

Lớp này hiển thị một tệp GIF động quay tròn (như để gợi ý cho chúng ta 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 .loggedIn là một cờ khác - nó được đặt khi email được gửi. Cờ này ngay lập tức chặn mọi hành động tiếp theo với 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 nằm trong tệp Tables.sql). Đầu tiên lưu trữ dữ liệu về tài khoản người dùng. Cửa hàng thứ hai 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, như có thể thấy trong sơ đồ. Trên đó bạn có thể thấy cột mã thông báo có mã thông báo liền kề với cột token_validity. Mã thông báo được cài đặt ngay khi người dùng kết nối với hệ thống và đặt email của mình để gửi tin nhắn (thông tin thêm về điều này trong khối tiếp theo). Cột token_validity đặt thời gian sau 10 phút, sau đó mã thông báo không còn hiệu lực.


Lược đồ bảng đếm số lần thử ủ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 kiểu 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, bạn có thể xem bên dưới.

Lớp này tích cực sử dụng idorm (docs), những thư viện này là những 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 thực mã thông báo. Nó cung cấp một giao diện đơn giản giúp dễ dàng kết nối hệ thống đăng ký với trang web của bạn nếu nó sử dụng PHP.

Người dùng.class.php

Lớp Người dùng( // Trường hợp ORM riêng tư $orm; /** * Tìm người dùng bằng mã thông báo. Chỉ các mã thông báo hợp lệ mới được chấp nhận để xem xét. Mã thông báo chỉ được tạo trong 10 phút kể từ thời điểm nó được tạo * @param string $token . Đây là mã chúng tôi đang tìm kiếm mã thông báo * @return User Trả về giá trị của hàm Người dùng */ public static function findByToken($token)( // tìm mã thông báo trong cơ sở dữ liệu và đảm bảo đặt đúng dấu thời gian $result = ORM::for_table("reg_users") ->where ("token", $token) ->where_raw("token_validity > NOW()") ->find_one(); if(!$result)( return false; ) return new User($result); ) /** * Ủy quyền hoặc đăng ký một 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 một người dùng như vậy đã có tồn tại, trả về giá trị của hàm User từ địa chỉ email đã chỉ định được lưu trong cơ sở dữ liệu if(User::exists($email))( return new User($email); ) // Nếu không, hãy tạo một người dùng mới trong cơ sở dữ liệu và trả về giá trị của hàm User::create từ email được chỉ định return Người dùng::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 * @return User */ hàm tĩnh riêng create($email)( // Viết một 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(); return New User($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 chuỗi $email. Địa chỉ email của 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 một đối tượng người dùng mới * @param instance $param ORM , id, email hoặc 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))( // giá trị của biến $param là được chuyển tới mã định danh người dùng $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, ghi nó vào cơ sở dữ liệu và trả về giá trị của nó * @return string */ public function generateToken( )( // 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 mã thông báo vào cơ sở dữ liệu // Và đánh dấu nó là hợp lệ trong 10 phút tiếp theo $this->orm->set("token", $token); $this->orm->set_expr("token_validity", "ADDTIME(NOW(),"0:10")"); $this->orm->save(); trả lại mã thông báo $; ) /** * Ủy 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 postedIn())( 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 loại người dùng, có thể là quản trị viên hoặc thông thường * @return string */ public function xếp hạng())( if ($this->orm->rank == 1)( return "administrator" "; ) return "regular"; ) /** * Phương thức cho phép bạn lấy thông tin cá nhân của người dùng dưới dạng * thuộc tính của đối tượng User * @ param string $key Tên của thuộc tính có quyền truy cập * @returnmixed */ public function __get($key)( if(isset($this->orm->$key))( return $this->orm-> phím $; ) trả về giá trị rỗng; ) )

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 chức năng tính thời gian của MySQL để đặt giới hạn thời gian 10 phút cho tính hợp lệ của mã thông báo.

Khi mã thông báo được xác thực, chúng tôi trực tiếp thông báo cho người xử lý rằng chúng tôi chỉ 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 kỳ diệu __lấy docs ở 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->token, v.v. Trong đoạn mã tiếp theo, chúng ta sẽ xem cách sử dụng các lớp này làm ví dụ .


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 tin.php. Có một số cái gọi là trợ giúp - 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.

hàm.php

Hàm send_email($from, $to, $subject, $message)( // Trình trợ giúp gửi email $headers = "MIME-Version: 1.0" . "\r\n"; $headers .= "Content-type: text /plain; charset=utf-8" . "\r\n"; $headers .= "Từ: ".$from . "\r\n"; trả lại thư($to, $subject, $message, $headers ); ) function get_page_url())( // Xác định URL của tệp PHP $url = "http".(empty($_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 vào địa chỉ IP này trong giờ qua $ 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", sprintf("%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ột bản ghi 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("Location: $url"); exit; )

Chức năng tỷ lệ_giới hạntỷ lệ_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 ở cột reg_login_attempt. Các hàm này được gọi khi dữ liệu biểu mẫu được xử lý và gửi như bạn có thể thấy từ đoạn mã sau.

Mã bên dưới đượ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, sau đó được jQuery xử lý trong tệp assets/js/script.js mà chúng ta đã xem xét trước đó.

chỉ mục.php

Try( if(!empty($_POST) && isset($_SERVER["HTTP_X_REQUESTED_WITH"]))( // Xuất ra tiêu đề JSON header("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 email hợp lệ."); ) // Kiểm tra. Là người dùng được phép đăng nhập, anh ta có vượt quá số lượng kết nối được phép không? (tệp function.php để biết thêm thông tin) rate_limit($_SERVER["REMOTE_ADDR"]); // Ghi nhật ký lần đăng nhập này rate_limit_tick($_SERVER["REMOTE_ADDR"] , $ _POST["email"]); // Gửi email đến 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 = User ::loginOrRegister($_POST[ "email"]); $message.= "Bạn có thể đăng nhập từ URL này:\n"; $message.= get_page_url()."?tkn=".$user->generateToken()."\n\n"; $message.= "Liên kết sẽ tự động hết hạn sau 10 phút."; $result = send_email($fromEmail, $_POST["email"], $subject, $message); if(!$result)( Throw new Exception("Đã 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. Hãy kiểm tra cả thư mục thư rác."))); ) ) ) Catch(Exception $e)( die(json_encode(array("error"=>1, "message" => $e->getMessage() ))); )

Sau khi đăng nhập/đă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 đăng nhập. Mã thông báo trở nên khả dụng vì nó được truyền dưới dạng một biến trong liên kết được tạo bằng phương thức $_GET với điểm đánh dấu tkn

chỉ mục.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 một 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 một trang có biểu mẫu ủy quyền/đăng ký redirect("index. php "); )

$người dùng->đăng nhập()

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

Việc xử lý hàm thoát khỏi hệ thống cũng được sắp xếp tương tự.

chỉ mục.php

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

Ở cuối mã, tôi lại đặt chuyển hướng đến index.php, vì vậy tham số ?đăng xuất=1 truyền qua URL là không cần thiết.

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

chỉ mục.php

$user = Người dùng mới(); 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ỉ có thể truy cập được sau khi được ủy quyền.

được bảo vệ.php

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

Sau bước kiểm tra này, bạn có thể chắc chắn rằng người dùng đã được cấp phép 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 "Thứ 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 cho Người sử dụng thường xuyên, 1 dành cho 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 liên quan, đó là điều mà phương pháp này giúp chúng tôi.

Để đặ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 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, bao gồm 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 điều này thì tùy bạn quyết định; bạn có thể tự viết và soạn mã để đặt ra các đặc quyền và khả năng nhất định cho quản trị viên.

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

Chúng ta đã hoàn thành với hình dạng cực kỳ đơn giản này! Bạn có thể sử dụng nó trong các trang 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 Denis Malyshok chuẩn bị riêng cho trang web

tái bút Bạn có muốn tiến xa hơn trong việc thành thạo PHP và OOP không? Hãy chú ý đến các bài học 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 lập trình bằng PHP, cũng như khóa học miễn phí về cách tạo hệ thống CMS của riêng bạn bằng PHP từ đầu bằng OOP:

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