Автор Тема: User class с pdo  (Прочетена 5459 пъти)

0 Потребители и 1 Гост преглежда(т) тази тема.

HD

  • Administrator
  • Hero Member
  • *****
  • Благодарности
  • -Казани: 208
  • -Получени: 165
  • Публикации: 3077
User class с pdo
« -: 13 Декември 2011, 15:31:11 »
Както  обещах онзи ден , пускам един user class с pdo. Всичко работи добре, имате един метод save() and login().  Oттам може да си го разширявате както искате.

Код: PHP
  1. <?php
  2.  
  3. class SppUser {
  4.  
  5.     private $uid;   //user id
  6.     private $fields;
  7.     private $_db; //holds PDO;
  8.     private $db_user;
  9.     private $db_pass;
  10.  
  11.     public function __construct() {
  12.  
  13.  
  14.         $this->db_user = "root";
  15.         $this->db_pass = "";
  16.         $this->uid;
  17.         $this->fields = array(
  18.             'username' => '',
  19.             'password' => '',
  20.             'email' => '');
  21.  
  22.         try {
  23.             $this->_db = new PDO("mysql:host=localhost;dbname=spp", $this->db_user, $this->db_pass);
  24.         } catch (Exception $exc) {
  25.             echo $exc->getMessage();
  26.         }
  27.     }
  28.  
  29. //Registry pattern via magical methods __get and __set
  30.  
  31.     public function __set($field, $value) {
  32.         $this->fields[$field] = $value;
  33.     }
  34.  
  35.     public function __get($field) {
  36.         if (array_key_exists($field, $this->fields)) {
  37.             return $this->fields[$field];
  38.         }
  39. // key does not exist, either return a default
  40.         return null;
  41. // or throw an exception
  42.         throw new OutOfBoundsException($fields);
  43.     }
  44.  
  45. //saving use in a database via prepared statements
  46.     public function save() {
  47.         $stmt = $this->_db->prepare("INSERT INTO users( user_id,username, password, email)
  48.            VALUES(:user_id,:username,:password, :email)");
  49.  
  50.         try {
  51.             $stmt->execute(array(
  52.                 ':user_id' => $this->uid,
  53.                 ':username' => $this->username,
  54.                 ':password' => $this->password,
  55.                 ':email' => $this->email));
  56.         } catch (Exception $exc) {
  57.             echo $exc->getMessage();
  58.         }
  59.     }
  60.  
  61.     public function login()
  62.     {
  63.         $stmt=$this->_db->prepare("SELECT username, password  FROM users WHERE username= :username
  64.            AND password= :password");
  65.        
  66.         $stmt->execute(array(
  67.             ":username"=>$this->username,
  68.             ":password"=>$this->password));
  69.          
  70.         if($stmt->rowCount() >0 )
  71.             {    
  72.                
  73.             $_SESSION['username'] = $this->username;
  74.             header("Location: profile.php");
  75.             }
  76.             else
  77.             {
  78.                
  79.                 //new exdasa
  80.             }
  81.            
  82.         }
  83. }
  84. ?>
  85.  
« Последна редакция: 05 Февруари 2012, 09:49:37 от HD »

HD

  • Administrator
  • Hero Member
  • *****
  • Благодарности
  • -Казани: 208
  • -Получени: 165
  • Публикации: 3077
Re: User class с pdo
« Отговор #1 -: 15 Януари 2012, 17:30:39 »
Добавям още един метод към класа. Целта на метода е да проверява дали потребителското име е заето, преди да направите регистрация. Очаквам мнения, предложения и критики.
Код: PHP
  1.     public function username_exist($username) {
  2.        
  3.         //prepared statement
  4.         $stmt= $this->_db->prepare("SELECT username FROM users WHERE username=? LIMIT 1");
  5.         $stmt->bindParam(1, $username);
  6.        
  7.         $stmt->execute();
  8.        
  9.         if($stmt->fetch(PDO::FETCH_NUM)>0)
  10.         {
  11.             echo("Потребителското име е вече заето");
  12.             exit();
  13.         }
  14.     }
  15.  
  16.  

HD

  • Administrator
  • Hero Member
  • *****
  • Благодарности
  • -Казани: 208
  • -Получени: 165
  • Публикации: 3077
Re: User class с pdo
« Отговор #2 -: 16 Януари 2012, 14:12:51 »
Добавям още една функционалност към класа.  Запазването на пароли в базата не е шега работа. Криптирането с sha1() не е достатъчно. Именно поради това добавих този метод на хеширане.  Има готови библиотеки, който могат да се използват, има и сигурно по-добър начин от моя. Давам него тъй като мисля, че е по разбираем.  Мнения, предложения, критики на ЛС или тук.

Код: PHP
  1.     //hash the password with sha1 and salt
  2.     public function hash_password($password)
  3.     {
  4.       if(empty($password))
  5.       {
  6.           return false;
  7.       }
  8.       else
  9.       {
  10.         $salt = sha1(rand());
  11.         $salt = substr($salt, 0, 4);
  12.         $hash_password = base64_encode( sha1($password . $salt, true) . $salt );
  13.         return $hash_password;
  14.          
  15.       }
  16.  
  17.  

wuser

  • Administrator
  • Hero Member
  • *****
  • Благодарности
  • -Казани: 85
  • -Получени: 49
  • Публикации: 2761
Re: User class с pdo
« Отговор #3 -: 16 Януари 2012, 14:26:58 »
+1
Мъдростта на патилото
Perl Monks: PHP - it's "training wheels without the bike" -- Randal L. Schwartz


Дееба... чувствам се все едно обяснявам на майка ми как да си отвори пощата
"не работи"
WTF?!?!? к'во значи че не работи?
Не ти се компилира, дава ти грешка, вади ти грешни резултати, компютърът ти се изключва като го напишеш или на целия квартал му спира тока?
Stilgar

HD

  • Administrator
  • Hero Member
  • *****
  • Благодарности
  • -Казани: 208
  • -Получени: 165
  • Публикации: 3077
Re: User class с pdo
« Отговор #4 -: 04 Март 2012, 17:11:04 »
Добавям метод за изтриване на потребител от базата данни.
Код: PHP
  1.         public function  delete($user_id)
  2.         {
  3.            $stmt=$this->_db->prepare("DELETE FROM users WHERE user_id=:user_id");
  4.            $stmt->bindParam(":user_id", $user_id);
  5.            $stmt->execute();
  6.            
  7.         }
  8.