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
Форумы портала PHP.SU :: Версия для печати :: Реализация класса User и статичной функции в нем
Форумы портала PHP.SU » » Объектно-ориентированное программирование » Реализация класса User и статичной функции в нем

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

1. daewoosh - 26 Марта, 2014 - 08:37:56 - перейти к сообщению
Доброго времени суток.
У меня есть таблица 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, которая извлекает всех пользователей из таблицы, причем страница со списком пользователей формируется на основе этих данных. Как сделать это слабо себе представляю.

Должен ли я реализовать вывод полученных данных прямо в этой же функции или рисовать таблицу и заполнять ее нужно отдельно?
2. T1grOK - 26 Марта, 2014 - 12:50:43 - перейти к сообщению
Крайне неудачная реализация. А если мне потребуется создать 10 экземпляров User, тогда у меня будет 10 подключений к БД.
3. esterio - 26 Марта, 2014 - 13:06:14 - перейти к сообщению
Есть правило не создавать коннект к базе в конструкторе. запомните это. Используйте паттерн Regostry или Singleton
4. daewoosh - 26 Марта, 2014 - 13:16:50 - перейти к сообщению
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.  


Здесь пока что без конструктора. Рационально ли такое создание таблицы?Возможно ли будет в дальнейшем реализовать редактирование такой таблицы?
5. DelphinPRO - 26 Марта, 2014 - 14:53:21 - перейти к сообщению
по сути класс User вообще ничего не должен знать о коннектах. Пусть он скажет вашей абстракции над БД - "дай-ка мне вон те данные", получит их и использует. И пофигу классу откуда взялись эти данные. А БД-абстракция, в свою очередь, не будет вникать что там за данные, она просто выполнит если надо коннект, сделает запрос к мускулу и вернет набор данных тому, кто их попросил.

 

Powered by ExBB FM 1.0 RC1