Adonis registratsiyasi php. PHP va MySQL-da oddiy foydalanuvchilarni ro'yxatdan o'tkazish tizimini yaratish

Ushbu qo'llanmada men sizga PHP va MySQL-dan foydalanib, foydalanuvchi nomi, elektron pochta va parolni taqdim etish, tizimga kirish va tizimdan chiqish orqali hisob qaydnomasini yaratishi mumkin bo'lgan foydalanuvchini ro'yxatdan o'tkazish tizimini yaratish jarayonining to'liq jarayoni bilan tanishaman. Sizga ba'zi sahifalarni faqat tizimga kirgan foydalanuvchilarga qanday qilib kirishingiz mumkinligini ko'rsataman. Tizimga kirmagan boshqa har qanday foydalanuvchi sahifaga kira olmaydi.

PHP va MySQL ma'lumotlar bazalari bilan to'liq blog yaratishni o'rganing YouTube-da bepul kurs.

Bizga kerak bo'lgan birinchi narsa - ma'lumotlar bazasini o'rnatish.

Deb nomlangan ma'lumotlar bazasini yarating ro'yxatdan o'tish... In ro'yxatdan o'tish ma'lumotlar bazasi, deb nomlangan jadvalni qo'shing foydalanuvchilar... Foydalanuvchilar jadvali quyidagi to'rtta maydonni oladi.

  • foydalanuvchi nomi - varchar (100)
  • elektron pochta - varchar (100)
  • parol - varchar (100)

Buni PHPMyAdmin kabi MySQL mijozi yordamida yaratishingiz mumkin.

Yoki uni quyidagi SQL skriptidan foydalanib MySQL so'rovida yaratishingiz mumkin:

TABLE `users` (` id` int (11) NULL AUTO_INCREMENT PRIMARY KEY, `username` varchar (100) NOT NULL,` email` varchar (100) NOT NULL, `password` varchar (100) NOT NULL) ENGINE = InnoDB DEFAULT CHARSET = latin1;

Va bu ma'lumotlar bazasi bilan.

Endi nomli papkani yarating ro'yxatdan o'tish bizning serverimizga kiradigan katalogda. ya'ni htdocs ichida (agar siz XAMPP serveridan foydalansangiz) yoki ichidagi papkani yarating www(agar siz wampp serveridan foydalanayotgan bo'lsangiz).

Jildning ichida ro'yxatdan o'tish, quyidagi fayllarni yarating:

O'zingiz tanlagan matn muharririda ushbu fayllarni oching. Meniki - bu buyuk matn 3.

Foydalanuvchini ro'yxatdan o'tkazish

Register.php faylini oching va unga quyidagi kodni joylashtiring:

regiser.php:

Ro'yxatdan o'tish

Siz allaqachon a'zo bo'lganmisiz? tizimga kirish

Hozircha hech qanday murakkab narsa yo'qmi?

Bu erda ta'kidlash kerak bo'lgan bir nechta narsa:

Birinchidan, bu bizning shaklimiz harakat atribut register.php-ga o'rnatildi. Bu shuni anglatadiki, shaklni yuborish tugmasi bosilganda, formadagi barcha ma'lumotlar bir xil sahifaga (registr.php) yuboriladi. Ushbu shakl ma'lumotlarini qabul qiladigan kodning bir qismi server.php faylida yozilgan va shuning uchun uni registr.php faylining yuqori qismiga kiritamiz.

Shakl xatolarini ko'rsatish uchun biz error.php faylini qo'shayotganimizga ham e'tibor bering. Tez orada bunga erishamiz.

Bosh qismida ko'rganingizdek, biz style.css fayliga havola qilamiz. Style.css faylini oching va unga quyidagi CSS-ni joylashtiring:

* (margin: 0px; padding: 0px;) body (shrift hajmi: 120%; background: # F8F8FF;) .header (width: 30%; margin: 50px auto 0px; color: white; background: # 5F9EA0; text -align: center; border: 1px qattiq # B0C4DE; border-bottom: none; border-radius: 10px 10px 0px 0px; padding: 20px;) form, .content (width: 30%; margin: 0px auto; padding: 20px ; chegara: 1px qattiq # B0C4DE; fon: oq; chegara radiusi: 0px 0px 10px 10px;) .input-group (margin: 10px 0px 10px 0px;) .input-group label (displey: block; text-align: left ; margin: 3px;) .input-group input (balandlik: 30px; kenglik: 93%; to'ldirish: 5px 10px; shrift hajmi: 16px; border-radius: 5px; border: 1px solid grey;) .btn (padding: 10px; shrift hajmi: 15px; rang: oq; fon: # 5F9EA0; chegara: yo'q; chegara radiusi: 5px;) .error (kenglik: 92%; chekka: 0px avtomatik; to'ldirish: 10px; chegara: 1px qattiq # a94442; rang: # a94442; fon: # f2dede; chegara radiusi: 5px; matn bilan tekislash: chap;). muvaffaqiyat (rang: # 3c7 63d; fon: # dff0d8; chegara: 1px qattiq # 3c763d; chekka-pastki: 20px; )

Endi forma chiroyli ko'rinadi.

Endi shakldan yuborilgan ma'lumotlarni oladigan kodni yozing va ma'lumotlar bazasida ma'lumotlarni saqlang (ro'yxatdan o'tkazing). Oldin va'da qilinganidek, biz buni server.php faylida qilamiz.

Server.php-ni oching va ushbu kodni joylashtiring:

server.php

Sessiyalar tizimga kirgan foydalanuvchilarni kuzatish uchun ishlatiladi va shuning uchun biz faylning yuqori qismiga session_start () joylashtiramiz.

Koddagi sharhlar hamma narsani tushuntirib beradi, ammo men bu erda bir nechta narsani ta'kidlayman.

If iborasi ro'yxatdan o'tish formasidagi reg_user tugmachasi bosilganligini aniqlaydi. Yodingizda bo'lsin, bizning shaklimizda yuborish tugmachasida reg_user-ga o'rnatilgan ism atributi mavjud va biz if iborasiga murojaat qilgan narsamiz.

Barcha ma'lumotlar shakldan olinadi va foydalanuvchining shaklni to'g'ri to'ldirganligiga ishonch hosil qilish uchun tekshiriladi. Parollarning mosligiga ishonch hosil qilish uchun ularni taqqoslashadi.

Hech qanday xatoga yo'l qo'yilmasa, foydalanuvchi ro'yxatdan o'tgan foydalanuvchilar parol bilan ma'lumotlar bazasidagi jadval. Xashlangan parol xavfsizlik sababli. Bu xaker sizning ma'lumotlar bazangizga kirishga muvaffaq bo'lgan taqdirda ham, ular sizning parolingizni o'qiy olmasligini ta'minlaydi.

Ammo xato xabari hozir ko'rinmayapti, chunki бидний error.php fayli hali ham bo'sh. Xatolarni ko'rsatish uchun ushbu kodni error.php fayliga joylashtiring.

0) : ?>

Agar foydalanuvchi ma'lumotlar bazasida ro'yxatdan o'tgan bo'lsa, darhol tizimga kiradi va index.php sahifasiga yo'naltiriladi.

Va bu ro'yxatdan o'tish uchun. Foydalanuvchilarning kirishini ko'rib chiqaylik.

Kirish foydalanuvchisi

Foydalanuvchini tizimga kiritish - bu yanada osonroq ish. Kirish sahifasini oching va ichiga ushbu kodni qo'ying:

PHP va MySQL-ni ro'yxatdan o'tkazish tizimi

Kirish

Hali a'zo emasmisiz? Ro'yxatdan o'tish

Ushbu sahifadagi hamma narsa registr.php sahifasiga juda o'xshash.

Endi foydalanuvchini tizimga kiritadigan kod bir xil server.php faylida yozilishi kerak. Shunday qilib server.php faylini oching va faylning oxiriga ushbu kodni qo'shing:

