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


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

> Описание: класс для mysql
v.kam
Отправлено: 11 Января, 2013 - 21:55:42
Post Id


Новичок


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


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




вот начал писать класс для работы с mysql в небольших проектах.

листинг файла class_mysql.php
PHP:
скопировать код в буфер обмена
  1.  
  2. <?
  3. class db
  4. {
  5.         var $config = array();
  6.         var $request;
  7.         var $result;
  8.         var $link;
  9.         private function MysqlLogError($log) //ведение лога ошибок
  10.         {
  11.                 $file = fopen('MysqlLogError.txt', 'a');
  12.                 fwrite($file, '------------------------------ ' . date("Y-m-d H:i:s") . ' ------------------------------' . "\n" . $log . "\n");
  13.                 fclose($file);
  14.         }
  15.         private function SetConfig()
  16.         {
  17.                 if(file_exists($this->config['file']))
  18.                 {
  19.                         return $this->config['file'];
  20.                 }
  21.                 else
  22.                 {
  23.                         $this->MysqlLogError("Can't to open file " . $this->config['file'] . " in directory");
  24.                         exit;
  25.                 }
  26.         }
  27.         private function MysqlQuery()
  28.         {
  29.                 include($this->SetConfig());
  30.                 if($this->link = @mysql_connect(@$sql_host, @$sql_user, @$sql_pass))
  31.                 {
  32.                         if(@mysql_select_db($sql_name, $this->link))
  33.                         {
  34.                                 if(mysql_client_encoding($this->link) != $this->config['charset'])
  35.                                 {
  36.                                         mysql_set_charset($this->config['charset']);
  37.                                 }
  38.                                 if($this->result = mysql_query($this->request, $this->link))
  39.                                 {
  40.                                         return;
  41.                                 }
  42.                                 else
  43.                                 {
  44.                                         $this->MysqlLogError(mysql_error($this->link));
  45.                                         exit;
  46.                                 }
  47.                         }
  48.                         else
  49.                         {
  50.                                 $this->MysqlLogError(mysql_error($this->link));
  51.                                 exit;
  52.                         }
  53.                 }
  54.                 else
  55.                 {
  56.                         $this->MysqlLogError(mysql_error($this->link));
  57.                         exit;
  58.                 }
  59.         }
  60.         function MysqlFetchArray()
  61.         {
  62.                 $this->MysqlQuery();
  63.                 while($row = mysql_fetch_array($this->result))
  64.                 {
  65.                         $data[] = $row;
  66.                 }
  67.                 mysql_close($this->link);
  68.                 return $data;
  69.         }
  70.         function MysqlNumRows()
  71.         {
  72.                 $this->MysqlQuery();
  73.                 mysql_close($this->link);
  74.                 return mysql_num_rows($this->result);
  75.         }
  76.         function MysqlInsertInto($table, $field = array())
  77.         {
  78.                 $sql = array('field' => null, 'value' => null);
  79.                 foreach($field as $key => $value)
  80.                 {
  81.                         $sql['field'] .= $key . ', ';
  82.                         $sql['value'] .= "'" . $value . "', ";
  83.                 }
  84.                 $this->request = 'INSERT INTO ' . $table . ' (' . substr($sql['field'], 0, -2) . ') VALUE(' . substr($sql['value'], 0, -2) .')';
  85.                 $this->MysqlQuery();
  86.                 mysql_close($this->link);
  87.         }
  88. }
  89. $db = new db;
  90. ?>
  91.  


листинг файла config.php
PHP:
скопировать код в буфер обмена
  1.  
  2. <?
  3. $sql_host = 'localhost';
  4. $sql_user = 'dbuser';
  5. $sql_pass = 'dbpass';
  6. $sql_name = 'dbname';
  7. ?>
  8.  

использование
PHP:
скопировать код в буфер обмена
  1.  
  2. <?
  3. //подключаем файл
  4. include('class_mysql.php');
  5.  
  6. //устанавливаем файл конфигурации, и кодировку
  7. $db->config = array('file' => 'config.php', 'charset' => 'utf8');
  8.  
  9. //вывод из базы циклом
  10. $db->request = "SELECT * FROM table_name";
  11. foreach($db->MysqlFetchArray() as $key => $value)
  12. {
  13.         echo $value['field_name'] . '<br>';
  14. }
  15.  
  16. //вывод кокичества записей
  17. $db->request = "SELECT * FROM table_name";
  18. echo $db->MysqlNumRows();
  19.  
  20.  
  21. //добовление записи
  22. $db->MysqlInsertInto('table_name', array(
  23.         'field_name1' => 'value1',
  24.         'field_name2' => 'value2',
  25.         'field_name3' => 'value3',
  26.         ));
  27. ?>
  28.  

как видите пока только четыре основных метода.
нужно добавить обновление записей.
какие будут идеи?
 
 Top
spsu
Отправлено: 11 Января, 2013 - 22:29:48
Post Id



Частый гость


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


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




v.kam, я бы переписал так MysqlInsertInto
PHP:
скопировать код в буфер обмена
  1.  
  2.  
  3.  
  4. define('INSERT_SHAB', "INSERT INTO `%s` (`%s`)  VALUES ('%s')"); //Обьявляем шаблон для инсерта
  5.  
  6. //.....        
  7.                                 $into =  implode("`,`", array_keys($fields));
  8.                                 $values = implode("','", array_values($fields));
  9.                                 $this->request = sprintf(INSERT_SHAB, 'teble', $into, $values);
  10. //.....
  11.  

Ну и фильтрации данных нету..
Проверки типов нету...
Закрытие соеденинения сразу в методе, не экономсично, если я зделаю инсерт, и еще раз захоччу сделать инсерт?
Ну и есть mysqli, ORM разные..

(Отредактировано автором: 11 Января, 2013 - 22:30:27)

 
 Top
v.kam
Отправлено: 11 Января, 2013 - 22:53:42
Post Id


Новичок


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


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




spsu СПАСИБО!!! очень благодарен.
 
 Top
spsu
Отправлено: 11 Января, 2013 - 23:16:14
Post Id



Частый гость


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


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




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

(Отредактировано автором: 11 Января, 2013 - 23:17:36)

 
 Top
v.kam
Отправлено: 13 Января, 2013 - 11:20:40
Post Id


Новичок


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


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




написал метод удаления записи(ей).
PHP:
скопировать код в буфер обмена
  1.         public function MysqlDelete($table, $where = array())
  2.         {
  3.                 foreach($where as $key => $value)
  4.                 {
  5.                         $ar[] = "`$key` = '$value'";
  6.                 }
  7.                 $a = implode(" AND ", array_values($ar));
  8.                 $this->request = sprintf("DELETE FROM `$table` WHERE  $a");
  9.                 $this->MysqlQuery();
  10.         }

использование
PHP:
скопировать код в буфер обмена
  1. $db->MysqlDelete('table_name', array(
  2.         'field1' => 'parameter1',
  3.         'field2' => 'parameter2'
  4.         ));

(Отредактировано автором: 13 Января, 2013 - 11:23:32)

 
 Top
esterio
Отправлено: 13 Января, 2013 - 12:27:21
Post Id



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


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


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




И так критика
v.kam пишет:
var $config = array();
        var $request;
        var $result;
        var $link;

в php 5 доступны public, private, protected

PHP:
скопировать код в буфер обмена
  1. if($this->link = @mysql_connect(@$sql_host, @$sql_user, @$sql_pass))

Ето уже конкретная бяка)))
во первых если не пройдет коннект то вы так и неувидете ошыбки из за @.

вместо mysql стоит использовать mysqli или PDO - они уже в ООП

И напоследок весь код плох. Учитесь, учитесь и еще раз учитесь
 
 Top
v.kam
Отправлено: 09 Февраля, 2013 - 12:18:02
Post Id


Новичок


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


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




Всётаки написал класс под свои нужды.
PHP:
скопировать код в буфер обмена
  1. <?
  2. class ClassMysql
  3. {
  4.         var $config = "";
  5.         var $request = "";
  6.         var $result = "";
  7.         var $link = "";
  8.         var $fetch_array = array();
  9.         var $prefix = "";
  10.         public function MysqlLogError($log)
  11.         {
  12.                 $file = fopen('MysqlLogError.txt', 'a');
  13.                 fwrite($file, '------------------------------ ' . date("Y-m-d H:i:s") . ' ------------------------------' . "\n" . $log . "\n");
  14.                 fclose($file);
  15.         }
  16.         function ConfigWrite($conf_value = array())
  17.         {
  18.                 if(count($conf_value) < 6)
  19.                 {
  20.                         $this->MysqlLogError("invalid number of array elements");
  21.                         return false;
  22.                 }
  23.                 else
  24.                 {
  25.                         $conf_write = "";
  26.                         $conf_var = array("host", "username", "password", "dbname", "charset", "prefix");
  27.                         $conf_array = array_combine($conf_var, $conf_value);
  28.                         foreach($conf_array as $key => $value)
  29.                         {
  30.                                 $conf_write .= "\$conf['$key'] = '$value';\n";
  31.                         }
  32.                         $config = fopen('config.php', 'w');
  33.                         if(fwrite($config, "<?\n$conf_write?>"))
  34.                         {
  35.                                 return true;
  36.                         }
  37.                         else
  38.                         {
  39.                                 $this->MysqlLogError("error writing configuration file");
  40.                                 return false;
  41.                         }
  42.                 }
  43.         }
  44.         function SetConfig($config = "")
  45.         {
  46.                 if($config != "")
  47.                 {
  48.                         $this->config = $config;
  49.                 }
  50.                 if(file_exists($this->config))
  51.                 {
  52.                         include($this->config);
  53.                         $this->prefix = $conf['prefix'];
  54.                         if($link = mysql_connect($conf['host'], $conf['username'], $conf['password']))
  55.                         {
  56.                                 if(mysql_select_db($conf['dbname'], $link))
  57.                                 {
  58.                                         if(mysql_client_encoding($link) != $conf['charset'])
  59.                                         {
  60.                                                 mysql_set_charset($conf['charset']);
  61.                                         }
  62.                                         $this->link = $link;
  63.                                 }
  64.                                 else
  65.                                 {
  66.                                         $this->MysqlLogError(mysql_error($this->link));
  67.                                         return false;
  68.                                 }
  69.                         }
  70.                         else
  71.                         {
  72.                                 $this->MysqlLogError(mysql_error($this->link));
  73.                                 return false;
  74.                         }
  75.                 }
  76.                 else
  77.                 {
  78.                         $this->MysqlLogError("Can't to open file " . $this->config . " in directory");
  79.                         return false;
  80.                 }
  81.         }
  82.         function MysqlPars($str = array())
  83.         {
  84.                 $str = array_values($str);
  85.                 foreach($str as $value)
  86.                 {
  87.                         if (is_numeric($value))
  88.                         {
  89.                                 $format_str[] = stripslashes($value);
  90.                         }
  91.                         else
  92.                         {
  93.                                 $format_str[] = "'" . mysql_real_escape_string($value, $this->link) . "'";
  94.                         }
  95.                 }
  96.                 return $format_str;
  97.         }
  98.         function MysqlQuery($request = "")
  99.         {
  100.                 if($request != "")
  101.                 {
  102.                         $str_search = array(
  103.                                 "#\FROM (.+?)#is",
  104.                                 "#\TABLE (.+?)#is"
  105.                         );
  106.                         $str_replace = array(
  107.                                 "FROM " . $this->MysqlPrefix("\\1"),
  108.                                 "TABLE " . $this->MysqlPrefix("\\1")
  109.                         );
  110.                         $request = preg_replace($str_search, $str_replace, $request);
  111.                         $this->request = $request;
  112.                 }
  113.                 if($this->result = mysql_query($this->request, $this->link))
  114.                 {
  115.                         return $this->result;
  116.                 }
  117.                 else
  118.                 {
  119.                         $this->MysqlLogError(mysql_error($this->link));
  120.                         echo '<p>invalid query</p><textarea style="width: 300px; height: 200px;">' . $this->request . '</textarea>';
  121.                         return false;
  122.                 }
  123.         }
  124.         function MysqlPrefix($table)
  125.         {
  126.                 return $this->prefix . $table;
  127.         }
  128.         function MysqlFetchArray()
  129.         {
  130.                 $this->fetch_array = mysql_fetch_array($this->result, MYSQL_ASSOC);
  131.                 return $this->fetch_array;
  132.         }
  133.         function MysqlNumRows()
  134.         {
  135.                 return mysql_num_rows($this->result);
  136.         }
  137.         function MysqlInsertInto($table, $insert = array())
  138.         {
  139.                 $table = $this->MysqlPrefix($table);
  140.                 $fnames = implode("`, `", array_keys($insert));
  141.                 $fvalues = implode(", ", $this->MysqlPars($insert));
  142.                 $this->request = sprintf("INSERT INTO `$table` (`$fnames`) VALUES($fvalues)");
  143.                 $this->MysqlQuery();
  144.         }
  145.         function MysqlDelete($table, $where = array())
  146.         {
  147.                 $table = $this->MysqlPrefix($table);
  148.                 $value = $this->MysqlPars($where);
  149.                 $where_array = array_combine(array_keys($where), $value);
  150.                 foreach($where_array as $key => $value)
  151.                 {
  152.                         $str_format[] = "`$key` = $value";
  153.                 }
  154.                 $str_format = implode(" AND ", $str_format);
  155.                 $this->request = sprintf("DELETE FROM `$table` WHERE $str_format");
  156.                 $this->MysqlQuery();
  157.         }
  158.         function MysqlUpdate($table, $update = array(), $where = array())
  159.         {
  160.                 $table = $this->MysqlPrefix($table);
  161.                 $update_value = $this->MysqlPars($update);
  162.                 $update_array = array_combine(array_keys($update), $update_value);
  163.                 foreach($update_array as $key => $value)
  164.                 {
  165.                         $update_format[] = "`$key` = $value";
  166.                 }
  167.                 $update_format = $update_format = implode(", ", $update_format);
  168.                 if($where == null)
  169.                 {
  170.                         $where_format = "";
  171.                 }
  172.                 else
  173.                 {
  174.                         $where_value = $this->MysqlPars($where);
  175.                         $where_array = array_combine(array_keys($where), $where_value);
  176.                         foreach($where_array as $key => $value)
  177.                         {
  178.                                 $where_format[] = "`$key` = $value";
  179.                         }
  180.                         $where_format = ' WHERE ' . implode(" AND ", $where_format);
  181.                 }
  182.                 $this->request = sprintf("UPDATE `$table` SET $update_format $where_format");
  183.                 $this->MysqlQuery();
  184.         }
  185.         function MysqlClose()
  186.         {
  187.                 mysql_close($this->link);
  188.         }
  189. }
  190. $ClassMysql = new ClassMysql();
  191. ?>


использование:
PHP:
скопировать код в буфер обмена
  1.  
  2. //запись файла конфигурации
  3. $ClassMysql->ConfigWrite(array(
  4.                         'localhost', //адрес сервера
  5.                         'user', //пользователь
  6.                         'password', //пароль
  7.                         'dbname', //имя базы
  8.                         'utf8', //кодировка
  9.                         'prefix_' //префикс таблиц
  10.                         ));
  11. //подключение файла конфигурации и установка соединение
  12. $ClassMysql->SetConfig($root_path . 'config.php');
  13. //добавление записи
  14. $ClassMysql->MysqlInsertInto('table_name', array(
  15.                         'field_name1' => 'value1',
  16.                         'field_neme2' => 'value2'
  17.                         ));
  18. //обновление записи
  19. //второй параметр можно убрать (ну мало ли) ошибок не будет
  20. $ClassMysql->MysqlUpdate('table_name',
  21.                         array(
  22.                                 'field_name1' => 'value1',
  23.                                 'field_neme2' => 'value2'                                                              
  24.                                 ),
  25.                         array(
  26.                                 'where1' =>     'criterion1'
  27.                                 'where2' =>     'criterion2'
  28.                                 )
  29.                         );
  30. //удаление записи
  31. $ClassMysql->MysqlDelete('table_name', array(
  32.                         'where1' =>     'criterion1'
  33.                         'where2' =>     'criterion2'
  34.                         ));
  35. //вывод из базы
  36. $ClassMysql->MysqlQuery("SELECT * FROM table_name");
  37. while($row = $ClassMysql->MysqlFetchArray())
  38. {
  39.         echo $row['field_name1'];
  40. }
  41. //закрываем сосединение
  42. $ClassMysql->MysqlClose();
  43.  

(Отредактировано автором: 09 Февраля, 2013 - 12:19:00)

 
 Top
Stierus Супермодератор
Отправлено: 09 Февраля, 2013 - 12:59:24
Post Id



Рекордсмен по количеству сообщений за 7 дней


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


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




Цитата:
вот начал писать класс для работы с mysql в небольших проектах.
PDO чем не устраивает?
 
My status
 Top
DeepVarvar Супермодератор
Отправлено: 09 Февраля, 2013 - 13:27:24
Post Id



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


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


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




spsu пишет:
define('INSERT_SHAB', "INSERT INTO `%s` (`%s`) VALUES ('%s')"); //Обьявляем шаблон для инсерта
Срочно перенести в сам класс в качестве const!
esterio пишет:
в php 5 доступны public, private, protected
Более того, цэ var уже депрекейтед.
esterio пишет:
Ето уже конкретная бяка)))
во первых если не пройдет коннект то вы так и неувидете ошыбки из за @.
У него нармально в if завернуто же.
esterio пишет:
И напоследок весь код плох. Учитесь, учитесь и еще раз учитесь
Stierus пишет:
PDO чем не устраивает?
Дак пусть поковыряет велосипеды. Ато пока не разберешься сам как оно работает, так не поймешь чо с этими пдо и мускулИ делать..

v.kam:
1) С какого перепуга класс БД умеет конфиг?
2) С какого перепуга класс БД умеет логи?
3) Вам уже говорили, я повторю - где public, private, protected?
4) Почему, например, не синглтон, или что-то иное ограничивающее кол-во "экземпляров"?
5)
v.kam пишет:
$ClassMysql->MysqlQuery("SELECT * FROM table_name");
while($row = $ClassMysql->MysqlFetchArray())
{
echo $row['field_name1'];
}
Ччего? Инкапсулируйте эту while-гадость внутри вашего класса.
6) Мое любимое: http://forum.php.su/topic.php?forum=33&topic=793
7) Были времена, я тоже так писал.. Ну почти.. Радость
 
 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