Adonis 등록 양식 php. PHP와 MySQL에서 간단한 사용자 등록 시스템 만들기

이 튜토리얼에서는 사용자가 사용자 이름, 이메일 및 비밀번호를 제공하여 계정을 생성하고 PHP와 MySQL을 사용하여 로그인 및 로그아웃할 수 있는 사용자 등록 시스템을 만드는 전체 프로세스를 안내합니다. 또한 로그인한 사용자만 일부 페이지에 액세스할 수 있도록 하는 방법도 보여 드리겠습니다. 로그인하지 않은 다른 사용자는 페이지에 액세스할 수 없습니다.

my와 함께 PHP 및 MySQL 데이터베이스를 사용하여 완전한 블로그를 만드는 방법 YouTube의 무료 강의.

가장 먼저 "해야 할 일은 데이터베이스를 설정하는 것입니다.

라는 데이터베이스를 생성합니다. 등록... 에서 등록데이터베이스, 라는 테이블을 추가 사용자... users 테이블은 다음 4개의 필드를 사용합니다.

  • 사용자 이름 - varchar(100)
  • 이메일 - varchar (100)
  • 비밀번호 - varchar(100)

PHPMyAdmin과 같은 MySQL 클라이언트를 사용하여 이를 생성할 수 있습니다.

또는 다음 SQL 스크립트를 사용하여 MySQL 프롬프트에서 생성할 수 있습니다.

CREATE TABLE `users` (` id` int (11) NOT NULL AUTO_INCREMENT PRIMARY KEY, `username` varchar (100) NOT NULL,` email` varchar (100) NOT NULL, `password` varchar (100) NOT NULL) ENGINE = InnoDB 기본 문자셋 = latin1;

그리고 그것은 "데이터베이스와 함께합니다.

이제 라는 폴더를 만듭니다. 등록서버에 액세스할 수 있는 디렉토리에 있습니다. 즉, htdocs(XAMPP 서버를 사용하는 경우) 또는 내부에 폴더를 만듭니다. www(wampp 서버를 사용하는 경우).

폴더 내부 등록,다음 파일을 만듭니다.

선택한 텍스트 편집기에서 이 파일을 엽니다. 내 것은 Sublime Text 3입니다.

사용자 등록

register.php 파일을 열고 다음 코드를 붙여넣습니다.

regiser.php:

등록하다

이미 회원이신가요? 로그인

여기까지는 복잡하지 않죠?

여기서 주의할 몇 가지 사항:

첫 번째는 우리의 양식 " 동작속성은 register.php로 설정됩니다. 즉, 양식 제출 버튼을 클릭하면 양식의 모든 데이터가 동일한 페이지(register.php)로 제출됩니다. 이 양식 데이터를 수신하는 코드의 일부는 server.php 파일에 작성되었으며 "왜 우리가 그것을 register.php 파일의 맨 위에 포함시키는지 알 수 있습니다.

또한 양식 오류를 표시하기 위해 errors.php 파일이 포함되어 있음을 주목하세요. 우리는 곧 그것에 올 것입니다.

헤드 섹션에서 볼 수 있듯이 style.css 파일에 연결하고 있습니다. style.css 파일을 열고 다음 CSS를 붙여넣습니다.

* (여백: 0px; 패딩: 0px;) 본문 (글꼴 크기: 120%; 배경: # F8F8FF;) .header (너비: 30%; 여백: 50px 자동 0px; 색상: 흰색; 배경: # 5F9EA0; 텍스트 -align: center; border: 1px solid # B0C4DE; border-bottom: none; border-radius: 10px 10px 0px 0px; padding: 20px;) form, .content (width: 30%; margin: 0px auto; padding: 20px ; 경계: 1px solid # B0C4DE; 배경: 흰색; 경계 반경: 0px 0px 10px 10px;) .input-group (여백: 10px 0px 10px 0px;) .input-group 레이블 (디스플레이: 블록; 텍스트 정렬: 왼쪽 ; 여백: 3px;) .input-group 입력(높이: 30px; 너비: 93%; 패딩: 5px 10px; 글꼴 크기: 16px; 경계 반경: 5px; 경계: 1px 단색 회색;) .btn(패딩: 10px; font-size: 15px; color: white; background: # 5F9EA0; border: none; border-radius: 5px;) .error (width: 92%; margin: 0px auto; padding: 10px; border: 1px solid # a94442; color: # a94442; background: # f2dede; border-radius: 5px; text-align: left;) .success (color: # 3c7 63d; 배경: # dff0d8; 테두리: 1px 솔리드 # 3c763d; 여백-하단: 20px; )

이제 양식이 아름답게 보입니다.

이제 "폼에서 제출된 정보를 수신하는 코드를 작성하고 정보를 데이터베이스에 저장(등록)합니다. 앞에서 약속한 대로 server.php 파일에서 이 작업을 수행합니다.

server.php를 열고 다음 코드를 붙여넣습니다.

서버.php

세션은 로그인한 사용자를 추적하는 데 사용되므로 파일 상단에 session_start()를 포함합니다.

코드의 주석은 거의 모든 것을 설명하지만 여기서 몇 가지를 강조하겠습니다.

if 문은 등록 양식의 reg_user 버튼이 클릭되었는지 여부를 결정합니다. 우리 양식에서 제출 버튼에는 reg_user로 설정된 이름 속성이 있으며 이것이 if 문에서 참조하는 것임을 기억하십시오.

모든 데이터는 양식에서 수신되고 사용자가 양식을 올바르게 채웠는지 확인합니다. 암호가 일치하는지 확인하기 위해 암호도 비교됩니다.

오류가 발생하지 않은 경우 사용자는 사용자해시된 암호가 있는 데이터베이스의 테이블입니다. 해시된 비밀번호는 보안상의 이유입니다. 해커가 데이터베이스에 액세스하더라도 암호를 읽을 수 없도록 합니다.

하지만 이제 errors.php 파일이 비어 있기 때문에 오류 메시지가 표시되지 않습니다. 오류를 표시하려면 이 코드를 errors.php 파일에 붙여넣습니다.

0) : ?>

사용자가 데이터베이스에 등록되면 즉시 로그인되어 index.php 페이지로 리디렉션됩니다.

그리고 그것은 "등록을 위한 것입니다." 사용자 로그인을 살펴보겠습니다.

로그인 사용자

사용자 로그인은 훨씬 더 쉽습니다. 로그인 페이지를 열고 다음 코드를 그 안에 넣으십시오.

등록 시스템 PHP 및 MySQL

로그인

아직 회원이 아니신가요? 가입하기

이 페이지의 모든 것은 register.php 페이지와 매우 유사합니다.

이제 사용자를 로그인하는 코드는 동일한 server.php 파일에 작성됩니다. 따라서 server.php 파일을 열고 파일 끝에 다음 코드를 추가하십시오.

