Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.06.2016, 11:51   #1
Ave_Ave_Ave
Пользователь
 
Регистрация: 15.03.2015
Сообщений: 21
По умолчанию Ошибка в регистрации

Есть страничка регистрации. Но регистрация не удаётся, выходит сообщение: Ошибка в момент регистрации. Кусок кода из файла раунтинга данных:
PHP код:
          $data = new Data();
            if(isset(
$_POST['signup'])){
                if(
$data->signup($_POST)){
                 die(
"Успешная регистрация! На ваш E-mail отправлено письмо с инструкцией по активации аккаунта");    
                }else{
                    echo 
"<div class='error'>Произоша ошибка в момент регистрации!</div>";
                } 
Файл работы с данными:
PHP код:
<?php  
 
class Data{
     private 
$db;
     public function 
__construct(){
         
$this->db Connect::_self()->mysql();  
    } 
    
/*
                Регистрация пользователей
      */
     
public function signup($data){
         if(
strlen($data['password']) < 5)
          throw new 
Exception('Длина пароля должна быть не менее 5 символов'); 
        if(empty(
$data['email']))
          throw new 
Exception('E-mail не может быть пустым'); 
        if(empty(
$data['fam']))
          throw new 
Exception('Заполните поле с фамилией!'); 
        if(empty(
$data['name']))
          throw new 
Exception('Заполните поле с именем!'); 
        if(empty(
$data['otc']))
          throw new 
Exception('Заполните поле с отчеством!');  
        if(
strlen($data['bin']) < 12 || strlen($data['bin']) > 13)  
          throw new 
Exception('Длина БИНа должна быть равной 12 числам!');     
        if(
$data['captcha'] != $_SESSION['captcha']){
            throw new 
Exception("Капча введена не верно");
        }
         
$email validate::clear($data['email']);
        if(!
$this->UniqEmail($email)) throw new Exception('Такой email уже зарегистрирован!');
        
$password validate::hashInit($data['password']);
        
$name validate::clear($data['name']);
        if(
validate::EmailValidate($email) === false)
           throw new 
Exception('Введите корректный email');
        
$time time();
        
//Регистрируем пользователя
        
$query $this->db->prepare("INSERT INTO `users` (`email`,`password`,`fam`,`name`,`otc`,`name_comp`,`bin`,`country`,`user_phone`,`date_register`, `activate`)  
                                     VALUES(:email, :password, :fam, :name, :otc, :name_comp, :bin, :country, :user_phone, 
$time, 0)");
        
$query->bindParam(':email'$emailPDO::PARAM_STR155);
        
$query->bindParam(':password'$passwordPDO::PARAM_STR155);                                                                                          
        
$query->bindParam(':fam'$famPDO::PARAM_STR100);    
        
$query->bindParam(':name'$namePDO::PARAM_STR100);    
        
$query->bindParam(':otc'$otcPDO::PARAM_STR100);
        
$query->bindParam(':name_comp'$name_compPDO::PARAM_STR100);    
        
$query->bindParam(':bin'$namePDO::PARAM_STR155);    
        
$query->bindParam(':country'$otcPDO::PARAM_STR100);
        
$query->bindParam(':user_phone'$famPDO::PARAM_STR155);             
       if(
$query->execute()){ 
        
//отправляем письмо активации
        
$id $this->db->lastInsertId();
        
$key_hash validate::hashInit($email."::".$password);
        
$link_activate HTTP_PATH."activate/".$id."/".$key_hash
        
mail::new_mail($email"Активация аккаунта!""Здравствуйте, вы зарегистрировались на сайте salavat-bs.kz.\n\r 
         Для подтверждения аккаунта, кликните по ссылке активации:" 
.  $link_activate "\n\r"); 
         return 
true;
       }
       
//Записываем в лог ошибку
       
$info $this->db->errorInfo();
        
       
error::ErrLog("- Ошибка PDO: "$info[2] . "\n"__FILE__ "\n" __LINE__);
      }

      
/*
                                    Авторизация пользователей
       */
       
public function login($data){  
         if(empty(
$data['email']))
          throw new 
Exception('E-mail не может быть пустым'); 
            if(
strlen($data['password']) < 5)
          throw new 
Exception('Длина пароля должна быть не менее 5 символов');
         
$email validate::clear($data['email']);
         
$password validate::hashInit($data['password']);
         
$query $this->db->prepare("SELECT `id`,`email`, `password`,`activate` FROM `users` WHERE `email` = :email");
         
$query->bindParam(":email"$emailPDO::PARAM_STR);
         
$query->execute();
         
$result $query->fetch();
         
//Проверяем активирован ли аккаунт пользователя
         
if($result->activate == 0){
             throw new 
Exception("Ваш аккаунт не активирован!");
         }
         if(
$result->email === $email && $password === $result->password){
             
//успех 
             
if($remember == 1){ 
                 
setCookie("user_id"$result->idtime() +3600 24 30);
             }
            
$_SESSION['user']['id'] = $result->id;
            return 
true;
         }
         return 
false;
       }
       
/*
                                Активация аккаунта
         */
        
public function activate_account($id$activate_key){
          
$query $this->db->query("SELECT `email`, `password` FROM `users` WHERE `id` = $id");
          
$result $query->fetch();
          if(
$activate_key === validate::hashInit($result->email."::".$result->password)){
              if(
$this->db->exec("UPDATE `users` SET `activate` = 1")) return true;
          }    
          return 
false;
        }
        
/*
                            Вывод списка пользователей     
         */
         
public function showUsers(){
             
$query $this->db->query("SELECT * FROM `users`");
            
$return "";
            while(
$result $query->fetch()){
              
$return .= "<tr><td>{$result->id}</td><td>{$result->email}</td>
                         <td>
{$result->country}</td><td>{$result->bin}</td>
                         <td>"
.date('d-m-Y'$result->date_register)."</td></tr>";    
            } 
            return 
$return;
         }
         
/*
                    Проверка E-mail на уникальность
           */
          
public function UniqEmail($email){
          
/*
                Востановление пароля
           */
           
public  function recover($email){
                if(!
$this->UniqEmail($email))
                throw new 
Exception('Такого email адреса не существует в БД!'); 
             
//Генерируем новый пароль
             
$email $this->db->quote($email);
             
$new_password rand(10,100) . "hgkl" rand(1,9);    
             
$password validate::hashInit($new_password);
             
//Перезаписываем пароль пользователю
             
$query $this->db->query("UPDATE `users` SET `password` = '$password' WHERE `email` = $email");
             if(!
$query) return false;
             
//отправляем письмо пользователю с новым паролем
             
mail::new_mail($email"Новый пароль""Ваш новый пароль, для доступа к аккаунту\n"$new_password);
             return 
true;
           }
          
/*
                                    Профиль пользователя (выборка данных)
           */
           
public function showProfile($id){
                
$id intval($id);
                
$query $this->db->query("SELECT * FROM `users` WHERE `id` = $id");
             return  
$query->fetch();

           }
           
/*
                                Профиль пользователя 
            */ 
            
public function editProfile($data){
                
$id intval($data['id']);    
                
$query_pass $this->db->query("SELECT `password` FROM `users` WHERE `id` = $id");
                if(
$data['password'] === "" || $data['password'] === 0){
                    
$password $query_pass->fetch()->password;
                }else{
                    
$password validate::hashInit($data['password']);
                }
                
$query $this->db->prepare("UPDATE `users` SET `email` = :email, `password` = :password, `fam` = :fam, `name` = :name, `otc` = :otc, `name_comp` = :name_comp, `bin` = :bin, `user_phone` = :user_phone, `country` = :country WHERE `id` = :id");
                
$query->bindParam(":email"$data['email'], PDO::PARAM_STR);  
                
$query->bindParam(":password"$passwordPDO::PARAM_STR);
                
$query->bindParam(":fam"$data['fam'], PDO::PARAM_STR);
                
$query->bindParam(":name"$data['name'], PDO::PARAM_STR);
                
$query->bindParam(":otc"$data['otc'], PDO::PARAM_STR);
                
$query->bindParam(":name_comp"$data['name_comp'], PDO::PARAM_STR);
                
$query->bindParam(":bin"$data['bin'], PDO::PARAM_INT);
                
$query->bindParam(":user_phone"$data['user_phone'], PDO::PARAM_STR); 
                
$query->bindParam(":country"$data['country'], PDO::PARAM_STR);
                
$query->bindParam(":id"$data['id'], PDO::PARAM_INT); 
                return 
$query->execute();
            }
        
/*
                            Выход пользователей
Ave_Ave_Ave вне форума Ответить с цитированием
Старый 02.06.2016, 11:55   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

и? Смотрите какая именно ошибка. Например в логе сервера.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 02.06.2016, 11:58   #3
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 4,160
По умолчанию

судя по всему - не удается выполнить sql запрос. А вот почму -нужно смотреть в логах
ADSoft вне форума Ответить с цитированием
Старый 03.06.2016, 10:38   #4
Ave_Ave_Ave
Пользователь
 
Регистрация: 15.03.2015
Сообщений: 21
По умолчанию

Исправил ошибку. Теперь после регистрации отправляет письмо с ссылкой, открываю выходит сообщение: Произошла ошибка при активации акаунта! Пожалуйста, обратитесь к Администрации сайта.
А должно быть это: Через несколько минут, вас перенаправит на страницу авторизации...
Ave_Ave_Ave вне форума Ответить с цитированием
Старый 03.06.2016, 10:40   #5
Ave_Ave_Ave
Пользователь
 
Регистрация: 15.03.2015
Сообщений: 21
По умолчанию

Кусок кода из файла раунтига данных:
PHP код:
if($data->activate_account($id$activate_key)){
                   
self::location(HTTP_PATH.'login'3);    
                   exit(
"Аккаунт успешно активирован!" nl2br("\n"). 
                        
"Через несколько минут, вас перенаправит на страницу авторизации...");
                } 
                 else{ 
                   exit(
"Произошла ошибка при активации акаунта! Пожалуйста, обратитесь к Администрации сайта.");    
                } 
Ave_Ave_Ave вне форума Ответить с цитированием
Старый 03.06.2016, 11:00   #6
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Как найти ошибку в своем коде?
Дебажь метод activate_account.
Выводи на экран результаты запроса, результат хэширования, и визуально сравнивай его с $activate_key.
Andkorol вне форума Ответить с цитированием
Старый 03.06.2016, 11:00   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
PHP код:
if($activate_key === validate::hashInit($result->email."::".$result->password)){ 
              if(
$this->db->exec("UPDATE `users` SET `activate` = 1")) return true
          } 
Вы это серьёзно?!!
Это же в корне неправильно.
Или Вы реально всем записям в таблице users хотите проставить поле "activate" в единицу?
Или, может быть, Вы просто забыли добавить WHERE и указать ID пользователя, которого собираетесь активировать ( `id` = $id )?

а ещё, похоже, что activate_key не соответствует validate::hashInit()
Serge_Bliznykov вне форума Ответить с цитированием
Старый 03.06.2016, 18:34   #8
CodeNOT
Форумчанин
 
Аватар для CodeNOT
 
Регистрация: 08.11.2010
Сообщений: 593
По умолчанию

Код:
$activate_key === validate::hashInit($result->email."::".$result->password)
тут вот сравнение типов и значения, я бы перепроверил эту строчку
CodeNOT вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создания Регистрации Hunter of Medved Помощь студентам 1 05.11.2012 15:01
Страница Регистрации Дениска236 HTML и CSS 0 08.10.2012 21:15
Ошибка при регистрации/авторизации mvc3 razor naximuz ASP.NET 0 19.09.2012 19:34
В чём ошибка при регистрации cheef Общие вопросы Delphi 2 01.05.2009 08:28
Реализация регистрации Sanek777 Безопасность, Шифрование 1 08.11.2008 17:46