// ... // LOGIN USER if (isset ($ _ POST ["login_user"])) ($ username = mysqli_real_escape_string ($ db, $ _POST ["username"]); $ password = mysqli_real_escape_string ($ db, $ _POST ["parol"]); agar (bo'sh ($ foydalanuvchi nomi)) (array_push ($ xatolar, "Foydalanuvchi nomi talab qilinadi");) agar (bo'sh ($ parol)) (array_push ($ xatolar, "Parol kerak")) ;) if (count ($ error) == 0) ($ password = md5 ($ password); $ query = "SELECT * FROM users from WHERE username =" $ username "AND password =" $ password ""; $ results = mysqli_query ($ db, $ query); if (mysqli_num_rows ($ results) == 1) ($ _SESSION ["username"] = $ username; $ _SESSION ["success"] = "Siz hozir tizimga kirdingiz"; header ( "location: index.php");) else (array_push ($ xatolar, "noto'g'ri foydalanuvchi nomi / parol birikmasi");)))?>

Shunga qaramay, bularning barchasi foydalanuvchining shaklni to'g'ri to'ldirganligini tekshirish, ularning ma'lumotlari ma'lumotlar bazasidagi yozuv bilan mos kelishini tekshirish va agar kerak bo'lsa, ularni ro'yxatdan o'tkazishdir. Tizimga kirgandan so'ng, foydalanuvchi ularni muvaffaqiyatli xabar bilan index.php fayliga yo'naltiradi.

Endi index.php faylida nima sodir bo'lishini ko'raylik. Uni oching va quyidagi kodni joylashtiring:

Uy

Bosh sahifa

Xush kelibsiz

chiqish

Birinchi if ifodasi foydalanuvchi allaqachon tizimga kirganligini tekshiradi. Agar ular tizimga kirmagan bo'lsa, ular kirish sahifasiga yo'naltiriladi. Shuning uchun ushbu sahifaga faqat tizimga kirgan foydalanuvchilar kirishlari mumkin. Agar siz biron bir sahifani faqat tizimga kirgan foydalanuvchilar uchun ochilishini xohlasangiz, faqat shu faylni faylning yuqori qismiga qo'ying.

Ikkinchi if bayonoti foydalanuvchi tizimdan chiqish tugmachasini bosganligini tekshiradi. Ha bo'lsa, tizim ularni o'chirib tashlaydi va ularni kirish sahifasiga yo'naltiradi.

Endi davom eting, uni o'zingizning ehtiyojlaringizga mos ravishda sozlang va ajoyib sayt yarating. Agar sizda biron bir tashvish yoki aniqlik kiritish kerak bo'lsa, uni quyidagi izohlarda qoldiring va yordam keladi.

Siz har doim ijtimoiy tarmoqlarda bo'lishish yoki do'stlarim va hamkasblarimga blogimni tavsiya qilish orqali yordam berishingiz mumkin.

Xayrli kun do'stlar! Keling, siz bilan PHP-da foydalanuvchi ro'yxatdan o'tishini ko'rib chiqaylik. Birinchidan, foydalanuvchini ro'yxatdan o'tkazish shartlarini aniqlaylik:

  • Biz algoritm yordamida parolni shifrlaymiz MD5
  • Parol "tuzlangan" bo'ladi
  • Kirish mavjudligini tekshiring
  • Foydalanuvchini xat bilan faollashtirish.
  • Ma'lumotlarni yozish va saqlash MySQL ma'lumotlar bazalari

Ushbu skriptni yozish uchun foydalanuvchini ro'yxatdan o'tkazish nima ekanligini tushunishimiz kerak. Foydalanuvchilarni ro'yxatdan o'tkazish - bu haqiqiy foydalanuvchidan ma'lumotlarni qabul qilish, ma'lumotlarni qayta ishlash va saqlash.

Agar biz oddiy so'zlar bilan tushuntiradigan bo'lsak, unda ro'yxatdan o'tish - bu biz foydalanuvchiga vakolat bera oladigan ba'zi ma'lumotlarni yozib olish va saqlashdir - bu Kirish va Parol.

Avtorizatsiya - bu muayyan shaxsga yoki shaxslar guruhiga muayyan harakatlarni amalga oshirish huquqini berish, shuningdek ushbu harakatlarni amalga oshirishga urinishda ushbu huquqlarni tekshirish jarayoni. Sodda qilib aytganda, avtorizatsiya yordamida veb-saytimizdagi bir yoki boshqa tarkibga kirishni cheklashimiz mumkin.

Ro'yxatdan o'tishni avtorizatsiya bilan amalga oshirish uchun skript kataloglarining tuzilishini ko'rib chiqamiz. Biz skriptlarni mantiqiy tarkibiy qismlarga ajratishimiz kerak. Biz ro'yxatdan o'tish va avtorizatsiya qilish modullarini alohida katalogga joylashtirdik. Shuningdek, ma'lumotlar bazasiga ulanishni alohida kataloglarga joylashtiramiz. MySQL, maxsus funktsiyalari bo'lgan fayl, uslublar fayli CSS va bizning shablonimiz HTML... Ushbu tuzilma skriptlarni tezda harakatga keltirishga imkon beradi. Tasavvur qiling, sizda bir nechta modullar va boshqalar mavjud bo'lgan katta sayt mavjud. agar buyurtma bo'lmasa, bunday tartibsizlikda biror narsani topish juda qiyin bo'ladi.

Biz barcha ma'lumotlarni saqlaymiz MySQL ma'lumotlar bazalari, keyin ro'yxatdan o'tish ma'lumotlarini saqlaydigan kichik jadval yarataylik.

Birinchidan, ma'lumotlar bazasida jadval yaratishingiz kerak. Jadval chaqiriladi bez_reg qayerda bez jadval prefiksi va reg jadval nomi.

Jadval tarkibi: bez_reg

- - Jadval tuzilishi `bez_reg` - JADVALNI YO'Q BO'LSA BO'LADI bez_reg` (` id` int (11) NULL AUTO_INCREMENT, `login` varchar (200) NULL emas,` pass` varchar (32) NULL emas, 'tuz `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;

Endi keyingi ish uchun asosiy skriptlarni yarataylik.

INDEX.PHP fayli

CONFIG.PHP fayli

"); ?>

404.html fayli

Xato 404

Xato 404

Sahifada 404 xatolik yuz berdi

Qaytish

BD.PHP fayli

INDEX.HTML fayli

PHP MySQL foydalanuvchini elektron pochta orqali ro'yxatdan o'tkazish

FUNCT.PHP fayli

"." \ n "; if (is_array ($ data)) (foreach ($ data as $ val) $ err. ="

  • ". $ val."
  • "." \ n ";) else $ err. ="
  • ". $ ma'lumotlar."
  • "." \ n "; $ err. =""." \ n "; return $ err;) / ** MySQL so'rovlari uchun oddiy o'rash * @param string $ sql * / function mysqlQuery ($ sql) ($ res = mysql_query ($ sql); / * natijani tekshirish MySQL-ga yuborilgan haqiqiy so'rovni va xatoni ko'rsatadi. Nosozliklarni tuzatish uchun qulay. * / if (! $ res) ($ message = "Noto'g'ri so'rov:". mysql_error (). "\ n"; $ message. = " So'rov to'liq: ". $ Sql; die ($ message);) return $ res;) / ** Simple tuz generatori * @param string $ sql * / function salt () ($ salt = substr (md5 (uniqid ()) ), - 8); $ tuzni qaytaring;)

    Yozishni ro'yxatdan o'tkazishga o'tamiz. Birinchidan, foydalanuvchi o'z ma'lumotlarini qayta ishlash uchun kiritishi uchun biz ro'yxatdan o'tish formasining shablonini tayyorlashimiz kerak. Keyinchalik, biz ariza ishlov beruvchisini o'zi yozishimiz kerak bo'ladi, bu kiritilgan foydalanuvchi ma'lumotlarining to'g'riligini tekshiradi. Ma'lumotlar muvaffaqiyatli tekshirilgandan so'ng, biz ularni ma'lumotlar bazasiga yozamiz va foydalanuvchiga uning hisobini faollashtirish uchun xat yuboramiz.

    REG.PHP fayli

    Siz muvaffaqiyatli ro'yxatdan o'tdingiz! Iltimos, hisobingizni faollashtiring !!"; // Biz hisobni faollashtiramiz, agar (isset ($ _ GET [" key "])) (// kalitini tekshiring $ sql =" SELECT * FROM "" BEZ_DBPREFIX. "Reg` WHERE` active_hex` =" " . Escape_str ($ _GET ["key"]). "" "; $ Res = mysqlQuery ($ sql); if (mysql_num_rows ($ res) == 0) $ err =" Faollashtirish tugmasi to'g'ri emas! "; / / Xatolarni tekshiring va agar (count ($ err)> 0) echo showErrorMessage ($ err); else (// foydalanuvchining manzilini oling $ row = mysql_fetch_assoc ($ res); $ email = $ row [") bo'lsa, foydalanuvchiga ko'rsating. login "]; // Hisob qaydnomasi foydalanuvchisini faollashtiring $ sql =" UPDATE` ". BEZ_DBPREFIX." reg` SET `status` = 1 WHERE` login` =" ". $ email." ""; $ res = mysqlQuery ($ sql); // faollashtirish uchun elektron pochta xabarini yuboring $ title = "(! LANG: http: // saytidagi hisob qaydnomangiz muvaffaqiyatli faollashtirildi"; $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("/^!} [elektron pochta bilan himoyalangan](+ \.) + (2,6) $ / i ", $ _POST [" elektron pochta "])) $ err =" Elektron pochta noto'g'ri kiritilgan "." \ N ";) if (bo'sh ($ _ POST [ "pass"])) $ err = "Parol maydoni bo'sh bo'lishi mumkin emas"; if (empty ($ _ POST ["pass2"])) $ err = "Parolni tasdiqlash maydoni bo'sh bo'lishi mumkin emas"; // Xatolarni tekshiring va (count ($ err)> 0) echo showErrorMessage ($ err); boshqa (/ * Kiritilgan ma'lumotlarni tekshirishda davom eting Parollarning mosligini tekshiring * / if ($ _ POST ["pass"]! = $ _POST ["pass2"]) $ err = "Parollar mos emas"; // Xatolarni tekshiring va foydalanuvchiga uni (count ($ err)> 0) echo showErrorMessage ($ err); else (/ * Check agar bizda bunday foydalanuvchi ma'lumotlar bazasida * / $ sql = "SELECT` login` FROM` ". BEZ_DBPREFIX." reg` WHERE` login` = "". escape_str ($ _ POST ["email"]). "" "; $ res = mysqlQuery ($ sql); if (mysql_num_rows ($ res)> 0) $ err =" Kechirasiz kirish: ". $ _POST [" elektron pochta "]." band! "; // Xatolarni tekshiring va agar (count ($ err)> 0) echo showErrorMessage ($ err); else (// tuzning HASH-ni oling $ salt = salt (); / / Parolni tuzlang $ pass = md5 (md5 ($ _ POST ["pass"]). $ Tuz); / * Agar barchasi yaxshi bo'lsa, ma'lumotlarni ma'lumotlar bazasiga yozing * / $ sql = "INSERT INTO`". BEZ_DBPREFIX . "reg` VALUES (" "," ". escape_str ($ _ POST [" email "])." "," ". $ pass." "," ". $ tuz." "," ". md5 ( $ tuz). "", 0) "; $ res = mysqlQuery ($ sql); // $ url = BEZ_HOST-ni faollashtirish uchun elektron pochta xabarini yuborish." less / reg /? mode = reg & key = ". md5 ($ salt $ title = "(! LANG: http: / / veb-saytida ro'yxatdan o'tish"; $message = "Для активации Вашего акаунта пройдите по ссылке ". $url .""; sendMessageMail($_POST["email"], BEZ_MAIL_AUTOR, $title, $message); //Сбрасываем параметры header("Location:". BEZ_HOST ."less/reg/?mode=reg&status=ok"); exit; } } } } ?>!}

    REG_FORM.HTML fayli

    PHP MySQL foydalanuvchini elektron pochta orqali ro'yxatdan o'tkazish

    Elektron pochta *:
    Parol *:
    Parolni tasdiqlash *:

    Belgisi bo'lgan maydonlar * talab qilinadi

    Biz foydalanuvchilarni ro'yxatdan o'tkazishga tayyormiz, avtorizatsiya yozish vaqti keldi. Keling, foydalanuvchi avtorizatsiyasi uchun forma yarataylik, so'ngra avtorizatsiya formasini ishlov beruvchisini yozamiz va nihoyat skriptni tuzamiz show.php bu bizga tizimda vakolatli yoki yo'qligimizni ko'rsatadi.

    AUTH.PHP fayli

    0) echo showErrorMessage ($ err); else (/ * Foydalanuvchining haqiqiyligini tekshirish uchun ma'lumotlar bazasidan * * $ $ sql = "SELECT * FROM`" so'rovini yarating. BEZ_DBPREFIX. "reg` WHERE` login` = "". escape_str ($ _ POST [" email "])." "AND` status` = 1 "; $ res = mysqlQuery ($ sql); // Agar kirish mos bo'lsa, parolni tekshiring, agar (mysql_num_rows ($ res)> 0) (// Ma'lumotlarni oling jadval $ row = mysql_fetch_assoc ($ res); if (md5 (md5 ($ _ POST ["pass"]). $ row ["salt"]) == $ row ["pass"]) ($ _SESSION [" user "] = true; // Parametrlar sarlavhasini tiklash (" Joylashuv: ". BEZ_HOST." Less / reg /? Mode = auth "); chiqish;) else echo showErrorMessage (" Noto'g'ri parol! ");) Boshqa echo showErrorMessage ( "Kirish ". $ _POST [" elektron pochta "]." topilmadi! ");))?>

    PHP-ning so'nggi versiyasiga ega bo'lganlar uchun men ushbu skriptni foydalanib joylashtiraman PDO beri kengaytma MySQL eskirgan va PHP ning yangi versiyasidan olib tashlangan. PHP mysql pdo-ni ro'yxatdan o'tkazish va avtorizatsiyasini yuklab oling

    Arxiv 2015 yil 24 fevralda yangilandi.

    Diqqat: Agar siz ushbu skriptni mahalliy serverda ishlatayotgan bo'lsangiz DENWER,XAMPP, keyin siz pochta qutingizga xatlarni kutmasligingiz kerak. Xatlar bo'sh joyda sendmail... IN Denver ularni yo'l davomida topishingiz mumkin Z: \ tmp \! Sendmail \ ushbu fayllarni istalgan pochta mijozida ochishingiz mumkin.

    Saytga tashrif buyuruvchilarni ma'lum guruhlarga bo'lish uchun saytga kichik tizim o'rnatilishi kerak PHP-ni ro'yxatdan o'tkazish... Shunday qilib, siz shartli ravishda tashrif buyuruvchilarni tasodifiy tashrif buyuruvchilarning ikkita guruhiga va qimmatroq ma'lumot beradigan foydalanuvchilarning imtiyozli guruhiga ajratasiz.

    Ko'pgina hollarda, bitta faylda php-da yozilgan soddalashtirilgan ro'yxatga olish tizimi qo'llaniladi. registr.php.

    Shunday qilib, biz biroz chuqurlashamiz va endi ro'yxatga olish faylini batafsil ko'rib chiqamiz.

    Register.php fayli

    Bu sizning ko'p vaqtingizni talab qilmasligi uchun biz foydalanuvchilarni minimal aloqa ma'lumotlarini qabul qilib, to'playdigan tizim yaratamiz. Bunday holda, biz hamma narsani mysql ma'lumotlar bazasiga kiritamiz. Ma'lumotlar bazasining maksimal tezligi uchun biz foydalanuvchilar jadvalini MyISAM formatida va utf-8 kodlashida yaratamiz.

    Eslatma! Barcha skriptlar har doim bir xil kodlashda yozilishi kerak. Barcha sayt fayllari va MySql ma'lumotlar bazasi bir xil kodlashda bo'lishi kerak. Eng keng tarqalgan kodlashlar UTF-8 va Windows-1251.

    Nima uchun hamma narsani bitta kodlashda yozishingiz kerak, biz birozdan keyin gaplashamiz. O'sha vaqtga qadar ushbu ma'lumotni skript yozish uchun eng qat'iy qoidalar sifatida qabul qiling, aks holda kelajakda skript bilan bog'liq muammolar yuzaga keladi. Albatta, yaxshi, lekin senariydagi xatolarni qidirib ko'p vaqtni sarflaysan.

    Ssenariyning o'zi qanday ishlaydi?

    Biz hamma narsani soddalashtirmoqchimiz va tezkor natijalarga erishmoqchimiz. Shuning uchun biz foydalanuvchilardan faqat login, elektron pochta va parolni olamiz. Va spam-robotlardan himoya qilish uchun biz kichik captcha o'rnatamiz. Aks holda, Londondan biron bir bola bir necha daqiqada butun ma'lumotlar bazasini soxta foydalanuvchilar bilan to'ldiradigan va uning dahosi va jazosizligidan xursand bo'lgan kichik robot-parser yozadi.

    Mana, ssenariyning o'zi. Hammasi bitta faylda yozilgan registr.php:

    ! "; // qizil savol belgisi $ sha = $ sh. "scripts / pro /"; // asosiy papkaga yo'l $ bg = `bgcolor =" # E1FFEB "`; // satrlarning fon rangi?> registr skript registri regist.php style.css "/>

    Bunday holda, skript o'zi haqida gapiradi. Va bu shaklga kiritilgan ma'lumotlarning shakli va protsessori. Iltimos, fayl zip arxivida siqilganligini va config.php konfiguratsiya fayli, foydalanuvchilar ma'lumotlar bazasi dampini, yordamchi functions.php o'z ichiga olgan fayl, style.css uslublar jadvalini va registr.php faylini o'z ichiga olganligini unutmang. Captcha belgilarining ishlashi va yaratilishi uchun javobgar bo'lgan bir nechta fayllar mavjud.

    Ro'yxatga olish tizimini yaratish jarayoni juda ko'p ish. Elektron pochta manzillarining haqiqiyligini ikki marta tekshirish, elektron pochta xabarlarini yuborish, parollarni tiklash, parollarni xavfsiz joyda saqlash, kirish shakllarini tasdiqlash va boshqa ko'p narsalarni taklif qilish uchun sizga kod yozishingiz kerak. Bularning barchasini qilsangiz ham, foydalanuvchilar ro'yxatdan o'tishni istamaydilar, chunki eng minimal ro'yxatga olish ham ularning faolligini talab qiladi.

    Bugungi o'quv qo'llanmada biz ro'yxatdan o'tishning oddiy tizimini ishlab chiqamiz, bu sizga hech qanday parollardan foydalanishni talab qilmaydi! Natijada biz osonlikcha o'zgartirilishi yoki mavjud bo'lgan PHP saytiga qo'shilishi mumkin bo'lgan tizimga ega bo'lamiz. Agar qiziqsangiz, o'qishni davom eting.

    PHP

    Endi biz PHP kodini hal qilishga tayyormiz. Ro'yxatdan o'tish tizimining asosiy funktsiyalari quyida ko'rishingiz mumkin bo'lgan User klassi tomonidan ta'minlanadi. Sinf ma'lumotlar bazalari bilan ishlash uchun minimalist kutubxona bo'lgan () dan foydalanadi. Foydalanuvchi sinfi ma'lumotlar bazalariga kirish, kirish belgilarini yaratish va ularni tasdiqlash uchun javobgardir. Bu bizga PHP-ga asoslangan saytlarda ro'yxatdan o'tish tizimiga osongina qo'shilishi mumkin bo'lgan oddiy interfeysni taqdim etadi.

    User.class.php

    // ORM xususiy nusxasi
    xususiy $ orm;

    /**
    * Token qatori orqali foydalanuvchini toping. Faqatgina tegishli tokenlar olinadi
    * ko'rib chiqish. Token hosil bo'lgandan keyin 10 daqiqa davomida amal qiladi.
    * @param string $ token Qidirish uchun belgi
    * @ Return User
    */

    Umumiy statik funktsiya findByToken ($ token) {

    // ma'lumotlar bazasida toping va vaqt tamg'asi to'g'ri ekanligiga ishonch hosil qiling


    -> qaerda ("token", $ token)
    -> where_raw ("token_validity> NOW ()")
    -> find_one ();

    Agar (! $ Natija) (
    return false;
    }

    Yangi foydalanuvchini qaytarish ($ natija);
    }

    /**
    * Kirish yoki foydalanuvchini ro'yxatdan o'tkazish.
    * @ Return User
    */

    Ommaviy statik funktsiya loginOrRegister ($ email) {

    // Agar bunday foydalanuvchi allaqachon mavjud bo'lsa, uni qaytaring

    Agar (User :: mavjud ($ email)) {
    yangi foydalanuvchini qaytarish ($ email);
    }

    // Aks holda, uni yarating va qaytaring

    Return User :: create ($ email);
    }

    /**
    * Yangi foydalanuvchi yarating va uni ma'lumotlar bazasiga saqlang
    * @param string $ email Foydalanuvchining elektron pochta manzili
    * @ Return User
    */

    Maxsus statik funktsiya yaratish ($ email) {

    // Ma'lumotlar bazasiga yangi foydalanuvchi yozing va uni qaytaring

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

    Yangi foydalanuvchini qaytarish ($ natija);
    }

    /**
    * Bunday foydalanuvchining ma'lumotlar bazasida mavjudligini tekshiring va mantiqiy javobni qaytaring.
    * @param string $ email Foydalanuvchining elektron pochta manzili
    * @ Return boolean
    */

    Umumiy statik funktsiya mavjud ($ email) (

    // foydalanuvchi ma'lumotlar bazasida mavjudmi?
    $ result = ORM :: for_table ("reg_users")
    -> qaerda ("elektron pochta", $ elektron pochta)
    -> count ();

    Qaytish $ result == 1;
    }

    /**
    * Yangi foydalanuvchi ob'ekti yarating
    * @param $ param ORM misoli, id, elektron pochta yoki null
    * @ Return User
    */

    Jamiyatning funktsiyasi __construct ($ param = null) {

    Agar ($ param instanceof ORM) (

    // ORM namunasi qabul qilindi
    $ this-> orm = $ param;
    }
    else if (is_string ($ param)) {

    // Elektron pochta orqali xabar yuborildi
    $ this->
    -> qaerda ("elektron pochta", $ param)
    -> find_one ();
    }
    boshqa (

    Agar (is_numeric ($ param)) {
    // Parametr sifatida foydalanuvchi identifikatori o'tkazildi
    $ id = $ param;
    }
    else if (isset ($ _ SESSION ["loginid"])))

    // Hech qanday foydalanuvchi identifikatori o'tkazilmadi, ovozga qarang
    $ id = $ _SESSION ["loginid"];
    }

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

    /**
    * Yangi SHA1 kirish belgisini yaratadi, ma'lumotlar bazasiga yozadi va qaytaradi.
    * @ qaytish satri
    */

    Ommaviy funktsiya generateToken () {
    // tizimga kirgan foydalanuvchi uchun belgini yaratish. Ma'lumotlar bazasiga saqlang.

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

    // Ma'lumotlar bazasiga belgini saqlang,
    // va uni faqat keyingi 10 daqiqada yaroqli deb belgilang

    $ this-> orm-> set ("token", $ token);
    $ this-> orm-> set_expr ("token_validity", "ADDTIME (NOW ()," 0:10 ")");
    $ this-> orm-> save ();

    $ Tokenni qaytarish;
    }

    /**
    * Ushbu foydalanuvchiga kiring
    * @ qaytish bekor
    */

    Ommaviy funktsiyaga kirish () (

    // Foydalanuvchini tizimga kirgan deb belgilang
    $ _SESSION ["loginid"] = $ this-> orm-> id;

    // last_login db maydonini yangilang
    $ this-> orm-> set_expr ("last_login", "NOW ()");
    $ this-> orm-> save ();
    }

    /**
    * Seansni yo'q qiling va foydalanuvchidan chiqing.
    * @ qaytish bekor
    */

    Ommaviy funktsiyalardan chiqish () (
    $ _SESSION = qator ();
    o'rnatilmagan ($ _ SESSION);
    }

    /**
    * Foydalanuvchining tizimga kirganligini tekshiring.
    * @ Return boolean
    */

    Ommaviy funktsiya loggedIn () {
    return isset ($ this-> orm-> id) && $ _SESSION ["loginid"] == $ this-> orm-> id;
    }

    /**
    * Foydalanuvchining administrator ekanligini tekshiring
    * @ Return boolean
    */

    Ommaviy funktsiya isAdmin () {
    return $ this-> rank () == "administrator";
    }

    /**
    * Foydalanuvchi turini toping. Bu administrator yoki odatiy bo'lishi mumkin.
    * @ qaytish satri
    */

    Ommaviy funktsiya darajasi () (
    agar ($ this-> orm-> rank == 1) (
    "administrator" ni qaytarish;
    }

    "Muntazam" qaytish;
    }

    /**
    * Maxsus elementlarga kirish uchun sehrli usul
    * $ orm misoli foydalanuvchi ob'ektining xususiyatlari sifatida
    * @param string $ key Kirilgan mulk nomi
    * @ qaytish aralash
    */

    Ommaviy funktsiya __get ($ key) {
    if (isset ($ this-> orm -> $ key)) {
    return $ this-> orm -> $ key;
    }

    Null qaytish;
    }
    }
    Jetonlar algoritm yordamida hosil qilinadi va ma'lumotlar bazasida saqlanadi. Biz token_validity ustunini 10 daqiqaga o'rnatish uchun MySQL-dan foydalanamiz. Tokeni tasdiqlashda biz dvigatelga token kerakligini aytamiz, token_validity maydoni hali tugamagan. Shunday qilib, biz tokenning amal qilish vaqtini cheklaymiz.

    Foydalanuvchi ob'ekti xususiyatlariga kirish uchun biz hujjat oxirida sehrli __get () usulidan foydalanamiz. Bu ma'lumotlar bazasida saqlanadigan ma'lumotlarga xususiyatlar ko'rinishida kirish imkoniyatini beradi: $ user-> email, $ user-> token. Masalan, quyidagi sinf parchasida ushbu sinfdan qanday foydalanishimiz mumkinligini ko'rib chiqamiz:


    Kerakli funktsiyalarni saqlaydigan boshqa fayl - functions.php. U erda bizda kodning qolgan qismini ozoda saqlashga imkon beradigan bir nechta yordamchi funktsiyalar mavjud.

    Funktsiyalar.php

    Send_email funktsiyasi ($ from, $ to, $ subject, $ message) {

    // Elektron pochta xabarlarini yuborish uchun yordamchi funktsiyasi

    $ headers = "MIME-versiyasi: 1.0". "\ r \ n";
    $ headers. = "Tarkib turi: matn / oddiy; charset = utf-8". "\ r \ n";
    $ headers. = "From:". $ from. "\ r \ n";

    Pochtani qaytarish ($ to, $ mavzu, $ xabar, $ sarlavhalari);
    }

    funktsiyasi get_page_url () {

    // PHP fayli manzilini bilib oling

    $ url = "http". (bo'sh ($ _ SERVER ["HTTPS"])? "": "s"). ": //". $ _ SERVER ["SERVER_NAME"];

    Agar (isset ($ _ SERVER ["REQUEST_URI"]) && $ _SERVER ["REQUEST_URI"]! = "") (
    $ url. = $ _SERVER ["REQUEST_URI"];
    }
    boshqa (
    $ url. = $ _SERVER ["PATH_INFO"];
    }

    $ Url-ni qaytarish;
    }

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

    // So'nggi bir soat ichida ushbu IP-manzil orqali kirishga urinishlar soni

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

    // So'nggi 10 daqiqada ushbu IP-manzil orqali kirishga urinishlar soni

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

    Agar ($ count_hour> $ limit_hour || $ count_10_min> $ limit_10_min) (
    yangi Exception ("Kirishga urinishlar juda ko'p!");
    }
    }

    function rate_limit_tick ($ ip, $ email) {

    // Kirishga urinishlar jadvalida yangi yozuv yarating

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

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

    $ login_attempt-> save ();
    }

    funktsiyani qayta yo'naltirish ($ url) {
    sarlavha ("Joylashuv: $ url");
    Chiqish;
    }
    Rate_limit va rate_limit_tick funktsiyalari ma'lum vaqt davomida avtorizatsiya urinishlari sonini cheklashimizga imkon beradi. Avtorizatsiya urinishlari reg_login_attempt ma'lumotlar bazasida qayd etiladi. Ushbu funktsiyalar quyidagi kod parchasida ko'rishingiz mumkin bo'lganidek, avtorizatsiya shakli yuborilganda ishga tushiriladi

    Quyidagi kod index.php-dan olingan va u kirish formasini yuborish uchun javobgardir. Biz aktivlar / js / script.js-da ko'rgan jQuery kodi bilan boshqariladigan JSON javobini qaytaradi.

    index.php

    Agar (! Bo'sh ($ _ POST) && isset ($ _ SERVER ["HTTP_X_REQUESTED_WITH"]))))

    // JSON sarlavhasini chiqaring

    Sarlavha ("Content-type: application / json");

    // Elektron pochta manzili haqiqiymi?

    Agar (! Isset ($ _ POST ["elektron pochta"]) ||! Filter_var ($ _ POST ["elektron pochta"], FILTER_VALIDATE_EMAIL)) (
    yangi istisno holatini tashlang ("Iltimos, to'g'ri elektron pochta manzilini kiriting.");
    }

    // Agar shaxs yuqorida bo'lsa, bu istisno bo'ladi
    // kirishga ruxsat berilgan cheklovlar (ko'proq ko'rish uchun function.php-ga qarang):
    rate_limit ($ _ SERVER ["REMOTE_ADDR"]);

    // Ushbu kirish urinishini yozib oling
    rate_limit_tick ($ _ SERVER ["REMOTE_ADDR"], $ _POST ["elektron pochta"]);

    // Xabarni foydalanuvchiga yuboring

    $ message = "";
    $ email = $ _POST ["elektron pochta"];
    $ subject = "Sizning kirish havolangiz";

    Agar (! User :: mavjud bo'lsa ($ email)) {
    $ subject = "Ro'yxatdan o'tganingiz uchun tashakkur!";
    $ message = "Saytimizga ro'yxatdan o'tganingiz uchun tashakkur! \ n \ n";
    }

    // Kirish yoki shaxsni ro'yxatdan o'tkazishga urinish
    $ user = User :: loginOrRegister ($ _ POST ["email"]);

    $ message. = "Siz ushbu URL manzilidan kirishingiz mumkin: \ n";
    $ message. = get_page_url (). "? tkn =". $ user-> generateToken (). "\ n \ n";

    $ message. = "Havola avtomatik ravishda 10 daqiqadan so'ng tugaydi.";

    $ result = send_email ($ fromEmail, $ _POST ["email"], $ subject, $ message);

    Agar (! $ Natija) (
    yangi istisnoni tashlang ("Elektron pochtangizni yuborishda xatolik yuz berdi. Iltimos, qayta urinib ko'ring.");
    }

    Die (json_encode (array (
    "message" => "Rahmat! Biz sizning pochta qutingizga havola yubordik. Spam papkangizni ham tekshiring. "
    )));
    }
    }
    catch (istisno $ e) {

    Die (json_encode (array (
    "xato" => 1,
    "message" => $ e-> getMessage ()
    )));
    }
    Muvaffaqiyatli avtorizatsiya yoki ro'yxatdan o'tgandan so'ng, yuqoridagi kod avtorizatsiya qilish uchun havolasi bo'lgan shaxsga elektron pochta xabarini yuboradi. Token (token) yaratilgan URL tufayli "tkn" $ _GET o'zgaruvchisi sifatida mavjud.

    index.php

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

    // Bu to'g'ri kirish belgisimi?
    $ user = User :: findByToken ($ _ GET ["tkn"]);

    // Ha! Foydalanuvchiga kiring va himoyalangan sahifaga yo'naltiring.

    $ user-> login ();
    yo'naltirish ("protected.php");
    }

    // token noto‘g‘ri. Kirish shakliga qayta yo'naltiring.
    yo'naltirish ("index.php");
    }
    $ User-> login () -ni ishga tushirish talab qilinadigan seans o'zgaruvchilarini yaratadi va foydalanuvchiga keyingi kirishda tizimga kirishga imkon beradi.

    Chiqish taxminan xuddi shu tarzda amalga oshiriladi:

    Index.php

    Agar (isset ($ _ GET ["chiqish"])))

    $ user = yangi foydalanuvchi ();

    Agar ($ user-> loggedIn ()) {
    $ user-> chiqish ();
    }

    Qayta yo'naltirish ("index.php");
    }
    Kod oxirida foydalanuvchini yana index.php-ga yo'naltiramiz, shuning uchun URL-dagi? Logout = 1 parametri chiqarib tashlanadi.

    Bizning index.php fayli ham himoyaga muhtoj bo'ladi - biz allaqachon tizimga kirgan foydalanuvchilarga shaklni ko'rishni xohlamaymiz. Buning uchun $ user-> loggedIn () usulidan foydalanamiz:

    Index.php

    $ user = yangi foydalanuvchi ();

    agar ($ user-> loggedIn ()) {
    yo'naltirish ("protected.php");
    }
    Va nihoyat, keling, saytingizdagi sahifani qanday himoya qilish va uni faqat avtorizatsiya qilinganidan keyin ochish mumkin:

    protected.php

    // Saytdagi har qanday php-sahifani himoya qilish uchun main.php-ni kiriting
    // va yangi foydalanuvchi ob'ektini yarating. Bu juda oddiy!

    need_once "o'z ichiga oladi / main.php";

    $ user = yangi foydalanuvchi ();

    agar (! $ user-> loggedIn ()) {
    yo'naltirish ("index.php");
    }
    Ushbu tekshiruvdan so'ng foydalanuvchi muvaffaqiyatli tizimga kirganiga amin bo'lishingiz mumkin. Ma'lumotlar bazasida $ user ob'ekti xususiyatlari sifatida saqlanadigan ma'lumotlarga kirish huquqiga ega bo'lasiz. Foydalanuvchining elektron pochtasini va ularning darajalarini ko'rsatish uchun quyidagi koddan foydalaning:

    Echo "Sizning elektron pochtangiz:". $ User-> email;
    echo "Sizning darajangiz:". $ user-> rank ();
    Bu erda rank () - bu usul, chunki ma'lumotlar bazasidagi daraja ustunida odatda raqamlar mavjud (oddiy foydalanuvchilar uchun 0, administratorlar uchun 1 ta) va biz bularning barchasini ushbu usul yordamida amalga oshiriladigan darajadagi nomlarga aylantirishimiz kerak. Oddiy foydalanuvchini administratorga aylantirish uchun phpmyadmin (yoki boshqa ma'lumotlar bazasi dasturida) foydalanuvchi yozuvlarini tahrirlash kifoya. Ma'mur sifatida foydalanuvchi hech qanday maxsus xususiyatlarga ega bo'lmaydi. Ma'murlarga qanday huquqlar berilishini o'zingiz tanlash huquqiga egasiz.

    Tayyor!

    Shu bilan bizning oddiy ro'yxatdan o'tish tizimimiz tayyor! Siz uni mavjud bo'lgan PHP saytida ishlatishingiz yoki o'zingizning talablaringizga muvofiq yangilashingiz mumkin.

    PHP | 25 yanvar, 2017 | Aqlli texnika

    Ushbu darsda biz PHP-ni tasdiqlash qoidalari bilan foydalanuvchi hisob qaydnomasini ro'yxatdan o'tkazish shaklini yaratish, profil avatar rasmini yuklash va MySQL ma'lumotlar bazasiga foydalanuvchi ma'lumotlarini qo'shishni o'rganamiz. Keyin ma'lumotlar bazasidan ma'lumotlarni olamiz va foydalanuvchi profilining xush kelibsiz sahifasida ko'rsatamiz. Xush kelibsiz sahifasi qanday ko'rinishga ega:

    CSS va HTML formalarini sozlash

    Birinchidan, davom eting va kodni pastdan HTML manbasini nusxalash va form.php deb nomlangan faylga joylashtirish. Xuddi shu katalogda form.css nomli boshqa fayl yarating va barcha CSS kodlarini quyidagi kodependan nusxa ko'chiring va joylashtiring:

    Form.php va form.css fayllarini saqlaganingizdan so'ng, formaning ko'rinishini ko'rish uchun form.php-ni ishga tushirishingiz mumkin. U yuqoridagi kodependan "Natija" yorlig'ida ko'rsatilgandek bir xil bo'lishi kerak. ...

    Ma'lumotlar bazasi va jadvalini yaratish

    PHP kodini formamizga qo'shishni boshlashdan oldin, ro'yxatdan o'tgan foydalanuvchilar ma'lumotlarini saqlaydigan jadval bilan ma'lumotlar bazasini yarataylik. Quyida SQL skriptida "hisoblar" va "foydalanuvchilar" jadvallarini yaratish uchun:

    MA'LUMOT BAZASI hisobvaraqlarini yarating; TABLE `account`.`users` (` id` INT NOT NULL AUTO_INCREMENT, `foydalanuvchi nomi` VARCHAR (100) NOT NULL,` email` VARCHAR (100) NOT NULL, `parol` VARCHAR (100) NOT NULL,` avatar `VARCHAR (100) NULL EMAS, BIRINCHI KEY (` id`));

    Quyida ma'lumotlar bazasi va foydalanuvchilar jadvalini yaratish uchun MySQL ma'lumotlar bazasiga ulanish uchun xatolarni tekshirishda va SQL bayonotlari ustida ishlashda to'liq kod keltirilgan:

    // ulanish o'zgaruvchilari $ host = "localhost"; $ user = "root"; $ password = "mypass123"; // mysql ulanishini yaratish $ mysqli = yangi mysqli ($ host, $ user, $ parol); if ($ mysqli-> connect_errno) (printf ("Ulanish amalga oshmadi:% s \ n", $ mysqli-> connect_error); die ();) // ma'lumotlar bazasini yarating agar (! $ mysqli-> so'rov ("CREATE DATABASE accounts2 ")) (printf (" Errormessage:% s \ n ", $ mysqli-> error);) // barcha jadvallar bilan foydalanuvchilar jadvalini yarating $ mysqli-> so'rov (" CREATE TABLE `accounts2`.`users`" `id` INT NOT NULL AUTO_INCREMENT,` foydalanuvchi nomi` VARCHAR (100) NOT NULL, `email` VARCHAR (100) NOT NULL,` parol` VARCHAR (100) NOT NULL, `avatar` VARCHAR (100) NULL emas, BIRINChI KEY (`id`));") yoki die ($ mysqli-> xato);

    HTML, CSS va ma'lumotlar bazasi jadvali bilan biz "endi formamizda ishlashni boshlash uchun o'qiyapmiz. Birinchi qadam xato xabarlar paydo bo'lishi uchun joy yaratish va keyin biz formani tasdiqlashni yozishni boshlaymiz".

    Xato xabarlari uchun yangi sessiyani boshlash

    Form.php-ni oching va yuqori qismiga quyidagi qatorlarni qo'shing, php ochish va yopish teglaridan foydalanganingizga ishonch hosil qiling (men narsalarni toza saqlash uchun form.php-ning html qismini kiritmaganman).

    Biz yangi sessiya yaratdik, chunki foydalanuvchi muvaffaqiyatli ro'yxatdan o'tgandan so'ng "Welcome.php" sahifasida $ _SESSION ["xabar"] ga kirishimiz kerak. MySQL ulanishi ham darhol yaratildi, shuning uchun ma'lumotlar bazasi bilan ishlashimiz mumkin keyinroq.

    Shuningdek, joriy sahifada $ _SESSION ["xabar"] ni chop etishimiz kerak. Boshidan xabar "" (bo'sh satr) ga o'rnatildi, biz xohlagan narsa, shu sababli hech narsa bosilmaydi. Davom etamiz va tegishli DIV yorlig'i ichiga xabar qo'shing:

    Tasdiqlash qoidalarini yaratish

    Ushbu shakl allaqachon tasdiqlash qoidalari bilan birga kelgan, HTML kiritish teglari ichida "talab qilinadi" kalit so'zi maydon bo'sh emasligini tekshirmoqda, shuning uchun bo'sh maydonlar haqida qayg'urmasligimiz kerak. Shuningdek, kirish turini belgilash orqali "elektron pochta va" parol ", HTML5 elektron pochta va parolni to'g'ri formatlash uchun shaklni tasdiqlaydi, shuning uchun biz ushbu maydonlar uchun hech qanday qoidalar yaratishimiz shart emas.

    Shunga qaramay, biz hali ham ba'zi bir tasdiqlash qoidalarini yozishimiz kerak, parollar mos kelishiga, avatar fayli aslida rasm ekanligiga va foydalanuvchi bizning ma'lumotlar bazamizga qo'shilganligiga ishonch hosil qilishimiz kerak.

    Ishlarni yaxshi tartibga solish uchun yana bitta fayl yaratsin va uni validate.php deb nomlasin. Biz ushbu form.php faylini ham o'z ichiga olamiz.

    Validate.php ichida qiladigan birinchi narsa - bu ariza yuborilganligiga ishonch hosil qilish.

    / * validate.php * / // ariza post usuli bilan yuborilgan bo'lsa, agar ($ _SERVER ["REQUEST_METHOD"] == "POST") ()

    Keyin parol va parolni tasdiqlash bir-biriga tengligini tekshiramiz

    if ($ _SERVER ["REQUEST_METHOD"] == "POST") (// agar ikkita parol bir-biriga tengligini tekshiring, agar ($ _POST ["password"] == $ _POST ["confirmmpassword"]) ())

    Super Global o'zgaruvchilari bilan ishlash

    Bizga kerakli ma'lumotlarni olish uchun $ _SERVER va $ _POST super global o'zgaruvchilaridan qanday foydalanganimizga e'tibor bering. $ _POST o'zgaruvchisidagi kalit nomlari mavjud, chunki biz formamizni yuborish uchun method = "post" dan foydalanganmiz.

    Kalit nomlari atribut nomi bilan nomlangan barcha HTML kirish maydonlari (masalan: name = "password", name = "confirmmpassword"):

    />

    Biroz ko'proq tushuntirish uchun, agar bizda print_r ($ _ POST) funktsiyasidan foydalansak, keyin (() shaklidagi barcha maydonlar to'ldirilgan deb taxmin qilamiz) $ _POST qanday ko'rinishga ega; ssenariyni chop etgandan so'ng darhol tugatish. Bu sizning skriptingizni disk raskadrovka qilish va nima sodir bo'lishini ko'rishning yaxshi usuli:

    if ($ _SERVER ["REQUEST_METHOD"] == "POST") (print_r ($ _ POST); die (); / * output: Array (=> clevertechie =>) [elektron pochta bilan himoyalangan]=> mypass123 => mypass123 => Ro'yxatdan o'tish) * /

    Endi biz yuborilgan qolgan qiymatlarni $ _POST-dan olamiz va ularni MySQL ma'lumotlar bazasi jadvalimizga kiritishlari uchun ularni to'g'ri formatlashtiramiz.

    // forma post bilan yuborildi, agar ($ _SERVER ["REQUEST_METHOD"] == "POST") (if ($ _POST ["password"] == $ _POST ["confirmmpassword"]) (// boshqa o'zgaruvchilarni belgilang $ _POST $ username = $ mysqli-> real_escape_string ($ _ POST ["username"]); $ email = $ mysqli-> real_escape_string ($ _ POST ["email"]); // md5 xash xavfsizlik uchun parol $ password = md5 ($ _ POST ["password"]); // bizning avatarimiz tasviri saqlanadigan yo'l $ avatar_path = $ mysqli-> real_escape_string ("images /".$_ FILES [" avatar "] ["ism"]);))

    Yuqoridagi kodda biz foydalanuvchi nomimiz, elektron pochta va avatar_path ma'lumotlar bazasiga haqiqiy SQL qatori sifatida kiritilishi uchun to'g'ri formatlanganligiga ishonch hosil qilish uchun real_escape_string () usulidan foydalanganmiz. Biz xavfsizlik uchun paroldan xash qatorini yaratish uchun md5 () xesh funktsiyasidan foydalanganmiz.

    Fayllarni yuklash qanday ishlaydi

    Shuningdek, foydalanuvchi kompyuteridan avatar yuklanadigan bizning rasmimiz haqidagi ma'lumotlarni o'zida mujassam etgan yangi $ _FILES super global o'zgaruvchiga e'tibor bering. $ _FILES o'zgaruvchisi mavjud, chunki biz enctype = "multipart / form-data" dan foydalanganmiz. bizning shaklimizda:

    Agar print_r ($ _ FILES) dan keyin die () dan foydalansak, bu erda hosil bo'ladi; xuddi $ _POST o'zgaruvchisi uchun qilganimiz kabi:

    if ($ _SERVER ["REQUEST_METHOD"] == "POST") (print_r ($ _ FILES); die (); / * output: Array (=> Array (=> guldan.png => image / png => C : \ Windows \ Temp \ php18D8.tmp => 0 => 98823)) * / // biz rasm nomiga shunday kirish imkoniyatiga egamiz: $ _FILES ["avatar"] ["name"]; // guldan png

    Fayl birinchi marta yuklanganda, post usuli yordamida vaqtinchalik katalogda saqlanadi. Ushbu katalogga $ _FILES ["avatar"] ["tmp_name"] orqali kirish mumkin, bu yuqoridagi natijadan "C: \ Windows \ Temp \ php18D8.tmp".

    Keyin biz ushbu faylni vaqtinchalik katalogdan, kerakli avatar_path katalogiga nusxalashimiz mumkin. Faylni nusxalashdan oldin, fayl aslida rasm ekanligini tekshirib ko'rishimiz kerak, buning uchun $ _FILES o'zgaruvchimiz tomonidan chaqirilgan boshqa kalitni tekshiramiz.

    // yo'l bizning avatar rasmimiz saqlanadi $ avatar_path = $ mysqli-> real_escape_string ("images /".$_ FILES [" avatar "] [" name "]); // fayl turining rasm ekanligiga ishonch hosil qiling (preg_match ("! image!", $ _ FILES ["avatar"] ["type"])) (// rasmni rasmlarga / papkaga nusxalash, agar (nusxalash ($ _ FILES) ["avatar"] ["tmp_name"], $ avatar_path)) ())

    Preg_match funktsiyasi $ _FILES qatoridagi ["type"] tugmachasidagi rasmga mos keladi, so'ngra ikkita parametrni o'z ichiga olgan rasm faylini nusxalash uchun copy () funktsiyasidan foydalanamiz. Birinchisi, bizning ["tmp_name"] katalogimiz bo'lgan manba fayl yo'lidir, ikkinchisi - bu bizning "images / guldan.png" fayl yo'limiz bo'lgan yo'nalish.

    MySQL ma'lumotlar bazasida foydalanuvchi ma'lumotlarini saqlash

    Endi biz "keyingi sahifada kerak bo'lgan foydalanuvchi nomi va avatar_path bo'lgan ba'zi bir seans o'zgaruvchilarini o'rnatamiz va biz barcha taqdim etilgan ma'lumotlarni MySQL ma'lumotlar bazasiga qo'shadigan SQL so'rovini yaratamiz:

    if (nusxa ($ _ FILES ["avatar"] ["tmp_name"], $ avatar_path)) (// xush kelibsiz sahifasida ko'rsatiladigan sessiya o'zgaruvchilarini o'rnating $ _SESSION ["username"] = $ foydalanuvchi nomi; $ _SESSION ["avatar" ] = $ avatar_path; // ma'lumotlar bazasiga ma'lumotlar kiritish uchun SQL so'rovlar qatorini yaratish $ sql = "INSERT INTO users (foydalanuvchi nomi, elektron pochta, parol, avatar)". "VALUES (" $ username "," $ email "," $ parol "," $ avatar_path ")";)

    So'nggi qadam, so'rovni () usulidan foydalanib, bizning so'rovimizni burab, uning muvaffaqiyatli yoki yo'qligini tekshirib ko'ring. Agar shunday bo'lsa, demak foydalanuvchi ma'lumotlari "foydalanuvchilar" jadvalida muvaffaqiyatli saqlanganligini anglatadi! So'ngra sessiyaning yakuniy o'zgaruvchisini o'rnatdik. _SESSION ["xabar"] va header () funktsiyasi yordamida foydalanuvchini Welcome.php sahifasiga yo'naltiring:

    // mysql so'rovi muvaffaqiyatli ekanligini tekshiring, agar ($ mysqli-> query ($ sql) === true) ($ _SESSION ["message"] = "Ro'yxatdan o'tish muvaffaqiyatli bo'ldi! Ma'lumotlar bazasiga $ foydalanuvchi nomi qo'shildi!"; // yo'naltirish foydalanuvchi Welcome.php sarlavhasiga ("joy: welcome.php");)

    Tasdiqlash uchun bizga kerak bo'lgan yagona narsa, agar biz yaratgan barcha ifoda-lardan rejalashtirilgani ketmasa, barcha "else" kalit so'zlarni qo'shishimiz kerak. Validate.php uchun to'liq kod hozirgacha quyidagicha ko'rinadi:

    / * validate.php * / // ariza post bilan yuborildi, agar ($ _SERVER ["REQUEST_METHOD"] == "POST") (// ikkita parol bir-biriga teng bo'lsa, ($ _POST ["parol") == $ _POST ["confirmmpassword"]) (// $ _POST $ username = $ mysqli-> real_escape_string ($ _ POST ["username"]); $ email = $ mysqli-> qiymatlari bilan boshqa o'zgaruvchilarni belgilang. real_escape_string ($ _POST ["elektron pochta")); // xavfsizlik uchun md5 xash paroli $ password = md5 ($ _ POST ["password"]); // yo'l bizning avatar rasmimiz saqlanadi $ avatar_path = $ mysqli-> real_escape_string ("images /".$_FILES [" avatar "" "" name "]); // fayl turining rasm ekanligiga ishonch hosil qiling, agar (preg_match ("! Image! ", $ _ FILES [" avatar "] [" "])) (// rasmni rasmlarga / papkaga nusxalash, agar (nusxalash ($ _ FILES [" avatar "] [" tmp_name "], $ avatar_path)) (// xush kelibsiz sahifasida ko'rsatiladigan sessiya o'zgaruvchilarini o'rnating $ _SESSION [ "username"] = $ username; $ _SESSION ["avatar"] = $ avatar_path; // ma'lumotlar bazasiga foydalanuvchi ma'lumotlarini qo'shish $ sql = "INSERT INTO users (foydalanuvchi nomi, elektron pochta, parol, avatar)". "VALUES (" $ use rname "," $ email "," $ password "," $ avatar_path ")"; "; // mysql so'rovi muvaffaqiyatli yoki yo'qligini tekshirib ko'ring, agar ($ mysqli-> so'rov ($ sql) === true) ($ _SESSION ["message"] = "Ro'yxatdan o'tdi!". "Ma'lumotlar bazasiga $ foydalanuvchi nomi qo'shildi!"; / / foydalanuvchini Welcome.php sarlavhasiga yo'naltirish ("joy: welcome.php");)))))

    Ishlar noto'g'riligida sessiya xato xabarlarini o'rnatish

    Davom etamiz va boshqa barcha bayonotlarni birdaniga qo'shib qo'ying, bu erda biz $ _SESSION ["message"] xato xabarlarini o'rnatamiz, agar ular har qanday if bajarilmasa chop etiladi. So'nggi if ifodasidan keyin quyidagi kodni qo'shing. bu erda biz muvaffaqiyatli mysqli so'rovini va oxirgi jingalak qavs ichida quyidagicha tekshirdik:

    If ($ mysqli-> query ($ sql) === true) ($ _SESSION ["message"] = "Ro'yxatdan o'tish muvaffaqiyatli bo'ldi!". "Ma'lumotlar bazasiga $ foydalanuvchi nomi qo'shildi!"; Sarlavha ("joy: welcome.php" );) else ($ _SESSION ["message"] = "Foydalanuvchini ma'lumotlar bazasiga qo'shib bo'lmadi!";) $ mysqli-> close (); ) else ($ _SESSION ["message"] = "Fayl yuklanmadi!";)) else ($ _SESSION ["xabar"] = "Iltimos, faqat GIF, JPG yoki PNG rasmlarni yuklang!";)) else ($ _SESSION [ "message"] = "Ikki parol mos kelmadi!";)) // if ($ _SERVER ["REQUEST_METHOD"] == "POST")

    Keyin sessiya haqidagi xabar div yorlig'ida xato haqidagi xabarni ko'rsatib, biz $ _SESSION ["message"] ni qo'yamiz, agar eslasangiz:

    Quyida ikkita parol mos kelmasa xato xabari qanday ko'rinishini ko'rsatadigan misol keltirilgan. Boshqa xato xabarlarni yuborish uchun u bilan o'ynashni xohlang.


    Xush kelibsiz sahifasi foydalanuvchi profilini yaratish

    Biz endi validate.php bilan ish olib bordik. So'nggi qadam, foydalanuvchi nomi, avatar tasviri va ilgari ro'yxatdan o'tgan ba'zi foydalanuvchilarni o'zlarining foydalanuvchi ismlari va mini avatarlari eskizlari bilan ko'rsatadigan Welcome.php sahifasini yaratishdir. Bu erda to'liq Welcome.php qanday ko'rinishi kerak, men uning chalkash bo'lishi mumkin bo'lgan qismlarini tushuntiraman:

    ">
    Xush kelibsiz so'rov ($ sql); ?>
    Barcha ro'yxatdan o'tgan foydalanuvchilar:fetch_assoc ()) (aks sado "
    ". $ qator [" foydalanuvchi nomi "]."
    "; echo"
    "; } ?>

    Yuqoridagi $ _SESSION o'zgaruvchan qismini tushunish oson bo'lishi kerak, biz shunchaki validate.php sahifamizdan ushbu Welcome.php sahifasiga o'zgaruvchilarni o'tkazamiz, agar siz hali ham bundan chalg'igan bo'lsangiz, iltimos sahifani to'liq sinab ko'ring.

    MySQL Result Object bilan ishlash

    SQL so'rovimizda har doim "SELECT" iborasidan foydalansak va keyin SQL-ni $ mysqli-> query ($ sql) buyrug'i bilan ishlatsak, qaytarilgan qiymat MySQL natijasi ob'ekti hisoblanadi. Natijada ob'ektga ega bo'lgandan so'ng, ma'lumotlar bilan ishlashni boshlashimiz uchun bir nechta usullar mavjud.

    $ sql = "Foydalanuvchi nomini tanlang, foydalanuvchilardan avatarni tanlang"; $ result = $ mysqli-> so'rov ($ sql); // $ result = mysqli_result ob'ekti

    Ushbu usullardan biri $ result-> fetch_assoc () bo'lib, u joriy qatorni olib keladi va qatorni barcha ma'lumotlar bilan qaytaradi. Shunday qilib, biz buni natijaviy to'plamdagi oxirgi qatorga yetganda yolg'onga aylanadigan shartli ifodaga kiritamiz va qaytarilgan qiymatni $ result-> fetch_assoc () dan $ qator o'zgaruvchisi ichida saqlaymiz.

    // ($ row = $ result-> fetch_assoc ()) (echo "while olib kelingan qatorning assotsiativ qatorini qaytaradi

    ". $ qator [" foydalanuvchi nomi "]."
    "; echo"
    "; }

    Xulosa

    Oldindan ro'yxatdan o'tgan va bizning ma'lumotlar bazamizda yashaydigan foydalanuvchilar qaytariladigan assotsiativ qatordan $ row ["username"] va $ row ["avatar"] ga qanday qilib kirishimiz mumkin. stol!

    Profilni kutib olish sahifasi endi ushbu darsning boshida ko'rsatilgandek juda o'xshash bo'lishi kerak va shakl endi to'liq, yaxshi ish! Sizni qiziqtirgan savollarni quyidagi izohlarga joylashtiring.