// ... // 로그인 사용자 if (isset ($ _ POST ["login_user"])) ($ username = mysqli_real_escape_string ($ db, $ _POST ["username"]); $ password = mysqli_real_escape_string ($ db, $ _POST ["비밀번호"]); if (비어 있음($ 사용자 이름)) (array_push($ 오류, "사용자 이름이 필요함");) if (비어 있음($ 비밀번호)) (array_push($ 오류, "비밀번호가 필요합니다") ; ) if (count($ 오류) == 0) ($ 암호 = md5($ 암호); $ 쿼리 = "SELECT * FROM 사용자 WHERE 사용자 이름 = $ 사용자 이름 "AND 암호 = $ 암호 ""; $ 결과 = mysqli_query($ db, $ 쿼리); if (mysqli_num_rows($ 결과) == 1) ($ _SESSION ["사용자 이름"] = $ 사용자 이름; $ _SESSION ["성공"] = "이제 로그인되었습니다."; 헤더( " location: index.php ");) else (array_push($ 오류," 잘못된 사용자 이름/비밀번호 조합 ");)))?>

다시 이 모든 작업은 사용자가 양식을 올바르게 채웠는지 확인하고 자격 증명이 데이터베이스의 레코드와 일치하는지 확인하고 일치하면 로그인하는 것입니다. 로그인 후 사용자는 성공 메시지와 함께 index.php 파일로 리디렉션됩니다.

이제 "index.php 파일에서 어떤 일이 일어나는지 봅시다. 파일을 열고 다음 코드를 붙여넣으세요:

홈페이지

어서 오십시오

로그 아웃

첫 번째 if 문은 사용자가 이미 로그인했는지 확인합니다. 로그인하지 않은 경우 로그인 페이지로 리디렉션됩니다. 따라서 이 페이지는 로그인한 사용자만 액세스할 수 있습니다. 로그인한 사용자만 페이지에 액세스할 수 있도록 하려면 이 if 문을 파일 맨 위에 배치하기만 하면 됩니다.

두 번째 if 문은 사용자가 로그아웃 버튼을 클릭했는지 확인합니다. 그렇다면 시스템에서 로그아웃하고 로그인 페이지로 다시 리디렉션합니다.

이제 필요에 맞게 사용자 정의하고 멋진 사이트를 만드십시오. 걱정되는 부분이나 명확히 해야 할 사항이 있는 경우 아래 의견에 남겨주시면 도움이 될 것입니다.

소셜 미디어에서 공유하거나 친구 및 동료에게 내 블로그를 추천하여 항상 지원할 수 있습니다.

좋은 하루 친구! PHP에서 사용자 등록에 대해 살펴보겠습니다. 먼저 사용자 등록 조건을 정의하겠습니다.

  • 알고리즘을 사용하여 비밀번호를 암호화합니다. MD5
  • 비밀번호는 "솔트"됩니다.
  • 로그인 가능 여부 확인
  • 문자로 사용자 활성화.
  • 데이터 쓰기 및 저장 MySQL DBMS

이 스크립트를 작성하려면 사용자 등록이 무엇인지 이해해야 합니다. 사용자 등록은 실제 사용자로부터 데이터를 수신하여 데이터를 처리 및 저장하는 것입니다.

간단한 단어로 설명하면 등록은 우리의 경우 사용자에게 권한을 부여할 수 있는 특정 데이터의 기록 및 저장일 뿐입니다. 이것이 로그인 및 비밀번호입니다.

권한 부여는 특정 개인 또는 개인 그룹에 특정 작업을 수행할 수 있는 권한을 부여하고 이러한 작업을 수행하려고 할 때 이러한 권한을 확인하는 프로세스입니다. 간단히 말해서, 승인을 사용하여 당사 웹사이트의 이 또는 그 콘텐츠에 대한 액세스를 제한할 수 있습니다.

인증 등록을 구현하기 위한 스크립트 디렉토리의 구조를 고려해 보겠습니다. 스크립트를 논리적 구성 요소로 분해해야 합니다. 등록 및 권한 부여 모듈을 별도의 디렉토리에 배치했습니다. 또한 데이터베이스에 대한 연결을 별도의 디렉터리에 배치합니다. MySQL, 사용자 정의 기능이 있는 파일, 스타일 파일 CSS그리고 우리의 템플릿 HTML... 이 구조를 사용하면 스크립트를 빠르게 탐색할 수 있습니다. 모듈 등이 많은 대규모 사이트가 있다고 상상해보십시오. 그리고 순서가 없으면 그런 혼란 속에서 무언가를 찾기가 매우 어려울 것입니다.

우리는 모든 데이터를 MySQL DBMS, 등록 데이터를 저장할 작은 테이블을 만들어 보겠습니다.

먼저 데이터베이스에 테이블을 생성해야 합니다. 테이블이 호출됩니다 bez_reg어디 베즈는 테이블 접두어이고 등록테이블의 이름.

테이블 구조: bez_reg

- - 테이블 구조 `bez_reg` - CREATE TABLE IF NOT EXISTS` bez_reg` (`id` int (11) NOT NULL AUTO_INCREMENT,` login` varchar (200) NOT NULL, `pass' varchar (32) NOT NULL , `salt ` varchar (32) NOT NULL,` active_hex` varchar (32) NOT NULL, `status` int (1) NOT NULL, PRIMARY KEY (` id`)) ENGINE = MyISAM DEFAULT CHARSET = utf8 AUTO_INCREMENT = 1;

이제 추가 작업을 위해 기본 스크립트를 작성해 보겠습니다.

INDEX.PHP 파일

CONFIG.PHP 파일

"); ?>

404.html 파일

오류 404

오류 404

페이지에서 404 오류가 발생했습니다.

반품

BD.PHP 파일

INDEX.HTML 파일

이메일 활성화를 통한 PHP MySQL 사용자 등록

FUNCT.PHP 파일

"." \ n "; if (is_array($ 데이터)) (foreach($ 데이터를 $ val로) $ err. ="

  • ". $ val."
  • "." \n ";) 그렇지 않으면 $ 오류. ="
  • ".$ 데이터."
  • "." \n "; $ 오류. =""." \ n "; return $ err;) / ** MySQL 쿼리를 위한 단순 래퍼 * @param string $ sql * / function mysqlQuery ($ sql) ($ res = mysql_query ($ sql); / * 결과 확인하기 MySQL에 보낸 실제 쿼리와 오류를 보여줍니다. 디버깅에 편리합니다. * / if (! $ res) ($ message = "Invalid query:". mysql_error (). "\ n"; $ message. = " 전체 쿼리 : ". $ sql; die ($ message);) return $ res;) / ** 단순 소금 생성기 * @param string $ sql * / function salt () ($ salt = substr (md5(uniqid()) ), - 8); 반환 $ 소금;)

    글쓰기 등록을 해보자. 먼저 사용자가 처리를 위해 데이터를 입력할 수 있도록 등록 양식 템플릿을 만들어야 합니다. 다음으로, 입력된 사용자 데이터의 정확성을 검사하는 양식 처리기 자체를 작성해야 합니다. 데이터가 성공적으로 확인되면 데이터베이스에 기록하고 사용자에게 편지를 보내 계정을 활성화합니다.

    REG.PHP 파일

    성공적으로 등록했습니다! 계정을 활성화하세요!!"; // 계정 활성화 if (isset ($ _ GET [" key "])) (// 키 확인 $ sql =" SELECT * FROM `". BEZ_DBPREFIX. "Reg` WHERE` active_hex` = "". Escape_str ( $ _GET ["key"]). "" "; $ Res = mysqlQuery ($ sql); if (mysql_num_rows ($ res) == 0) $ err = 활성화 키가 올바르지 않습니다! "; // 오류를 확인하고 사용자에게 표시 if (count ($ err)> 0) echo showErrorMessage ($ err); else (// 사용자의 주소 가져오기 $ row = mysql_fetch_assoc ($ res); $ email = $ row ["login "]; // 계정 사용자 활성화 $ sql = "UPDATE` ".BEZ_DBPREFIX." reg` SET `status` = 1 WHERE` login` = "". $ email. "" "; $ res = mysqlQuery($ sql ); // 활성화를 위해 이메일을 보냅니다. $ title = "(! LANG: http: // 사이트의 계정이 성공적으로 활성화되었습니다."; $message = "Поздравляю Вас, Ваш аккаунт на http://сайт успешно активирован"; sendMessageMail($email, BEZ_MAIL_AUTOR, $title, $message); /*Перенаправляем пользователя на нужную нам страницу*/ header("Location:". BEZ_HOST ."less/reg/?mode=reg&active=ok"); exit; } } /*Если нажата кнопка на регистрацию, начинаем проверку*/ if(isset($_POST["submit"])) { //Утюжим пришедшие данные if(empty($_POST["email"])) $err = "Поле Email не может быть пустым!"; else { if(!preg_match("/^!} [이메일 보호됨](+ \.) + (2,6) $ / i ", $ _POST [" email "])) $ err =" 이메일이 잘못 입력되었습니다 "." \ N ";) if (empty ($ _ POST [ "pass"])) $ err = "비밀번호 필드는 비워둘 수 없습니다."; if (empty ($ _ POST ["pass2"])) $ err = "비밀번호 확인 필드는 비워 둘 수 없습니다."; // 오류 확인 및 사용자에게 표시 if (count ($ err)> 0) echo showErrorMessage ($ err); else (/ * 입력된 데이터 계속 확인 일치하는 암호 확인 * / if ($ _ POST ["pass"]! = $ _POST ["pass2" ]) $ err = "비밀번호가 일치하지 않습니다"; // 오류를 확인하고 사용자에게 표시 if (count ($ err)> 0) echo showErrorMessage ($ err); else (/ * 확인 데이터베이스에 이러한 사용자가 있는 경우 * / $ sql = "SELECT` login` FROM `". BEZ_DBPREFIX. "reg` WHERE` login` = "". escape_str ($ _ POST ["email"]). "" "; $ res = mysqlQuery($ sql); if (mysql_num_rows($ res)> 0) $ err = "죄송합니다 로그인: ". $ _POST [" 이메일 "]." busy! "; // 오류를 확인하고 사용자에게 표시 if (count ($ err)> 0) echo showErrorMessage ($ err); else (// 소금의 HASH 가져오기 $ salt = salt (); / / 비밀번호 솔트 $ pass = md5 (md5 ($ _ POST ["pass"]). $ salt); / * 모든 것이 정상이면 데이터베이스에 데이터를 씁니다. * / $ sql = "INSERT INTO` ". BEZ_DBPREFIX ." reg` VALUES("", "" . escape_str($ _ POST ["이메일"]). "", "". $ 패스. "", "". $ 소금. "", "". md5( $ salt)."", 0) "; $ res = mysqlQuery($ sql); // 활성화를 위해 이메일을 보낸다. $ url = BEZ_HOST. "less / reg /? mode = reg & key =". md5($ salt ); $ title = "(! LANG: http://site에 등록"; $message = "Для активации Вашего акаунта пройдите по ссылке ". $url .""; sendMessageMail($_POST["email"], BEZ_MAIL_AUTOR, $title, $message); //Сбрасываем параметры header("Location:". BEZ_HOST ."less/reg/?mode=reg&status=ok"); exit; } } } } ?>!}

    REG_FORM.HTML 파일

    이메일 활성화를 통한 PHP MySQL 사용자 등록

    이메일 *:
    비밀번호 *:
    비밀번호 확인 *:

    아이콘이 있는 필드 *필수

    사용자를 등록할 준비가 되었기 때문에 권한 부여를 작성할 시간입니다. 사용자 인증을 위한 폼을 생성하고 인증 폼 핸들러를 작성하고 마지막으로 스크립트를 만들어 봅시다. 쇼.php이것은 우리가 시스템에서 권한이 있는지 여부를 보여줍니다.

    AUTH.PHP 파일

    0) echo showErrorMessage($ 오류); else (/ * 사용자의 신뢰성을 확인하기 위해 데이터베이스에서 가져오는 쿼리를 만듭니다. * / $ sql = "SELECT * FROM` ". BEZ_DBPREFIX." reg` WHERE `login` =" ". escape_str ($ _ POST [ " email "]) . "" AND `status` = 1"; $ res = mysqlQuery ($ sql); // 로그인이 일치하면 비밀번호를 확인 if (mysql_num_rows ($ res)> 0) (// 데이터 가져오기 테이블에서 $ row = mysql_fetch_assoc ( $ res); if (md5 (md5 ($ _ POST ["pass"]). $ row ["salt"]) == $ row ["pass"]) ($ _SESSION [ "user"] = true; // 매개변수 헤더 재설정("Location:". BEZ_HOST. "Less / reg /? Mode = auth"); exit;) else echo showErrorMessage("Wrong password!");) Else echo showErrorMessage ("로그인 ". $ _POST [" 이메일 "]."찾을 수 없습니다! ");))?>

    최신 PHP 버전을 사용하는 사람들을 위해 다음을 사용하여 이 스크립트를 게시합니다. PDO~부터 확대 MySQL더 이상 사용되지 않으며 최신 PHP 버전에서 제거되었습니다. 등록 및 인증 PHP mysql pdo 다운로드

    아카이브는 2015년 2월 24일에 업데이트되었습니다.

    주목:다음과 같은 로컬 서버에서 이 스크립트를 사용하는 경우 덴버,XAMPP, 그러면 우편함에 편지가 올 때까지 기다리지 마십시오. 편지는 공백에 있습니다 메일을 보내다... V 덴워당신은 길을 따라 그들을 찾을 수 있습니다 Z: \ tmp \! Sendmail \모든 메일 클라이언트에서 이 파일을 열 수 있습니다.

    사이트 방문자를 특정 그룹으로 나누기 위해 사이트에 작은 시스템을 설치해야 합니다. PHP 등록... 따라서 방문자를 조건부로 일반 방문자로 구성된 두 그룹과 더 중요한 정보를 제공하는 보다 권한 있는 사용자 그룹으로 나눕니다.

    대부분의 경우 하나의 파일에 php로 작성된 보다 간소화된 등록 시스템이 사용됩니다. 레지스터.php.

    그래서 우리는 조금 벗어나서 이제 등록 파일을 자세히 살펴보겠습니다.

    Register.php 파일

    시간이 많이 걸리지 않도록 사용자의 연락처 정보를 최소한으로 사용하여 사용자를 수집하는 시스템을 만들 것입니다. 이 경우 mysql 데이터베이스에 모든 것을 입력합니다. 데이터베이스의 최고 속도를 위해 MyISAM 형식과 utf-8 인코딩으로 사용자 테이블을 생성합니다.

    메모! 모든 스크립트는 항상 동일한 인코딩으로 작성되어야 합니다. 모든 사이트 파일과 MySql 데이터베이스는 동일한 인코딩이어야 합니다. 가장 일반적인 인코딩은 UTF-8 및 Windows-1251입니다.

    하나의 인코딩으로 모든 것을 작성해야 하는 이유는 나중에 이야기하겠습니다. 그때까지는 이 정보를 스크립팅에 대한 가장 엄격한 경험 법칙으로 간주하십시오. 그렇지 않으면 향후 스크립팅에 문제가 발생할 것입니다. 물론 괜찮지만 스크립트에서 오류를 찾는 데 많은 시간을 낭비하게 됩니다.

    스크립트 자체는 어떻게 작동합니까?

    우리는 모든 것을 단순화하고 빠른 결과를 얻고자 합니다. 따라서 사용자로부터 로그인, 이메일 및 비밀번호만 받습니다. 스팸 로봇으로부터 보호하기 위해 작은 보안 문자를 설치합니다. 그렇지 않으면 런던의 어떤 소년이 몇 분 안에 전체 데이터베이스를 가짜 사용자로 채우고 그의 천재성과 형벌에 기뻐할 작은 로봇 파서를 작성할 것입니다.

    다음은 스크립트 자체입니다. 모든 것이 하나의 파일에 기록됩니다. 레지스터.php:

    ! `; // 빨간색 물음표 $ sha = $ sh."스크립트 / 프로 /"; // 메인 폴더 경로 $ bg = `bgcolor =" # E1FFEB "`; // 라인의 배경색?> 등록 스크립트의 예 register.php style.css "/>

    이 경우 스크립트는 자신을 참조합니다. 그리고 양식에 입력된 데이터를 처리하는 양식이자 처리기입니다. 파일은 zip 아카이브로 압축되어 있으며 config.php 구성 파일, 사용자 데이터베이스 덤프, 도우미 functions.php가 포함된 파일, style.css 스타일시트 및 register.php 파일 자체가 포함되어 있습니다. 보안 문자 기호의 작업 및 생성을 담당하는 여러 파일도 있습니다.

    등록 시스템을 만드는 과정은 꽤 많은 작업입니다. 이메일 주소의 유효성을 다시 확인하고, 확인 이메일을 보내고, 비밀번호를 복구하는 기능을 제공하고, 비밀번호를 안전한 장소에 저장하고, 입력 양식의 유효성을 검사하는 등의 작업을 수행하는 코드를 작성해야 합니다. 이 모든 작업을 수행하더라도 사용자는 가장 최소한의 등록에도 활동이 필요하기 때문에 등록을 꺼릴 것입니다.

    오늘의 튜토리얼에서는 비밀번호가 필요 없는 간단한 등록 시스템을 개발할 것입니다! 결과적으로 우리는 쉽게 수정하거나 기존 PHP 사이트에 통합할 수 있는 시스템을 얻게 될 것입니다. 관심이 있으시면 계속 읽으십시오.

    PHP

    이제 PHP 코드를 다룰 준비가 되었습니다. 등록 시스템의 주요 기능은 아래에서 볼 수 있는 User 클래스에 의해 제공됩니다. 클래스는 데이터베이스 작업을 위한 최소한의 라이브러리인 ()를 사용합니다. User 클래스는 데이터베이스 액세스, 로그인 토큰 생성 및 유효성 검사를 담당합니다. PHP 기반 사이트의 등록 시스템에 쉽게 통합할 수 있는 간단한 인터페이스를 제공합니다.

    사용자.클래스.php

    // 개인 ORM 인스턴스
    개인 $ orm;

    /**
    * 토큰 문자열로 사용자를 찾습니다. 유효한 토큰만 사용됩니다.
    * 고려 사항. 토큰은 생성된 후 10분 동안 유효합니다.
    * @param string $ token 검색할 토큰
    * @return 사용자
    */

    공개 정적 함수 findByToken($ 토큰)(

    // 데이터베이스에서 찾고 타임스탬프가 올바른지 확인합니다.


    -> 어디서 ("토큰", $ 토큰)
    -> where_raw("token_validity> NOW()")
    -> find_one();

    만약 (! $ 결과) (
    거짓을 반환합니다.
    }

    새 사용자 반환($ 결과);
    }

    /**
    * 로그인하거나 사용자를 등록하십시오.
    * @return 사용자
    */

    공개 정적 함수 loginOrRegister($ 이메일)(

    // 그러한 사용자가 이미 존재하는 경우 반환

    (사용자 :: 존재하는 경우 ($ 이메일)) (
    새 사용자 반환($ 이메일);
    }

    // 그렇지 않으면 생성하고 반환

    반환 사용자 :: create ($ 이메일);
    }

    /**
    * 새 사용자를 만들고 데이터베이스에 저장
    * @param string $ email 사용자의 이메일 주소
    * @return 사용자
    */

    비공개 정적 함수 생성($ 이메일)(

    // 새로운 사용자를 데이터베이스에 쓰고 반환

    $ 결과 = ORM :: for_table("reg_users") -> 생성();
    $ 결과-> 이메일 = $ 이메일;
    $ 결과-> 저장();

    새 사용자 반환($ 결과);
    }

    /**
    * 해당 사용자가 데이터베이스에 존재하는지 확인하고 boolean을 반환합니다.
    * @param string $ email 사용자의 이메일 주소
    * @return 부울
    */

    공개 정적 함수 존재($ 이메일)(

    // 사용자가 데이터베이스에 존재합니까?
    $ 결과 = ORM :: for_table("reg_users")
    -> 어디서 ("이메일", $ 이메일)
    -> 카운트();

    $ 결과를 반환 == 1;
    }

    /**
    * 새로운 사용자 객체 생성
    * @param $ param ORM 인스턴스, ID, 이메일 또는 null
    * @return 사용자
    */

    공개 함수 __construct($ param = null)(

    If ($ param instanceof ORM) (

    // ORM 인스턴스가 전달되었습니다.
    $ this-> orm = $ param;
    }
    else if (is_string($ 매개변수)) (

    // 이메일이 전달되었습니다.
    $ 이것->
    -> 어디서("이메일", $ 매개변수)
    -> find_one();
    }
    또 다른 (

    If (is_numeric($ param)) (
    // 사용자 ID가 매개변수로 전달되었습니다.
    $ 아이디 = $ 매개변수;
    }
    else if (isset ($ _ SESSION ["loginid"])) (

    // 사용자 ID가 전달되지 않았습니다. 세션을 살펴봅니다.
    $ 아이디 = $ _SESSION ["로그인 아이디"];
    }

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

    /**
    * 새로운 SHA1 로그인 토큰을 생성하여 데이터베이스에 기록하고 반환합니다.
    * @반환 문자열
    */

    공개 함수 generateToken()(
    // 로그인한 사용자에 대한 토큰을 생성합니다. 데이터베이스에 저장합니다.

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

    // 토큰을 데이터베이스에 저장합니다.
    // 다음 10분 동안만 유효한 것으로 표시합니다.

    $ this-> orm-> set("토큰", $ 토큰);
    $ this-> orm-> set_expr("token_validity", "ADDTIME(NOW()," 0:10 ")");
    $ this-> orm-> 저장();

    $ 토큰을 반환합니다.
    }

    /**
    * 이 사용자 로그인
    * @반환 무효
    */

    공용 기능 로그인() (

    // 사용자를 로그인한 것으로 표시
    $ _SESSION ["loginid"] = $ this-> orm-> id;

    // last_login db 필드 업데이트
    $ this-> orm-> set_expr("last_login", "NOW()");
    $ this-> orm-> 저장();
    }

    /**
    * 세션을 삭제하고 사용자를 로그아웃합니다.
    * @반환 무효
    */

    공용 기능 로그아웃()(
    $ _SESSION = 배열();
    설정되지 않음($ _ 세션);
    }

    /**
    * 사용자가 로그인되어 있는지 확인하십시오.
    * @return 부울
    */

    공개 함수 로그인()(
    반환 isset ($ this-> orm-> id) && $ _SESSION ["loginid"] == $ this-> orm-> id;
    }

    /**
    * 사용자가 관리자인지 확인
    * @return 부울
    */

    공용 함수 isAdmin()(
    return $ this-> rank () == "관리자";
    }

    /**
    * 사용자 유형을 찾습니다. 관리자 또는 일반일 수 있습니다.
    * @반환 문자열
    */

    공용 기능 순위()(
    if ($ this-> orm-> rank == 1) (
    "관리자"를 반환합니다.
    }

    "일반"을 반환합니다.
    }

    /**
    * 비공개 요소에 액세스하는 마법의 방법
    * $ orm 인스턴스를 사용자 개체의 속성으로 사용
    * @param string $ key 접근된 속성 "이름
    * @반환 혼합
    */

    공개 함수 __get($ 키)(
    if (isset ($ this-> orm -> $ key)) (
    $ this-> orm -> $ 키를 반환합니다.
    }

    null을 반환합니다.
    }
    }
    토큰은 알고리즘을 사용하여 생성되고 데이터베이스에 저장됩니다. MySQL을 사용하여 token_validity 열을 10분으로 설정합니다. 토큰을 검증할 때 토큰이 필요하다고 엔진에 알립니다. token_validity 필드는 아직 만료되지 않았습니다. 따라서 토큰이 유효한 시간을 제한합니다.

    문서 끝에 매직 __get() 메서드를 사용하여 사용자 개체의 속성에 액세스하고 있음에 유의하십시오. 이를 통해 $ 사용자-> 이메일, $ 사용자-> 토큰과 같은 속성 형태로 데이터베이스에 저장된 데이터에 액세스할 수 있습니다. 예를 들어 다음 코드 조각에서 이 클래스를 사용하는 방법을 살펴보겠습니다.


    필요한 기능을 저장하는 또 다른 파일은 functions.php입니다. 여기에 나머지 코드를 깔끔하게 유지할 수 있는 몇 가지 도우미 함수가 있습니다.

    함수.php

    함수 send_email ($ from, $ to, $ subject, $ message) (

    // 이메일 전송을 위한 도우미 함수

    $ headers = "MIME 버전: 1.0". "\r\n";
    $ headers. = "콘텐츠 유형: 텍스트 / 일반; charset = utf-8". "\r\n";
    $ 헤더. = "보낸 사람:". $ 보낸 사람. "\r\n";

    메일 반환($ to, $ 제목, $ 메시지, $ 헤더);
    }

    함수 get_page_url()(

    // PHP 파일의 URL 찾기

    $ url = "http". (비어 있음($ _ SERVER ["HTTPS"])? "": "s"). ": //". $ _ SERVER ["SERVER_NAME"];

    If (isset ($ _ SERVER ["REQUEST_URI"]) && $ _SERVER ["REQUEST_URI"]! = "") (
    $ url. = $ _SERVER ["REQUEST_URI"];
    }
    또 다른 (
    $ url. = $ _SERVER ["PATH_INFO"];
    }

    반환 $ url;
    }

    함수 rate_limit ($ ip, $ limit_hour = 20, $ limit_10_min = 10) (

    // 이 IP 주소로 지난 1시간 동안 로그인 시도 횟수

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

    // 이 IP 주소로 지난 10분 동안 로그인 시도 횟수

    $ count_10_min = ORM :: for_table("reg_login_attempt")
    -> 여기서 ("ip", sprintf("% u", ip2long($ ip)))
    -> where_raw ("ts> SUBTIME (NOW ()," 0:10 ")")
    -> 카운트();

    만약 ($ count_hour> $ limit_hour || $ count_10_min> $ limit_10_min) (
    throw new Exception("로그인 시도가 너무 많습니다!");
    }
    }

    기능 rate_limit_tick ($ ip, $ 이메일) (

    // 로그인 시도 테이블에 새 레코드 생성

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

    $ login_attempt-> 이메일 = $ 이메일;
    $ login_attempt-> ip = sprintf("% u", ip2long($ ip));

    $ login_attempt-> 저장();
    }

    기능 리디렉션($ url)(
    헤더("위치: $ url");
    출구;
    }
    rate_limit 및 rate_limit_tick 함수를 사용하면 특정 기간 동안 인증 시도 횟수를 제한할 수 있습니다. 권한 부여 시도는 reg_login_attempt 데이터베이스에 기록됩니다. 다음 코드 스니펫에서 볼 수 있듯이 이러한 기능은 승인 양식이 제출될 때 트리거됩니다.

    아래 코드는 index.php에서 가져온 것으로 로그인 양식을 제출하는 역할을 합니다. asset / js / script.js에서 본 jQuery 코드에 의해 구동되는 JSON 응답을 반환합니다.

    index.php

    If (! 비어 있음 ($ _ POST) && isset ($ _ SERVER ["HTTP_X_REQUESTED_WITH"])) (

    // JSON 헤더 출력

    헤더("콘텐츠 유형: 애플리케이션 / json");

    // 이메일 주소가 유효한가요?

    If (! Isset ($ _ POST ["email"]) ||! Filter_var ($ _ POST ["email"], FILTER_VALIDATE_EMAIL)) (
    throw new Exception("유효한 이메일을 입력하세요.");
    }

    // 사람이 위에 있는 경우 예외가 발생합니다.
    // 허용된 로그인 시도 제한(자세한 내용은 functions.php 참조):
    rate_limit ($ _ SERVER ["REMOTE_ADDR"]);

    // 이 로그인 시도를 기록합니다.
    rate_limit_tick ($ _ SERVER ["REMOTE_ADDR"], $ _POST ["이메일"]);

    // 사용자에게 메시지 보내기

    $ 메시지 = "";
    $ 이메일 = $ _POST ["이메일"];
    $ subject = "로그인 링크";

    (! 사용자 :: 존재하는 경우 ($ 이메일)) (
    $ subject = "등록해주셔서 감사합니다!";
    $ message = "저희 사이트에 등록해주셔서 감사합니다! \n \n";
    }

    // 로그인을 시도하거나 사람을 등록합니다.
    $ user = 사용자 :: loginOrRegister ($ _ POST ["이메일"]);

    $ message. = "다음 URL에서 로그인할 수 있습니다: \n";
    $ message. = get_page_url(). "? tkn =". $ user-> generateToken(). "\ n \ n";

    $ message. = "링크는 10분 후에 자동으로 만료됩니다.";

    $ 결과 = send_email ($ fromEmail, $ _POST ["이메일"], $ 제목, $ 메시지);

    만약 (! $ 결과) (
    throw new Exception("이메일을 보내는 동안 오류가 발생했습니다. 다시 시도하십시오.");
    }

    다이(json_encode(배열(
    "message" => "감사합니다! 우리는 \" 받은 편지함에 대한 링크를 보냈습니다. 스팸 폴더도 확인하세요."
    )));
    }
    }
    catch (예외 $ e) (

    다이(json_encode(배열(
    "오류" => 1,
    "메시지" => $ e-> getMessage()
    )));
    }
    승인 또는 등록에 성공하면 위의 코드가 승인 링크가 포함된 이메일을 사람에게 보냅니다. 토큰(token)은 생성된 URL로 인해 $ _GET 변수 "tkn"으로 사용 가능하게 됩니다.

    index.php

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

    // 유효한 로그인 토큰입니까?
    $ user = 사용자 :: findByToken ($ _ GET ["tkn"]);

    // 예! 사용자를 로그인하고 보호된 페이지로 리디렉션합니다.

    $ 사용자-> 로그인();
    리디렉션("protected.php");
    }

    // 잘못된 토큰. 로그인 양식으로 다시 리디렉션합니다.
    리디렉션("index.php");
    }
    $ user-> login()을 실행하면 필요한 세션 변수가 생성되어 사용자가 후속 로그인에서 로그인 상태를 유지할 수 있습니다.

    로그아웃은 거의 같은 방식으로 구현됩니다.

    인덱스.php

    If (isset ($ _ GET ["logout"])) (

    $ 사용자 = 새로운 사용자();

    ($ 사용자-> 로그인한 경우 ()) (
    $ 사용자-> 로그아웃();
    }

    리디렉션("index.php");
    }
    코드 끝에서 사용자를 다시 index.php로 리디렉션하므로 URL의 ? Logout = 1 매개변수는 제외됩니다.

    index.php 파일도 보호가 필요합니다. 이미 로그인한 사용자가 양식을 보는 것을 원하지 않습니다. 이를 위해 우리는 $ user->login() 메소드를 사용합니다:

    인덱스.php

    $ 사용자 = 새로운 사용자();

    if ($ 사용자-> 로그인 ()) (
    리디렉션("protected.php");
    }
    마지막으로 사이트의 페이지를 보호하고 승인 후에만 사용할 수 있도록 하는 방법을 살펴보겠습니다.

    보호된.php

    // 사이트의 모든 PHP 페이지를 보호하려면 main.php를 포함하십시오.
    // 그리고 새로운 User 객체를 생성합니다. 그것은 "간단하다!

    require_once "포함 / main.php";

    $ 사용자 = 새로운 사용자();

    if(!$사용자->로그인())(
    리디렉션("index.php");
    }
    이 확인 후 사용자가 성공적으로 로그인했는지 확인할 수 있습니다. 또한 $ 사용자 개체의 속성으로 데이터베이스에 저장된 데이터에 액세스할 수 있습니다. 사용자의 이메일과 순위를 표시하려면 다음 코드를 사용하십시오.

    에코 "귀하의 이메일:" $ 사용자-> 이메일;
    echo "당신의 순위:" $ user-> rank ();
    여기서 rank()는 하나의 메소드인데, 데이터베이스의 rank 컬럼은 보통 숫자(일반 사용자는 0, 관리자는 1)를 포함하며, 이 모든 것을 순위 이름으로 변환해야 하므로 이 메소드를 사용하여 구현합니다. 일반 사용자를 관리자로 전환하려면 phpmyadmin(또는 다른 데이터베이스 프로그램)에서 사용자 계정을 편집하기만 하면 됩니다. 관리자로서 사용자에게는 특별한 기능이 부여되지 않습니다. 귀하는 관리자에게 부여할 권한을 선택할 권리가 있습니다.

    준비가 된!

    이것으로 간단한 등록 시스템이 준비되었습니다! 기존 PHP 사이트에서 사용하거나 자신의 요구 사항에 맞게 업그레이드할 수 있습니다.

    PHP | 2017년 1월 25일 | 영리한 기술자

    이 레슨에서는 PHP 유효성 검사 규칙을 사용하여 사용자 계정 등록 양식을 만들고 프로필 아바타 이미지를 업로드하고 MySQL 데이터베이스에 사용자 데이터를 삽입하는 방법을 배웁니다. 그런 다음 데이터베이스에서 정보를 검색하여 사용자 프로필 시작 페이지에 표시합니다. 환영 페이지는 다음과 같습니다.

    양식 CSS 및 HTML 설정

    먼저 아래 codepen에서 HTML 소스를 복사하고 form.php라는 파일에 코드를 배치합니다. 또한 같은 디렉토리에 form.css라는 다른 파일을 만들고 아래 코드펜의 모든 CSS 코드를 복사하여 붙여넣습니다.

    "form.php와 form.css를 저장했으면 form.php를 실행하여 양식이 어떻게 생겼는지 확인할 수 있습니다. 위 코드펜의 "결과" 탭에 표시된 것과 정확히 같아야 합니다. ...

    데이터베이스 및 테이블 생성

    양식에 PHP 코드를 추가하기 전에 "등록된 사용자 정보를 저장할 테이블이 있는 데이터베이스를 생성합니다. 아래 SQL 스크립트에서 데이터베이스" 계정 "및 테이블" 사용자를 생성합니다.

    CREATE DATABASE 계정; CREATE TABLE `accounts`.`users` (` id` INT NOT NULL AUTO_INCREMENT, `username` VARCHAR(100) NOT NULL,` email` VARCHAR(100) NOT NULL, `password` VARCHAR(100) NOT NULL,` 아바타 `VARCHAR(100) NOT NULL, 기본 키(` id`));

    다음은 MySQL 데이터베이스에 연결하고 데이터베이스 및 사용자 테이블을 생성하기 위해 위의 SQL 문을 실행하기 위한 오류 검사가 포함된 전체 코드입니다.

    // 연결 변수 $ host = "localhost"; $ 사용자 = "루트"; $ 비밀번호 = "mypass123"; // mysql 연결 생성 $ mysqli = new mysqli ($ host, $ user, $ password); if ($ mysqli-> connect_errno) (printf ("연결 실패:% s \ n", $ mysqli-> connect_error); die ();) // 데이터베이스 생성 if (! $ mysqli-> query("CREATE DATABASE account2 ")) (printf (" Errormessage:% s \ n ", $ mysqli-> error);) // 모든 필드가 있는 사용자 테이블 생성 $ mysqli-> query (" CREATE TABLE `accounts2`.`users` ( `id` INT NOT NULL AUTO_INCREMENT,` 사용자 이름` VARCHAR(100) NOT NULL, `email` VARCHAR(100) NOT NULL,` 비밀번호` VARCHAR(100) NOT NULL, `아바타' VARCHAR(100) NOT NULL, PRIMARY KEY (`id`));") or die ($ mysqli-> error);

    HTML, CSS 및 데이터베이스 테이블이 준비된 상태에서 "이제 양식 작업을 시작하기 위해 읽고 있습니다. 첫 번째 단계는 오류 메시지를 표시할 장소를 만든 다음 일부 양식 유효성 검사를 작성하는 것입니다."

    오류 메시지에 대한 새 세션 시작

    form.php를 열고 맨 위에 다음 줄을 추가하고 php의 여는 태그와 닫는 태그를 사용하도록 합니다.

    사용자가 성공적으로 등록한 후 "welcome.php" 페이지에서 "$ _SESSION [" message "]에 액세스해야 하기 때문에 새 세션을 만들었습니다. MySQL 연결도 바로 생성되었으므로 데이터베이스 작업을 할 수 있습니다. 나중에.

    또한 현재 페이지에 $ _SESSION ["message"]를 인쇄해야 합니다. 처음부터 메시지는 우리가 원하는 ""(빈 문자열)로 설정되므로 이 시점에서 아무 것도 인쇄되지 않습니다. 계속해서 적절한 DIV 태그 안에 메시지를 추가하도록 하십시오.

    검증 규칙 생성

    이 양식은 이미 일부 유효성 검사 규칙과 함께 제공되며, HTML 입력 태그 내부의 키워드 "필수"는 필드가 비어 있지 않은지 확인하므로 "빈 필드에 대해 걱정할 필요가 없습니다. 또한 입력 유형을 다음으로 설정하여 "email and" password ", HTML5는 적절한 이메일 및 암호 형식에 대한 양식의 유효성을 검사하므로 해당 필드에 대한 규칙도 만들 필요가 없습니다.

    그러나 암호가 일치하는지, 아바타 파일이 실제로 이미지인지 확인하고 사용자가 데이터베이스에 추가되었는지 확인하기 위해 몇 가지 유효성 검사 규칙을 작성해야 합니다.

    "다른 파일을 만들고 잘 정리된 상태로 유지하기 위해 validate.php라고 부르도록 하십시오. 우리는" 우리의 form.php에서 이 파일을 포함할 것입니다.

    우리가 "validate.php 안에서 할 첫 번째 일은 양식이 제출되고 있는지 확인하는 것입니다.

    / * validate.php * / // 양식이 post 메소드로 제출되었습니다 if ($ _SERVER ["REQUEST_METHOD"] == "POST") ()

    그런 다음 "비밀번호와 비밀번호 확인이 서로 동일한지 확인합니다.

    if ($ _SERVER ["REQUEST_METHOD"] == "POST") (// 두 암호가 서로 동일한지 확인 if ($ _POST ["password"] == $ _POST ["confirmpassword"]) ())

    슈퍼 전역 변수 작업

    슈퍼 전역 변수 $ _SERVER 및 $ _POST를 사용하여 필요한 정보를 얻은 방법에 유의하십시오. $ _POST 변수 내의 키 이름은 양식을 제출하기 위해 method = "post"를 사용했기 때문에 사용할 수 있습니다.

    키 이름은 속성 이름이 있는 모든 명명된 HTML 입력 필드입니다(예: name = "password", name = "confirmpassword"):

    />

    좀 더 명확히 하자면, 여기에 print_r($ _ POST) 함수를 사용한 다음 die(); 스크립트를 인쇄한 직후 종료하려면 이것은 스크립트를 디버깅하고 무슨 일이 일어나는지 확인하는 좋은 방법입니다:

    if ($ _SERVER ["REQUEST_METHOD"] == "POST") (print_r ($ _ POST); die (); / * 출력: 배열(=> smarttechie => [이메일 보호됨]=> mypass123 => mypass123 => 등록) * /

    이제 우리는 "$ _POST에서 제출된 나머지 값을 가져와 MySQL 데이터베이스 테이블에 삽입할 수 있도록 적절한 형식을 지정합니다.

    // 양식이 post와 함께 제출되었습니다. if ($ _SERVER ["REQUEST_METHOD"] == "POST") (if ($ _POST ["password"] == $ _POST ["confirmpassword"]) (// 다른 변수 정의 $ _POST $ mysqli-> real_escape_string ($ _ POST ["username"]); $ email = $ mysqli-> real_escape_string ($ _ POST ["email"]); // md5 해시 보안용 비밀번호 $ password = md5 ($ _ POST ["password"]); // 아바타 이미지가 저장될 경로 $ avatar_path = $ mysqli-> real_escape_string ("images /".$_ FILES [" avatar "] [" 이름 "]) ;))

    위의 코드에서 real_escape_string() 메서드를 사용하여 사용자 이름, 이메일 및 avatar_path가 데이터베이스에 유효한 SQL 문자열로 삽입될 수 있도록 적절한 형식인지 확인했습니다. 또한 보안을 위해 md5() 해시 함수를 사용하여 비밀번호에서 해시 문자열을 생성했습니다.

    파일 업로드 작동 방식

    또한 사용자의 컴퓨터에서 업로드되는 아바타인 이미지에 대한 정보를 보유하는 새로운 슈퍼 전역 변수 $ _FILES에 주목하십시오. $ _FILES 변수는 enctype =" multipart / form-data "를 사용했기 때문에 사용할 수 있습니다. 우리의 형태로:

    다음은 print_r($ _ FILES) 다음에 die()를 사용하는 경우의 출력입니다. $ _POST 변수에 대해 했던 것처럼:

    if ($ _SERVER ["REQUEST_METHOD"] == "POST") (print_r ($ _ FILES); die (); / * 출력: 배열(=> 배열(=> guldan.png => 이미지 / png => C) : \ Windows \ Temp \ php18D8.tmp => 0 => 98823)) * / // 이것이 "이미지 이름에 액세스할 수 있는 방법입니다. $ _FILES [" avatar "] [" name "]; // guldan . png

    파일이 처음 업로드되면 post 방식을 사용하여 임시 디렉토리에 저장됩니다. 그 디렉토리는 위의 출력에서 ​​"C: \ Windows \ Temp \ php18D8.tmp"인 $ _FILES ["avatar"] ["tmp_name"]로 액세스할 수 있습니다.

    그런 다음 해당 파일을 임시 디렉토리에서 원하는 디렉토리인 $ avatar_path로 복사할 수 있습니다. 그러나 파일을 복사하기 전에 파일이 실제로 이미지인지 확인해야 합니다. "$ _FILES 변수에서 호출된 다른 키를 확인할 것입니다.

    // 아바타 이미지가 저장될 경로 $ avatar_path = $ mysqli-> real_escape_string ("images /".$_ FILES [" avatar "] [" name "]); // 파일 형식이 이미지인지 확인 if (preg_match ("! image!", $ _ FILES ["avatar"] ["type"])) (// 이미지를 이미지 / 폴더로 복사 if (copy ($ _ FILES [" 아바타 "] [" tmp_name "], $ 아바타 경로)) ())

    preg_match 함수는 $ _FILES 배열의 ["type"] 키에서 이미지와 일치합니다. 그런 다음 copy() 함수를 사용하여 두 개의 매개변수를 받는 이미지 파일을 복사합니다. 첫 번째는 ["tmp_name"] 디렉토리인 소스 파일 경로이고 두 번째는 "images / guldan.png" 파일 경로인 대상 경로입니다.

    MySQL 데이터베이스에 사용자 데이터 저장

    이제 "다음 페이지에서 필요한 사용자 이름과 avatar_path" 세션 변수를 설정할 수 있으며 제출된 모든 데이터를 MySQL 데이터베이스에 삽입하는 SQL 쿼리도 생성할 수 있습니다.

    if (copy ($ _ FILES ["avatar"] ["tmp_name"], $ avatar_path)) (// 시작 페이지에 표시할 세션 변수 설정 $ _SESSION ["username"] = $ username; $ _SESSION ["avatar" ] = $ avatar_path; // 데이터베이스에 데이터를 삽입하기 위한 SQL 쿼리 문자열 생성 $ sql = "INSERT INTO users (username, email, password, avatar)". "VALUES (" $ username "," $ email "," $ 비밀번호 "," $ avatar_path ")";)

    마지막 단계는 쿼리() 메서드를 사용하여 쿼리를 돌리고 "성공적"인지 확인하는 것입니다. 성공하면 사용자 데이터가 "users" 테이블에 성공적으로 저장되었음을 의미합니다! 그런 다음 최종 세션 변수 $를 설정합니다. _SESSION ["message"] 헤더() 함수를 사용하여 사용자를 welcome.php 페이지로 리디렉션합니다.

    // mysql 쿼리가 성공했는지 확인 if ($ mysqli-> query ($ sql) === true) ($ _SESSION ["message"] = "Registration successful! added $ username to the database!"; // 리다이렉트 welcome.php 헤더에 사용자("위치: welcome.php");)

    "검증에 필요한 거의 모든 것"은 "만약 우리가 만든 모든 if 문에서 계획대로 진행되지 않을 경우에 대비한" else "키워드를 모두 추가하기만 하면 됩니다. 지금까지 validate.php의 전체 코드는 다음과 같습니다.

    / * validate.php * / // 양식이 post와 함께 제출되었습니다. if ($ _SERVER ["REQUEST_METHOD"] == "POST") (// 두 개의 비밀번호가 서로 같습니다 if ($ _POST ["password"] == $ _POST ["confirmpassword"]) (// $ _POST $ username = $ mysqli-> real_escape_string ($ _ POST ["username"])에서 제출된 값으로 다른 변수 정의; $ email = $ mysqli-> real_escape_string ($ _POST ["email"]); // 보안을 위한 md5 해시 암호 $ password = md5 ($ _ POST ["password"]); // 아바타 이미지가 저장될 경로 $ avatar_path = $ mysqli-> real_escape_string("images /".$_FILES""avatar""""name "]); // 파일 형식이 이미지인지 확인 if (preg_match ("! Image! ", $ _ FILES [" avatar "] [" type "])) (// 이미지를 이미지/폴더로 복사 if (copy ($ _ FILES ["avatar"] ["tmp_name"], $ avatar_path)) (// 시작 페이지에 표시할 세션 변수 설정 $ _SESSION [ "username"] = $ username; $ _SESSION ["avatar"] = $ avatar_path; // 사용자 데이터를 데이터베이스에 삽입 $ sql = "INSERT INTO users(username, email, password, avatar)". "VALUES(" $ use 이름 "," $ 이메일 "," $ 비밀번호 "," $ avatar_path ")"; // mysql 쿼리가 성공했는지 확인 if ($ mysqli-> query ($ sql) === true) ($ _SESSION ["message"] = "Registration successful!". "Added $ username to the database!"; / / 사용자를 welcome.php 헤더로 리디렉션합니다("location: welcome.php");)))))

    문제가 발생할 때 세션 오류 메시지 설정

    "가서 if 문 중 하나가 실패할 때 출력될 $ _SESSION [" message "] 오류 메시지를 설정하기만 하면 모든 else 문을 한 번에 추가합니다. 마지막 if 문 바로 뒤에 다음 코드를 추가합니다. 여기서 우리는 성공적인 mysqli 쿼리와 다음과 같이 마지막 중괄호 내에서 확인했습니다.

    If ($ mysqli-> query ($ sql) === true) ($ _SESSION ["message"] = "등록 성공!". "$ 사용자 이름을 데이터베이스에 추가했습니다!"; 헤더("위치: welcome.php" );) else ($ _SESSION ["message"] = "사용자를 데이터베이스에 추가할 수 없습니다!";) $ mysqli-> close (); ) else ($ _SESSION ["message"] = "파일 업로드 실패!";)) else ($ _SESSION ["message"] = "GIF, JPG 또는 PNG 이미지만 업로드하세요!";)) else ($ _SESSION [ "message"] = "두 개의 비밀번호가 일치하지 않습니다!";)) // if ($ _SERVER ["REQUEST_METHOD"] == "POST")

    세션 메시지는 다음과 같은 경우 $ _SESSION ["message"]를 넣은 div 태그에 오류 메시지를 표시합니다.

    다음은 두 개의 비밀번호가 "일치하지 않을 때 표시되는 오류 메시지의 예입니다. 다른 오류 메시지를 트리거하기 위해 자유롭게 사용하십시오.


    사용자 프로필 시작 페이지 생성

    이제 validate.php 작업이 완료되었습니다. 마지막 단계는 사용자 이름, 아바타 이미지 및 이전에 이미 등록된 일부 사용자와 함께 자신의 사용자 이름 및 미니 아바타 썸네일을 표시하는 welcome.php 페이지를 만드는 것입니다. 여기 완전한 welcome.php의 모습입니다. 혼란스러울 수 있는 부분을 설명하겠습니다.

    ">
    어서 오십시오 쿼리($ SQL); ?>
    등록된 모든 사용자:fetch_assoc()) (에코 "
    ". $ 행 [" 사용자 이름 "]."
    "; 에코"
    "; } ?>

    위의 $ _SESSION 변수 부분은 이해하기 쉬워야 합니다. 변수를 validate.php 페이지에서 이 welcome.php 페이지로 옮기기만 하면 됩니다. "여전히 혼란스럽다면 전체 분석을 위해 페이지를 확인하십시오.

    MySQL 결과 개체 작업

    SQL 쿼리에서 "SELECT" 문을 사용한 다음 $ mysqli-> 쿼리($ sql) 명령으로 해당 SQL을 실행할 때마다 반환된 값은 MySQL 결과 개체입니다. 결과 개체가 있으면 데이터 작업을 추가로 시작할 수 있도록 몇 가지 메서드를 사용할 수 있습니다.

    $ sql = "사용자 이름, 아바타 FROM 사용자 선택"; $ 결과 = $ mysqli-> 쿼리($ sql); // $ 결과 = mysqli_result 객체

    이러한 방법 중 하나는 현재 행을 가져오고 모든 행 데이터가 포함된 배열을 반환하는 $ result-> fetch_assoc()입니다. 그래서 우리는 "결과 세트의 마지막 행에 도달하면 거짓이 될 조건식에 그것을 넣고 $ result-> fetch_assoc()에서 반환된 값을 $ row 변수 안에 저장합니다.

    // 가져온 행의 연관 배열을 반환하는 동안 ($ row = $ result-> fetch_assoc()) (echo "

    ". $ 행 [" 사용자 이름 "]."
    "; 에코"
    "; }

    결론

    그리고 "우리가" 이전에 이미 등록되어 있고 사용자 데이터베이스에 살고 있는 사용자 중 반환되는 연관 배열에서 $ row ["username"] 및 $ row ["avatar"]에 액세스할 수 있는 방법 테이블!

    프로필 시작 페이지는 이제 이 단원의 맨 처음에 표시된 것과 매우 유사해야 하며 양식이 이제 완성되었습니다. 수고하셨습니다! 아래 의견에 질문을 게시하십시오.