Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Проблемы с "ООП"

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (3): [1] 2 3 »   

> Без описания
likvidator
Отправлено: 14 Ноября, 2013 - 16:47:19
Post Id


Посетитель


Покинул форум
Сообщений всего: 416
Дата рег-ции: Март 2012  


Помог: 4 раз(а)

[+]


Много-много прочитал всяких доков про ООП...прочитал,а толку... Ну,скажем,не много...
PHP:
скопировать код в буфер обмена
  1.  
  2. class authentication {
  3. ...
  4. private $password;
  5. ...
  6. public function gen_password() {
  7. $arr = array('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','r','s','t','u','v','x','y','z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','R','S','T','U','V','X','Y','Z','1','2','3','4','5','6','7','8','9','0','(',')','*','<','>','/');  
  8.     // Генерируем пароль
  9. $pass="";
  10.     for($i = 0; $i < rand(6,15); $i++)  
  11.     {  
  12.       // Вычисляем случайный индекс массива  
  13.       $index = rand(0, count($arr) - 1);  
  14.       $pass=$pass.$arr[$index];          
  15.     }  
  16. $this->password=$pass;}
  17. ...
  18. public function reg($log,$e_mail) {
  19. $this->password;
  20. $mysqli=new mysqli("localhost","root","","site");
  21. $stmt = $mysqli->prepare("INSERT INTO users (login, password,mail) VALUES (?, ?, ?)");
  22. $stmt->bind_param('sss',$login,$password,$mail);
  23. $stmt->execute();}

Вот пишу тестовую регистрацию и не понимаю как записать значение из gen_password() в private $password,а в reg() получить этот самый $password

(Отредактировано автором: 14 Ноября, 2013 - 16:50:41)

 
 Top
teddy
Отправлено: 14 Ноября, 2013 - 16:57:21
Post Id


Участник


Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013  


Помог: 91 раз(а)




Нужно вызвать в reg() сам gen_password() $this->gen_password(); что бы этот метод отработал и произошло присвоение, а потом уже в bind param надо будет указать не $password а $this->password

но как по мне логика - каша
 
 Top
likvidator
Отправлено: 14 Ноября, 2013 - 17:00:38
Post Id


Посетитель


Покинул форум
Сообщений всего: 416
Дата рег-ции: Март 2012  


Помог: 4 раз(а)

[+]


teddy пишет:
Нужно вызвать в reg() сам gen_password() $this->gen_password(); что бы этот метод отработал и произошло присвоение, а потом уже в bind param надо будет указать не $password а $this->password

но как по мне логика - каша

ну потому что я привык к процедурному стилю. А что есть не каша?
 
 Top
esterio
Отправлено: 14 Ноября, 2013 - 17:05:37
Post Id



Активный участник


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


Помог: 127 раз(а)




данный класс ничего не должен знать про коннект к базе. етого достаточно, он може вызвать другой обект для сохранения в базу, но делать коннект к базе строго запрещено
 
 Top
teddy
Отправлено: 14 Ноября, 2013 - 17:05:38
Post Id


Участник


Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013  


Помог: 91 раз(а)




likvidator пишет:
А что есть не каша?

Ну например не писать все буквы алфавита в массив а просто сделать range('a', 'z');
 
 Top
likvidator
Отправлено: 14 Ноября, 2013 - 17:08:47
Post Id


Посетитель


Покинул форум
Сообщений всего: 416
Дата рег-ции: Март 2012  


Помог: 4 раз(а)

[+]


teddy пишет:
likvidator пишет:
А что есть не каша?

Ну например не писать все буквы алфавита в массив а просто сделать range('a', 'z');

так вы в этом плане.... Взял всю функцию на портале php.su...
 
 Top
DelphinPRO
Отправлено: 14 Ноября, 2013 - 17:32:31
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




Чтобы писать классы, нужно думать объектами.


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
likvidator
Отправлено: 14 Ноября, 2013 - 17:36:18
Post Id


Посетитель


Покинул форум
Сообщений всего: 416
Дата рег-ции: Март 2012  


Помог: 4 раз(а)

[+]


esterio пишет:
данный класс ничего не должен знать про коннект к базе. етого достаточно, он може вызвать другой обект для сохранения в базу, но делать коннект к базе строго запрещено

т.е мне нужен совершенно отдельный класс для работы с бд. Этот класс я буду использовать при необходимости?

(Отредактировано автором: 14 Ноября, 2013 - 17:39:37)

 
 Top
likvidator
Отправлено: 14 Ноября, 2013 - 20:09:28
Post Id


Посетитель


Покинул форум
Сообщений всего: 416
Дата рег-ции: Март 2012  


Помог: 4 раз(а)

[+]


Иииии вот он: свежий говнокодец....
PHP:
скопировать код в буфер обмена
  1.  
  2. class data_base {
  3. private $host="localhost";
  4. private $user="root";
  5. private $passwd="";
  6. private $db_select="site";
  7. private $username;
  8. public function reg_send($log,$password,$e_mail) {
  9. $this->reg_validate($log,$e_mail);
  10. if(!empty($this->username)){
  11. $error="Такой логин или e-mail уже используется!";
  12. return $error;
  13. }else{
  14. $mysqli=new mysqli($this->host,$this->user,$this->passwd,$this->db_select);
  15. $stmt=$mysqli->prepare("INSERT INTO users (login,password,mail) VALUES (?, ?, ?)");
  16. $stmt->bind_param('sss',$log,$password,$e_mail);
  17. $stmt->execute();}}
  18. public function reg_validate($login,$mail) {
  19. $mysqli=new mysqli($this->host,$this->user,$this->passwd,$this->db_select);
  20. $stmt=$mysqli->prepare("SELECT login FROM users WHERE login=? OR mail=?");
  21. $stmt->bind_param('ss',$login,$mail);
  22. $stmt->execute();
  23. $stmt->bind_result($username);
  24. $stmt->fetch();
  25. $this->username=$username;}
  26. }
  27.  

(Добавление)
и не нравятся мне эти 2 повтряющихся
PHP:
скопировать код в буфер обмена
  1. $mysqli=new mysqli($this->host,$this->user,$this->passwd,$this->db_select);
 
 Top
esterio
Отправлено: 14 Ноября, 2013 - 20:41:00
Post Id



Активный участник


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


Помог: 127 раз(а)




likvidator пишет:

и не нравятся мне эти 2 повтряющихся
$mysqli=new mysqli($this->host,$this->user,$this->passwd,$this->db_select);

Конешно, зачем два раза соединяться с базой. Самый плохой, но действенный метод, ето
Спойлер (Отобразить)


И ето далеко не лучшый вариант
 
 Top
likvidator
Отправлено: 14 Ноября, 2013 - 20:53:32
Post Id


Посетитель


Покинул форум
Сообщений всего: 416
Дата рег-ции: Март 2012  


Помог: 4 раз(а)

[+]


esterio пишет:
likvidator пишет:

и не нравятся мне эти 2 повтряющихся
$mysqli=new mysqli($this->host,$this->user,$this->passwd,$this->db_select);

Конешно, зачем два раза соединяться с базой. Самый плохой, но действенный метод, ето
Спойлер (Отобразить)


И ето далеко не лучшый вариант

Спасибо большое! Завтра буду переваривать,но на вскидку: чего плохого в этом методе? Не рациональный? Или что?
 
 Top
kilowat
Отправлено: 14 Ноября, 2013 - 21:13:36
Post Id


Новичок


Покинул форум
Сообщений всего: 20
Дата рег-ции: Окт. 2013  


Помог: 0 раз(а)




я думаю лучше оформить в виде сингелтона, примерно так, но можно улучшить, туда же в класс засунуть создание объекта от класса mysqli
PHP:
скопировать код в буфер обмена
  1. class data_base
  2.     {
  3.             protected static $instance;  
  4.             protected $mysqli;
  5.            
  6.             private function __clone(){}  
  7.             private function __wakeup(){}
  8.          
  9.            
  10.             private function __construct(mysqli $mysqli)
  11.             {
  12.                     $this->mysqli = $mysqli;
  13.             }
  14.            
  15.          
  16.     public static function getInstance() {    // Возвращает единственный экземпляр класса. @return Singleton
  17.         if ( !isset(self::$instance) ) {
  18.             $class = __CLASS__;
  19.             self::$instance = new $class($mysqli);
  20.         }
  21.         return self::$instance;
  22.     }
  23.  
  24.             public function reg_send($log, $password, $e_mail)
  25.             {
  26.                     if(!$this->reg_validate($log, $e_mail))
  27.                             return 'Такой логин или e-mail уже используется!';
  28.      
  29.                     $stmt = $this->mysqli->prepare("INSERT INTO users (login,password,mail) VALUES (?, ?, ?)");
  30.                     $stmt->bind_param('sss', $log, $password, $e_mail);
  31.                     $stmt->execute();
  32.             }
  33.            
  34.             public function reg_validate($login, $mail)
  35.             {
  36.                     $stmt=$this->mysqli->prepare("SELECT COUNT(1) as `isset` FROM users WHERE login=? OR mail=? LIMIT 1");
  37.                     $stmt->bind_param('ss', $login, $mail);
  38.                     $stmt->execute();
  39.                     $stmt->bind_result($isset);
  40.                     $stmt->fetch();
  41.                     return !$isset;
  42.             }
  43.     }
  44.      
  45.      
  46.     $mysqli=new mysqli($host, $user, $passwd, $db_select);
  47.     data_base::getInstance($mysqli)->reg_send($log, $password, $e_mail);  
  48.  

(Отредактировано автором: 14 Ноября, 2013 - 21:14:51)

 
 Top
esterio
Отправлено: 15 Ноября, 2013 - 03:06:25
Post Id



Активный участник


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


Помог: 127 раз(а)




Мой пример далк от идиала, но дает толчек к изучению. Но ваш хуже. Не советуйте такых глупостей
 
 Top
likvidator
Отправлено: 15 Ноября, 2013 - 17:12:18
Post Id


Посетитель


Покинул форум
Сообщений всего: 416
Дата рег-ции: Март 2012  


Помог: 4 раз(а)

[+]


Вот все хорошо,кроме одного... Для работы с этим классом в другом классе я должен вызвать:
PHP:
скопировать код в буфер обмена
  1. $mysqli=new mysqli($host, $user, $passwd, $db_select);

НО:
esterio пишет:
данный класс ничего не должен знать про коннект к базе
 
 Top
caballero
Отправлено: 15 Ноября, 2013 - 17:22:40
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Поэтому и используется синглетон чтобы иметь доступ к конекту с люого места


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Страниц (3): [1] 2 3 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB