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 :: Реализация класса User и статичной функции в нем

 PHP.SU

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


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

> Без описания
daewoosh
Отправлено: 26 Марта, 2014 - 08:37:56
Post Id


Новичок


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


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




Доброго времени суток.
У меня есть таблица Users (id, name, age, city). Данные о городах хранятся в таблице cities,таблицы связаны между собой по полю city_id. Мне необходимо создать страницу, выводящую список пользователей в виде таблицы. Но проблема в том, что нужно реализовать класс User. Передавая в конструктор в качестве параметра id пользователя, мы должны на выходе получить объект пользователя с заполненными данными.
Это я делаю следующим образом:

PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.  
  3. class User {
  4. public $id;
  5. public $username;
  6. public $age;
  7. public $city;
  8.  
  9. protected $mysqli;
  10.  
  11. function __construct($id){
  12. $this->mysqli = new mysqli('localhost', 'root', '','users');
  13. $query = "SELECT * FROM users where id = '$id'";
  14.  
  15. if ($result = $this->mysqli->query($query)){
  16. // Выбор данных из ответа сервераMySQL
  17. $arr = $result->fetch_array(MYSQLI_ASSOC);
  18. // Удаляем результирующую выборку
  19. $result->close();
  20. // Вывод ответа клиенту
  21. return $arr;
  22. }
  23. else return "данных нет";
  24. }
  25. // Деструктор закрывает соединение с базой
  26. function __destruct()
  27. {
  28. $this->mysqli->close();
  29. }
  30. }
  31. ?>


Взято это из книги Бенкен "AJAX программирование для интернета" и переделано мною. Правильно ли я реализовал конструктор?

Так же в этом классе должна быть реализована статичная функция GetAllUsers, которая извлекает всех пользователей из таблицы, причем страница со списком пользователей формируется на основе этих данных. Как сделать это слабо себе представляю.

Должен ли я реализовать вывод полученных данных прямо в этой же функции или рисовать таблицу и заполнять ее нужно отдельно?
 
 Top
T1grOK
Отправлено: 26 Марта, 2014 - 12:50:43
Post Id



Частый гость


Покинул форум
Сообщений всего: 129
Дата рег-ции: Июнь 2013  


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




Крайне неудачная реализация. А если мне потребуется создать 10 экземпляров User, тогда у меня будет 10 подключений к БД.


-----
Mysql, Postgresql, Redis, Memcached, Unit Testing, CI, Kohana, Yii, Phalcon, Zend Framework, Joomla, Open Cart, Ymaps, VK Api
 
 Top
esterio
Отправлено: 26 Марта, 2014 - 13:06:14
Post Id



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


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


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




Есть правило не создавать коннект к базе в конструкторе. запомните это. Используйте паттерн Regostry или Singleton
 
 Top
daewoosh
Отправлено: 26 Марта, 2014 - 13:16:50
Post Id


Новичок


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


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




T1grOK пишет:
Крайне неудачная реализация. А если мне потребуется создать 10 экземпляров User, тогда у меня будет 10 подключений к БД.


Ну а если закрывать подключение в конце конструктора? или проверку делать на наличие подключения? или вообще подключать в другом месте? попробовал сам реализовать статическую функцию GetAllUsers. Вроде работает все, но хотелось бы узнать удачна ли такая реализация, и , если нет, то почему?

PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3.  
  4.  
  5. class users
  6. {
  7. static function getAllUsers(){
  8. header( 'Content-Type: text/html; charset=utf-8' );
  9.    
  10.     $db_host = 'localhost';
  11.     $db_name = 'users';
  12.     $db_username = 'root';
  13.     $db_password = '';
  14.     $db_table_to_show = 'users';
  15.  
  16.    
  17.     $connect_to_db = mysql_connect($db_host, $db_username, $db_password)
  18.                 or die("Could not connect: " . mysql_error());
  19.                 mysql_query("SET NAMES UTF8") or die(mysql_error());
  20.         mysql_query("SET CHARACTER SET UTF8") or die(mysql_error());
  21.  
  22.    
  23.     mysql_select_db($db_name, $connect_to_db)
  24.                 or die("Could not select DB: " . mysql_error());
  25.  
  26.    
  27.     $qr_result = mysql_query("select * from " . $db_table_to_show)
  28.                 or die(mysql_error());
  29.  
  30.    
  31.     echo '<table border="1">';
  32.         echo '<thead>';
  33.         echo '<tr>';
  34.         echo '<th>Id</th>';
  35.         echo '<th>Фамилия</th>';
  36.         echo '<th>Возраст</th>';
  37.         echo '<th>Город</th>';
  38.         echo '</tr>';
  39.         echo '</thead>';
  40.         echo '<tbody>';
  41.        
  42.    
  43.         while($data = mysql_fetch_array($qr_result)){
  44.                 echo '<tr>';
  45.                 echo '<td>' . $data['users_id'] . '</td>';
  46.                 echo '<td>' . $data['users_name'] . '</td>';
  47.                 echo '<td>' . $data['users_age'] . '</td>';
  48.                 echo '<td>' . $data['city'] . '</td>';
  49.                 echo '</tr>';
  50.         }
  51.        
  52.     echo '</tbody>';
  53.         echo '</table>';
  54.  
  55.  
  56.     mysql_close($connect_to_db);
  57.  
  58. }
  59. }
  60. ?>
  61.  


Здесь пока что без конструктора. Рационально ли такое создание таблицы?Возможно ли будет в дальнейшем реализовать редактирование такой таблицы?
 
 Top
DelphinPRO
Отправлено: 26 Марта, 2014 - 14:53:21
Post Id



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


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


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




по сути класс User вообще ничего не должен знать о коннектах. Пусть он скажет вашей абстракции над БД - "дай-ка мне вон те данные", получит их и использует. И пофигу классу откуда взялись эти данные. А БД-абстракция, в свою очередь, не будет вникать что там за данные, она просто выполнит если надо коннект, сделает запрос к мускулу и вернет набор данных тому, кто их попросил.


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Объектно-ориентированное программирование »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB