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 :: Класс для работы с mysql

 PHP.SU

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


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

> Описание: нужна ваша помощь
Данил Банаев
Отправлено: 21 Ноября, 2011 - 09:13:23
Post Id


Новичок


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


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




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

выдает ошибку при вызове метода, который возвращает массив
пишет что прошло ожидание 30 сек и сервер перегружен((
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. class DB{
  4.         protected $_db;
  5.         function __construct($host,$login,$password){
  6.                 $this->_db=mysql_connect($host,$login,$password) or die("Ошибка соединения с сервером БД");
  7.                 mysql_select_db("gbook") or die(mysql_error());
  8.         }
  9.         function __destruct(){
  10.                 unset($this->_db);
  11.               /*
  12.               function close(){
  13.                             mysql_close($this->_db);
  14.               }
  15.               */
  16.         }
  17.         function query($sql){
  18.                 $res=mysql_query($sql) or die(mysql_error());
  19.                             return $res;
  20.         }
  21.         function getArray($sql){
  22.                 $arr=array();
  23.                 while($row=mysql_fetch_assoc($this->query($sql))){
  24.                         $arr[]=$row;
  25.                 }
  26.                 return $arr;
  27.         }
  28. }
  29. ?>
  30.  

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

(Отредактировано автором: 21 Ноября, 2011 - 09:21:59)

 
 Top
caballero
Отправлено: 21 Ноября, 2011 - 09:37:37
Post Id


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


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


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




так разберись что у тебя с сервером при чемтут клас если соединения нет


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Данил Банаев
Отправлено: 21 Ноября, 2011 - 09:57:57
Post Id


Новичок


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


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




Fatal error: Maximum execution time of 30 seconds exceeded
пишет
не знаю чем он мог перегрузится
табличка небольшая с 3-мя записями, попробовал по одному чтолбцу массив вытянуть, даже так виснет
 
 Top
kappa
Отправлено: 21 Ноября, 2011 - 10:01:24
Post Id



Посетитель


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


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




Наверное нужно указать сперва в свойствах
$host,$login,$password
 
 Top
Данил Банаев
Отправлено: 21 Ноября, 2011 - 10:03:58
Post Id


Новичок


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


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




нет я потом объект создаю для пробы и там уже параметры ввожу, сс соединением нет проблем и с запросом тоже
 
 Top
Мелкий Супермодератор
Отправлено: 21 Ноября, 2011 - 10:07:37
Post Id



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


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


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




Данил Банаев пишет:
while($row=mysql_fetch_assoc($this->query($sql))){

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


-----
PostgreSQL DBA
 
 Top
Данил Банаев
Отправлено: 21 Ноября, 2011 - 10:23:37
Post Id


Новичок


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


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




все равно не понимаю Огорчение
 
 Top
Мелкий Супермодератор
Отправлено: 21 Ноября, 2011 - 10:57:20
Post Id



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


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


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




Вы в каждой итерации делаете заново запрос к базе, т.е. цикл закончится только тогда, когда база вернёт 0 записей.

Если коротко:
PHP:
скопировать код в буфер обмена
  1. $res = $this->query($sql);
  2. while($row=mysql_fetch_assoc($res)){
  3.                         $arr[]=$row;
  4.                 }


-----
PostgreSQL DBA
 
 Top
Данил Банаев
Отправлено: 21 Ноября, 2011 - 11:11:14
Post Id


Новичок


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


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




Мелкий пишет:
Вы в каждой итерации делаете заново запрос к базе, т.е. цикл закончится только тогда, когда база вернёт 0 записей.

Если коротко:
PHP:
скопировать код в буфер обмена
  1. $res = $this->query($sql);
  2. while($row=mysql_fetch_assoc($res)){
  3.                         $arr[]=$row;
  4.                 }


Вот исправил
Работает, просто хотелось объеденить 2 метода или так как сейчас лучше?
И еще на счет закрытия соединения вопрос, как лучше метод реализовать?
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. class DB{
  4.         protected $_db;
  5.         function __construct($host,$login,$password){
  6.                 $this->_db=mysql_connect($host,$login,$password) or die("Ошибка соединения с сервером БД");
  7.                 mysql_select_db("gbook") or die(mysql_error());
  8.         }
  9.         function __destruct(){
  10.                 mysql_close($this->_db);
  11.         }
  12.         function query($sql){
  13.                 mysql_query($sql) or die(mysql_error());
  14.         }
  15.         function select($sql){
  16.                 $arr=array();
  17.                 $res=mysql_query($sql) or die(mysql_error());
  18.                 while($row=mysql_fetch_assoc($res)){
  19.                         $arr[]=$row;
  20.                 }
  21.                 return $arr;
  22.         }
  23. }
  24. $o1=new DB("localhost","root","");
  25. //$o1->query("insert into msg(name,email,msg,datetime,ip) values('asdas','dsdf@sdf.cv','dggdfg',24343,'123.9.9.4')");
  26.  
  27. $arr=$o1->select("select * from msgs");
  28.  
  29. foreach($arr as $el){
  30.         foreach($el as $el1){
  31.                 echo $el1."<br>";
  32.         }
  33. }
  34. ?>
  35.  

(Добавление)
Вообще я хотел из процедурной связки 2-х ф-й сделать так же с методами
PHP:
скопировать код в буфер обмена
  1.  
  2. function query($sql){
  3.    $res=mysql_query($sql) or die(mysql_error());
  4.    return db2Array($res);
  5. }
  6. function db2Array($data){
  7.     $arr=array();
  8.     while($row=mysql_fetch_assoc($data)){
  9.         $arr[]=$row;
  10.     }
  11.     return $arr;
  12. }
 
 Top
Мелкий Супермодератор
Отправлено: 21 Ноября, 2011 - 11:36:28
Post Id



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


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


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




Данил Банаев пишет:
Работает, просто хотелось объеденить 2 метода или так как сейчас лучше?

Я бы сказал, что это больше на любителя.
Сам предпочитаю 2 класса. Первый, следуя singleton или factory, оперирует непосредственно соединением с базой и реализует самый минимум методов (что даёт возможность обращаться к базе откуда угодно без глобальных переменных и гарантирует открытие только 1 соединения к базе), второй - результат запроса (реализует несколько интерфейсов массивов).
А в методе query - разбираю, что вернул запрос:
0) если false - кидается exception
1) если true - возвращаю true
2) если ресурс - создаю объект результата на основе этого ресурса и возвращаю его.

Данил Банаев пишет:
И еще на счет закрытия соединения вопрос, как лучше метод реализовать?

Как правило, реализуются оба.
Отдельный метод закрытия соединения и в деструкторе вызывается этот метод. В этом случае получается корректное закрытие соединения как автоматически при завершении скрипта, так и возможность закрыть его руками.


-----
PostgreSQL DBA
 
 Top
Данил Банаев
Отправлено: 21 Ноября, 2011 - 12:01:17
Post Id


Новичок


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


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




Мелкий пишет:
Данил Банаев пишет:
Работает, просто хотелось объеденить 2 метода или так как сейчас лучше?

Я бы сказал, что это больше на любителя.
Сам предпочитаю 2 класса. Первый, следуя singleton или factory, оперирует непосредственно соединением с базой и реализует самый минимум методов (что даёт возможность обращаться к базе откуда угодно без глобальных переменных и гарантирует открытие только 1 соединения к базе), второй - результат запроса (реализует несколько интерфейсов массивов).
А в методе query - разбираю, что вернул запрос:
0) если false - кидается exception
1) если true - возвращаю true
2) если ресурс - создаю объект результата на основе этого ресурса и возвращаю его.

Данил Банаев пишет:
И еще на счет закрытия соединения вопрос, как лучше метод реализовать?

Как правило, реализуются оба.
Отдельный метод закрытия соединения и в деструкторе вызывается этот метод. В этом случае получается корректное закрытие соединения как автоматически при завершении скрипта, так и возможность закрыть его руками.


Большое спасибо.
Направил в нужное русло.

(Отредактировано автором: 21 Ноября, 2011 - 12:02:08)

 
 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