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 Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
and_07
Отправлено: 20 Сентября, 2012 - 20:40:29
Post Id


Гость


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


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




Прошу указать фрагменты которые можно улучшить в данном коде

PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3.  
  4. define('DBHOST','localhost');
  5. define('DBUSER','');
  6. define('DBPASS','');
  7. define('DBNAME','');
  8.  
  9. ?>
  10. <?PHP
  11.  
  12. interface BaseData
  13. {
  14.     function query($sql);
  15.     function insert( $table, $data );
  16.     function update( $table, $changes, $condition );
  17.     function delete( $table, $condition, $limit );
  18. }
  19.  
  20. ?>
  21.  
  22.  
  23. <?PHP
  24.  
  25. class DataClass implements BaseData
  26. {
  27.         private static $_instance;
  28.  
  29.         private $_connection;
  30.         private $results;
  31.  
  32.         public function __construct()
  33.         {
  34.                 $this->_connection = mysql_connect(DBHOST, DBUSER, DBPASS) or die(mysql_error());
  35.                 mysql_select_db(DBNAME) or die(mysql_error());
  36.         }
  37.          
  38.         public function __destruct()
  39.         {
  40.                 @mysql_close($this->_connection);
  41.         }
  42.  
  43.   public function delete( $table, $condition, $limit)
  44.     {
  45.         $limit = ( $limit == '' ) ? '' : ' LIMIT ' . $limit;
  46.         $delete = "DELETE FROM {$table} WHERE {$condition} {$limit}";
  47.         $this->query( $delete );
  48.     }
  49.  
  50.     public function update( $table, $changes, $condition )
  51.     {
  52.         $update = "UPDATE " . $table . " SET ";
  53.         foreach( $changes as $field => $value )
  54.         {
  55.             $update .= "`" . $field . "`='{$value}',";
  56.         }
  57.  
  58.         $update = substr($update, 0, -1);
  59.         if( $condition != '' )
  60.         {
  61.             $update .= "WHERE " . $condition;
  62.         }
  63.  
  64.         $this->query( $update );
  65.  
  66.         return true;
  67.     }
  68.  
  69.     public function insert( $table, $data )
  70.     {
  71.         $fields  = "";
  72.         $values = "";
  73.  
  74.         foreach ($data as $f => $v)
  75.         {
  76.  
  77.             $fields  .= "`$f`,";
  78.             $values .= ( is_numeric( $v ) && ( intval( $v ) == $v ) ) ? $v."," : "'$v',";
  79.  
  80.         }
  81.  
  82.         $fields = substr($fields, 0, -1);
  83.         $values = substr($values, 0, -1);
  84.  
  85.         $insert = "INSERT INTO $table ({$fields}) VALUES({$values})";
  86.         $this->query( $insert );
  87.         return true;
  88.     }
  89.  
  90.     public function query( $queryStr )
  91.     {
  92.                 if ($this->_connection === false) {
  93.             die('No Database Connection Found.');
  94.         }
  95.  
  96.         $result = @mysql_query($queryStr,$this->_connection);
  97.         if ($result === false) {
  98.             die(mysql_error());
  99.         }
  100.         return $result;
  101.     }
  102.        
  103.         public function fetch($sql)
  104.         {
  105.                 $result = $this->query($sql);
  106.                  $ret = array();
  107.                          while ($row = mysql_fetch_assoc($result))
  108.                          {
  109.                                         $ret []= $row;
  110.                          }
  111.                  return ($ret);
  112.     }  
  113.          
  114. }
  115. ?>
  116.  
  117.  
  118. <?PHP
  119.  
  120. class GuestBook
  121. {
  122.     private $db;
  123.         private $table = "guestbook";
  124.        
  125.     public function __construct( BaseData $db)
  126.     {
  127.                 $this->db = $db;
  128.     }
  129.    
  130.     public function checkunique($email)
  131.     {
  132.        $this->db->query("SELECT * FROM `".$this->table."` WHERE email='$email'");
  133.     }
  134.    
  135.     public function add($data)
  136.     {
  137.             $this->db->insert( $this->table, $data );
  138.     }
  139.        
  140.     public function delete($condition, $limit)
  141.     {
  142.             $this->db->delete( $this->table, $condition, $limit );
  143.     }  
  144.        
  145.     public function update( $changes, $condition )
  146.     {
  147.             $this->db->update($this->table, $changes, $condition );
  148.     }  
  149.        
  150.     public function query($sql)
  151.     {
  152.         $this->db->query($sql);
  153.     }  
  154.  
  155.     public function create()
  156.     {
  157.                 $sql ="
  158.                 CREATE TABLE IF NOT EXISTS `".$this->table."` (
  159.                   `id` int(10) unsigned NOT NULL auto_increment,
  160.                   `parent_id` int(10) ,
  161.                   `name` varchar(255) default '',
  162.                   `email` varchar(255) default '',
  163.                   `description` varchar(255) default '',
  164.                   `when` int(11) NOT NULL default '0',
  165.                   `ip` varchar(20) default NULL,         
  166.                   PRIMARY KEY  (`id`)
  167.                 ) ENGINE=MyISAM DEFAULT CHARSET=utf8"; 
  168.        
  169.         $this->db->query($sql);
  170.     }
  171.        
  172.     public function fetch($sql)
  173.     {
  174.         return $this->db->fetch($sql);
  175.     }          
  176.        
  177.         public function get_ip() {
  178.                 $ip = "0.0.0.0";
  179.                 if( ( isset( $_SERVER['HTTP_X_FORWARDED_FOR'] ) ) && ( !empty( $_SERVER['HTTP_X_FORWARDED_FOR'] ) ) ) {
  180.                         $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
  181.                 } elseif( ( isset( $_SERVER['HTTP_CLIENT_IP'])) && (!empty($_SERVER['HTTP_CLIENT_IP'] ) ) ) {
  182.                         $ip = explode(".",$_SERVER['HTTP_CLIENT_IP']);
  183.                         $ip = $ip[3].".".$ip[2].".".$ip[1].".".$ip[0];
  184.                 } elseif((!isset( $_SERVER['HTTP_X_FORWARDED_FOR'])) || (empty($_SERVER['HTTP_X_FORWARDED_FOR']))) {
  185.                         if ((!isset( $_SERVER['HTTP_CLIENT_IP'])) && (empty($_SERVER['HTTP_CLIENT_IP']))) {
  186.                                 $ip = $_SERVER['REMOTE_ADDR'];
  187.                         }
  188.                 }
  189.                 return $ip;
  190.         }      
  191.                
  192. }
  193. ?>
  194.  
  195.  
  196. <?PHP
  197.  
  198.  $GB = new GuestBook( new  DataClass()) ;
  199. //$GB->create();
  200. /*
  201.  $arr=array();
  202.  $arr["name"]   = 'test';
  203.  $arr["email"] = 'test@te.te';
  204.  $arr["description"]= 'bla bla bla';
  205.  $arr["when"] =123;
  206.  $arr["ip"] ='127.0.1';
  207.  
  208.  $arr1=array();
  209.  $arr1["name"]   = 'test2';
  210.  $arr1["email"] = 'test@te.te';
  211.  $arr1["description"]= 'bla bla bla';
  212.  $arr1["when"] =2;
  213.  $arr1["ip"] = $GB->get_ip();
  214.  
  215.   $GB->add( $arr);
  216.   $GB->update( $arr1,'id=4');
  217.   $GB->delete('name ="test" ' ,2);*/
  218.  
  219.         $sql ="select * from guestbook ";
  220.         $res =$GB->fetch($sql) ;
  221.         $ip = $GB->get_ip();
  222.  
  223. ?>
  224.  
  225.  
  226.  
  227.  
 
 Top
Мелкий Супермодератор
Отправлено: 20 Сентября, 2012 - 21:28:47
Post Id



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


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


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




0) Глобальные константы
1) использование mysql_*, вместо mysqli/PDO
2) неиспользуемые свойства, как минимум $_instance
3) безальтернативные die
4) нет защиты от инъекций даже там, где она легко была бы реализована


-----
PostgreSQL DBA
 
 Top
OrmaJever Модератор
Отправлено: 20 Сентября, 2012 - 21:32:53
Post Id



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


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


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




5) частое использование "@", что очень плохо.
6) некоторые циклы можно заменить на join()
7) для работы с базой даных можно и даже нужно использовать singleton.


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
Bio man
Отправлено: 20 Сентября, 2012 - 21:39:02
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2751
Дата рег-ции: Июль 2010  
Откуда: Даугавпилс, Латвия


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




8) Нет обработки ошибок в случае неудачного запроса.

Как исправишь первые 7 пунктов, пиши, напишем еще 5 пунктов а то и больше. Для учебного проекта 8 пункт не столь важен, но лучше привыкать сразу.

(Отредактировано автором: 20 Сентября, 2012 - 21:39:25)

 
 Top
armancho7777777 Супермодератор
Отправлено: 20 Сентября, 2012 - 22:07:08
Post Id



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


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


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




Мелкий, можно прокомментировать:
Мелкий пишет:
безальтернативные die

Не совсем понял что Вы имели в виду Улыбка
 
 Top
DlTA
Отправлено: 20 Сентября, 2012 - 22:21:48
Post Id



Постоянный участник


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


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




armancho7777777 пишет:
Не совсем понял что Вы имели в виду

and_07 пишет:
mysql_select_db(DBNAME) or die(mysql_error());

если не подключились, то отвалилось ВСЕ.
(Добавление)
кстати тоже очень плохой учатсок,
или справильней сказать очень хороший для злоумышленников,
им сразу видно что и куда идет, ведь ошибка то возвращается в браузер
 
 Top
Мелкий Супермодератор
Отправлено: 20 Сентября, 2012 - 22:29:47
Post Id



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


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


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




armancho7777777 пишет:
можно прокомментировать:

DlTA верно пояснил мою мысль.


-----
PostgreSQL DBA
 
 Top
armancho7777777 Супермодератор
Отправлено: 20 Сентября, 2012 - 22:51:13
Post Id



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


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


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




Мелкий пишет:
DlTA верно пояснил мою мысль.

А.
Я думал, Вы что - то ещё имели в виду )

(Отредактировано автором: 21 Сентября, 2012 - 04:09:52)

 
 Top
digi
Отправлено: 21 Сентября, 2012 - 09:01:52
Post Id


Посетитель


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


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




OrmaJever пишет:
7) для работы с базой даных можно и даже нужно использовать singleton.

factory - т.к. коннектов может быть много.
 
 Top
snikers987
Отправлено: 21 Сентября, 2012 - 09:07:16
Post Id



Участник


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


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




digi пишет:
OrmaJever пишет:
7) для работы с базой даных можно и даже нужно использовать singleton.

factory - т.к. коннектов может быть много.

Ну и зачем плодить подключения к бд?


-----
Когда всматриваешься в тёмную бездну, учти, что кто-то может смотреть на тебя из неё...
 
My status
 Top
armancho7777777 Супермодератор
Отправлено: 21 Сентября, 2012 - 09:35:07
Post Id



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


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


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




digi пишет:
коннектов может быть много.

Только в случае к разным БД.
Но в этом случае переменная getInstance может быть массивом, где ключи - названия БД.
Получится что-то типа этого:
PHP:
скопировать код в буфер обмена
  1.  
  2. class DB {
  3.  
  4.       private static $_getInstance = array();
  5.          
  6.           // Данные для коннектов баз данных
  7.           private $_data_connects = array(
  8.          
  9.                                   'default_db_name' => array(
  10.                                       'host' => '',
  11.                                       'user' => '',
  12.                                           'pass' => ''
  13.                                   ),
  14.                                   'myDatabase2' => array(
  15.                                       'host' => '',
  16.                                       'user' => '',
  17.                                           'pass' => ''
  18.                                   ),
  19.                                   'myDatabase3' => array(
  20.                                       'host' => '',
  21.                                       'user' => '',
  22.                                           'pass' => ''
  23.                                   )
  24.                                  
  25.                   );
  26.          
  27.          
  28.           public static function getInstance($db_name = 'default_db_name')
  29.           {
  30.                   if(!isset(self::$_getInstance[$db_name]))
  31.                   self::$_getInstance[$db_name] = new self($db_name);
  32.                  
  33.                   return self::$_getInstance[$db_name];
  34.           }
  35.          
  36.           private function __construct($db_name)
  37.           {
  38.                   // Connect  
  39.                  
  40.                   $this->_data_connects[$db_name]['host'];
  41.                   $this->_data_connects[$db_name]['user'];
  42.                   $this->_data_connects[$db_name]['pass'];
  43.           }    
  44. }
  45.  
  46.  
  47. DB::getInstance();
  48. DB::getInstance('myDatabase2');
  49. DB::getInstance('myDatabase3');
  50.  

(Отредактировано автором: 21 Сентября, 2012 - 09:44:47)

 
 Top
Мелкий Супермодератор
Отправлено: 21 Сентября, 2012 - 09:41:03
Post Id



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


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


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




snikers987 пишет:
Ну и зачем плодить подключения к бд?

Например, при репликации. Классическая схема пишем на мастер, читаем со слейва.

Хотя тут больше вопрос по названиям синглтона и фабрики. Класс, содержащий статическими несколько экземпляров самого себя и выдающего оные на основании переданного параметра (как раз armancho7777777 пример показал) - уже не синглтон, т.к. объектов класса уже несколько, но ещё и не фабрика, т.к. должен не только породить экземпляр, но и хранить его, как одиночку.


-----
PostgreSQL DBA
 
 Top
armancho7777777 Супермодератор
Отправлено: 21 Сентября, 2012 - 09:45:22
Post Id



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


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


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




Дописал ещё немного для наглядности ))
(Добавление)
Мелкий пишет:
уже не синглтон, т.к. объектов класса уже несколько, но ещё и не фабрика, т.к. должен не только породить экземпляр, но и хранить его, как одиночку.

single factory Улыбка (фабрика одиночек)

(Отредактировано автором: 21 Сентября, 2012 - 10:27:08)

 
 Top
digi
Отправлено: 21 Сентября, 2012 - 11:51:41
Post Id


Посетитель


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


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




armancho7777777 пишет:
single factory Улыбка (фабрика одиночек)

registry Улыбка
 
 Top
and_07
Отправлено: 21 Сентября, 2012 - 13:05:01
Post Id


Гость


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


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




Всем доброго времени суток спасибо за комментарии учту но хотелось бы услышать что нибудь о реализации композиции или наследования и вообще если я реализую singleton разве такая конструкция будет нормально работать

PHP:
скопировать код в буфер обмена
  1.  
  2. $GB = new GuestBook( DataClass::getInstance()) ;
  3.  

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


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB