function registration($arr) { $login = !empty($arr['login']) ? $arr['login'] : false; $pas = !empty($arr['pas']) ? $arr['pas'] : false; $email = !empty($arr['email']) ? $arr['email'] : ''; //Валидация данных-------- if ($email and !Func::valid_email($email)) { throw new Exception('Не верный адре электронной почты.'); } if (mb_strlen($login, 'utf-8') < 3) { throw new Exception('Длина логина должна быть не менее 3х символов.'); } if (mb_strlen($pas, 'utf-8') < 5) { throw new Exception('Длина пароля должна быть не менее 5и символов.'); } if (!Func::valid_login($login)) { throw new Exception('Запрещённые символы в поле Login! Разрешены только буквы русского и латинского алфавита и цифры.'); } //------------------------- $res = $this->db->prepare("SELECT id FROM users WHERE login=?;"); $res->execute(array($login)); if ($row = $res->fetch()) { throw new Exception("Пользователь с логином {$login} уже зарегистрирован. Выберите другой логин."); } if ($email) { $res = $this->db->prepare("SELECT id FROM users WHERE email=?;"); $res->execute(array($email)); if ($row = $res->fetch()) { throw new Exception('Пользователь с таким Email уже зарегистрирован.'); } } //Удаляем не подтверждённые аккаунты, старше суток $this->db->query("DELETE FROM tmp_users WHERE time<UNIX_TIMESTAMP()-3600*24;"); $res = $this->db->prepare("SELECT login FROM tmp_users WHERE login=?;"); $res->execute(array($login)); if ($row = $res->fetch()) { throw new Exception("Пользователь с логином {$login} ожидает подтверждение регистрации. Выберите другой логин."); } if ($email) { $res = $this->db->prepare("SELECT login FROM tmp_users WHERE email=?;"); $res->execute(array($email)); if ($row = $res->fetch()) { throw new Exception('Пользователь с таким Email ожидает подтверждение регистрации.'); } } //Шифруем пароль $md5pas = md5('cms' . md5($pas)); //Если требуется подтверждение $email-- if ($this->conf['reg']['email_must']) { if (!$email) { throw new Exception('Необходим Email'); } else { $code = Func::rand_string(10); $res = $this->db->prepare("INSERT INTO tmp_users (login,pas,email,code,time) VALUES (?,?,?,?,UNIX_TIMESTAMP());"); if (!$res->execute(array($login, $md5pas, $email, $code))) { throw new Exception($this->db->errorInfo()); } //Высылаем код для подтверждения email $from_name = 'Администрация ' . $_SERVER['HTTP_HOST']; $from_email = 'admin@' . $_SERVER['HTTP_HOST']; $mail_subject = 'Подтверждение регистрации'; $mail_text = 'Для подтверждения регистрации на сайте ' . H . ' перейдите по следующей ссылке:' . "\n" . H . '/login/email_confirm/' . $code; Func::send_mail($from_name, $from_email, $login, $email, $mail_subject, $mail_text); return array('pas' => $md5pas, 'email' => $email, 'login' => $login); } } //------------------------------------- $res = $this->db->prepare("INSERT INTO users (login, pas, email,reg_time) VALUES (?,?,?,UNIX_TIMESTAMP());"); if (!$res->execute(array($login, $md5pas, $email))) { throw new Exception($this->db->errorInfo()); } $id = $this->db->lastInsertId(); return array('id' => $id, 'pas' => $md5pas, 'email' => $email, 'login' => $login); }
function registration() { if ($this->user['id']) { $this->error('Вы уже зарегистрированы'); } $captcha = new Captcha(); $this->des->set('captcha', $captcha); if (!$this->conf['reg']['on']) { $this->error('Регистрация закрыта'); } //Ajax Проверка занятости логина if (isset($_POST['check_login'])) { $this->des->auto_head = false; //Длина логина if (mb_strlen($_POST['check_login'], 'UTF-8') < 3 or mb_strlen($_POST['check_login'], 'UTF-8') > 10) { $str = '<span class="red">Длина от 3х до 10и символов.</span>'; } else { $res = $this->db->prepare("SELECT login FROM users WHERE login=?;"); $res->execute(array($_POST['check_login'])); if ($row = $res->fetch()) { $str = '<span class="red">Уже занят!</span>'; } else { //валидация логина if (!Func::valid_login($_POST['check_login'])) { $str = '<span class="red">Запрещённые символы</span>'; } else { $str = '<span class="green">Свободен</span>'; } } } echo "\$('#check-login').html('{$str}');"; exit; } //Обработка формы------ if (isset($_POST['login'])) { $error = array(); $this->des->set('title', 'Регистрация'); $_POST['login'] = trim($_POST['login']); $_POST['pas'] = trim($_POST['pas']); //Сохраняем поля формы $_SESSION['reg']['login'] = $_POST['login']; $_SESSION['reg']['email'] = $_POST['email']; $_SESSION['reg']['pas'] = $_POST['pas']; $_SESSION['reg']['repas'] = $_POST['repas']; if ($this->conf['reg']['captcha']) { if (!$captcha->is_access($_POST['captcha'])) { $error[] = 'Не верно введены символы с картинки'; } } //Сверка паролей if ($_POST['pas'] != $_POST['repas']) { $error[] = 'Пароли не совпадают'; } //Длина пароля if (mb_strlen($_POST['pas'], 'utf-8') < 5) { $error[] = 'Длина пароля должна быть не менее 5и символов.'; } //Длина логина if (mb_strlen($_POST['login'], 'utf-8') < 3) { $error[] = 'Длина логина должна быть не менее 3х символов.'; } //валидация логина if (!Func::valid_login($_POST['login'])) { $error[] = 'Запрещённые символы в поле Login! Разрешены только буквы русского и латинского алфавита и цифры.'; } if ($this->conf['reg']['email']) { if ($this->conf['reg']['email_must']) { if (empty($_POST['email'])) { $error[] = 'Поле email - обязательно для заполнения'; } } if (!empty($_POST['email']) and !Func::valid_email($_POST['email'])) { $error[] = 'Не верно заполнено поле Email.'; } } //Если нет ошибок, регистрация if (!$error) { try { $reg_arr = SiteWrite::me()->registration($_POST); if ($this->conf['reg']['email_must']) { $this->loc(H . '/login/email_confirm'); } //Авторизируем пользователя $_SESSION['user_id'] = $reg_arr['id']; //Пишем куки----- setcookie('id', $reg_arr['id'], time() + 3600 * 24 * 30, '/'); setcookie('p', $reg_arr['pas'], time() + 3600 * 24 * 30, '/'); //-------------- $this->loc(H . '/login/success'); } catch (Exception $e) { $error[] = $e->getMessage(); } } //Заполняем сохранённые поля формы if (!empty($_SESSION['reg'])) { foreach ($_SESSION['reg'] as $key => $val) { $this->des->set($key, $val); } } //Вывод ошибок if ($error) { $this->error($error, false); } } //--------------------- $this->des->set('registration', true); $this->des->display('login'); }