Форум программистов, компьютерный форум, киберфорум
PHP: ООП
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.50/14: Рейтинг темы: голосов - 14, средняя оценка - 4.50
1 / 1 / 1
Регистрация: 16.03.2012
Сообщений: 72

Работа с базой MySQL через собственный класс

17.11.2013, 23:35. Показов 3088. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Пытаюсб освоить ООП на PHP.
Так сказать, для тренировки решил написать класс, который будет работать с БД.
Все просто: от класса требуется на данном этапе получить данные и как-нибудь их вывести (в этом основная трудность). В будущем, когда отлажу работу класса с выводом будет еще запись в БД.
Так вот, мой класс:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class db
{
    var $pullQuery;
    var $pushQuery;
  function connect ()
  {
      $connect=mysql_connect('localhost','root','000000');
               mysql_select_db('db',$connect);
               mysql_query('set names cp1251');
  }
  function pull ()
  {
    $this->connect();
         $result=mysql_query($this->pullQuery);
 return $result;
  }
 
  function numPull ()
  {
      return mysql_num_rows($this->pull());
  }
 
}
 
$dbg= new db;
$dbg->pullQuery='SELECT * FROM  `QUESTIONS`';
 
for ($i=0; $i<=$this->numPull(); $i++)
{$row=mysql_fetch_assoc($dbg->pull());
    echo "</br>".$row['id'];}
Задача состоит в том, чтобы вывести данные, сделать аналог следующему коду:
PHP
1
2
3
4
5
6
7
$sql='SELECT * FROM table';
$query=mysql_query($sql);
for ($i=0; $i<=mysql_num_rows($query))
{
     $row=mysql_fetch_assoc($query);
       echo $row['id'];
}
Честно говоря, я еще не придумал как нужно выводить. Возможно так, как сейчас в классе. Возможно, надо сначала сформировать массив, а потом этот массив вне класса перебрать (правда, я здесь вижу явный минус - нужно дважды перебирать массив одинаковой длины, да и память будет дополнительная заниматься, так что, склоняюсь более к тому, чтобы оптимизировать тот метод, который есть сейчас в моем классе)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.11.2013, 23:35
Ответы с готовыми решениями:

Перемещение формы через собственный класс
Написал класс для динамического создания форм-подсказок. Подсказки появляются нормально, но когда я начинаю ее двигать по экрану (см....

Создание фигур через собственный класс
Хацкер-погромист просит помощи. :) Делаю свой &quot;проект&quot; для сдачи сессии. Проект &quot;солнечная система&quot;. Собственно, под это дело...

Работа с MySQL базой данных
Сделал я кнопку &quot;Зарегистрироваться&quot;, только она не работает. Вот код: JButton bt1 = new JButton(&quot;Зарегистрироваться&quot;); ...

20
508 / 358 / 13
Регистрация: 12.03.2012
Сообщений: 1,896
18.11.2013, 08:46
Цитата Сообщение от recaptcha Посмотреть сообщение
Возможно, надо сначала сформировать массив, а потом этот массив вне класса перебрать
Других вариантов и не существует.
0
18.11.2013, 11:00

Не по теме:

Цитата Сообщение от recaptcha Посмотреть сообщение
PHP
1
2
var $pullQuery;
* * var $pushQuery;
обновите версию учебника..

0
1 / 1 / 1
Регистрация: 16.03.2012
Сообщений: 72
18.11.2013, 12:05  [ТС]
Цитата Сообщение от KOPOJI Посмотреть сообщение
обновите версию учебника..

а можно подробнее?
0
18.11.2013, 15:58

Не по теме:

я всё же заофтоплюm но посоветую отказаться от mysql_connect и ему подобных.

0
 Аватар для Dolphin
814 / 797 / 201
Регистрация: 21.09.2012
Сообщений: 2,656
18.11.2013, 17:05
Цитата Сообщение от recaptcha Посмотреть сообщение
а можно подробнее?
var использовался еще до версии php5. Сейчас нужно использовать public, private или static
1
1 / 1 / 1
Регистрация: 16.03.2012
Сообщений: 72
18.11.2013, 17:40  [ТС]
Цитата Сообщение от Dolphin Посмотреть сообщение
var использовался еще до версии php5. Сейчас нужно использовать public, private или static
Спасибо! так и сделал!
Цитата Сообщение от nonamez123 Посмотреть сообщение
Не по теме:
я всё же заофтоплюm но посоветую отказаться от mysql_connect и ему подобных.
А что же посоветуете использовать?
Итак, получившейся класс:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
class db
{
    public $pullQuery;
    public $pushQuery;
    public $pullResult=array();
    private $pullSQLresult;
    public  $PullIndex;
  private function connect ()
  {
      $connect=mysql_connect('localhost','root','000000');
               mysql_select_db('db',$connect);
               mysql_query('set names utf8');
  }
 
  private function pull ()
  {
    $this->connect();
         $this->pullSQLresult=mysql_query($this->pullQuery);
  }
 
  public  function PullRes ()
    {
        $this->pull();
        for ($i=1; $i<=$this->numPull(); $i++)
        {
            $row=mysql_fetch_assoc($this->pullSQLresult);
            $this->pullResult[$i]=$row[$this->PullIndex];
        }
 
    }
 public function numPull ()
  {
      return mysql_num_rows($this->pullSQLresult);
  }
}
Решил посмотреть насколько медленее он работает по отношению к его процедурному брату:
PHP
1
2
3
4
5
6
7
8
9
10
$connect=mysql_connect('localhost','root','000000');
mysql_select_db('db',$connect);
mysql_query('set names utf8');
$sql='SELECT * FROM  table';
$query=mysql_query($sql);
for ($i=0; $i<=mysql_num_rows($query); $i++)
{
    $row=mysql_fetch_assoc($query);
    echo "</br>".$row['id'];
}
использую класс следующим образом:
PHP
1
2
3
4
5
6
7
8
9
$dbg= new db;
$dbg->pullQuery='SELECT * FROM  table';
$dbg->PullIndex='id';
$dbg->PullRes();
 
for ($i=1; $i<=$dbg->numPull(); $i++)
{
    echo "</br>".$dbg->pullResult[$i];
}
Получил, что процедурный вариант работает на 58% быстрей чем объектный. Измерял время выполнения скрипта с помощью функции microtime(). Делал 5 контрольных измерений для каждого варианта кода.
0
 Аватар для Dolphin
814 / 797 / 201
Регистрация: 21.09.2012
Сообщений: 2,656
18.11.2013, 17:44
Цитата Сообщение от recaptcha Посмотреть сообщение
А что же посоветуете использовать?
Можно использовать PDO. Безопаснее, если использовать подготовленные запросы, но чуть дольше
0
ищите меня в нирване
 Аватар для your_tremor
36 / 36 / 5
Регистрация: 23.10.2013
Сообщений: 198
18.11.2013, 17:58
Цитата Сообщение от recaptcha Посмотреть сообщение
процедурный вариант работает на 58% быстрей чем объектный.
мало того: ассемблер всех за пояс заткнет по скорости работы. Вывод напрашивается сам собой! Но почему-то, на асме только дрова для железяк пишут... Ну зачем спрашивается на пыхе писать, ведь он же в сотни раз медленнее асма?
0
1 / 1 / 1
Регистрация: 16.03.2012
Сообщений: 72
18.11.2013, 18:03  [ТС]
Цитата Сообщение от your_tremor Посмотреть сообщение
мало того: ассемблер всех за пояс заткнет по скорости работы. Вывод напрашивается сам собой! Но почему-то, на асме только дрова для железяк пишут... Ну зачем спрашивается на пыхе писать, ведь он же в сотни раз медленнее асма?
ну это в данном случае так. Нужно отметить, что варианты не эквивалентны. Чтобы вывести из объектного варианта данные нужно пройтись циклом по n*2 строкам из БД. Где n - число строк, возвращенных запросом.
А процедурному надо все всего n проходов, чтобы вывести теже данные.
Интересно будет посмотреть на то, как будут записывать в базу объектный вариант и процедурный, будет ли разница в скорости?
0
ищите меня в нирване
 Аватар для your_tremor
36 / 36 / 5
Регистрация: 23.10.2013
Сообщений: 198
18.11.2013, 18:15
не смотрел ваш код, просто общие принцыпы высказал. А посмотрел, восхитился:
Цитата Сообщение от recaptcha Посмотреть сообщение
for ($i=1; $i<=$this->numPull(); $i++)
каждую итерацию цикла спрашивать какое количество итераций будет в цикле? дело совсем не в медленном ооп похоже... в чем-то другом
Цитата Сообщение от recaptcha Посмотреть сообщение
PHP
1
2
3
4
5
6
7
dbg= new db; 
$dbg->pullQuery='SELECT * FROM table'; 
$dbg->PullIndex='id'; 
$dbg->PullRes(); 
for ($i=1; $i<=$dbg->numPull(); $i++) { 
echo "</br>".$dbg->pullResult[$i]; 
}
классический говнокод из смеси запросов и вывода данных
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
18.11.2013, 19:19
Цитата Сообщение от Dolphin Посмотреть сообщение
public, private или static
или статик? А в чем между ними связь? Или вы попутали с protected?
Цитата Сообщение от recaptcha Посмотреть сообщение
процедурный вариант работает на 58% быстрей чем объектный
да. А если не использовать инклуды, функции и обойтись как можно меньшим количеством переменных, то будет еще быстрее. Пишите все в одном файле, и будет быстрый код. Только неподдерживаемый..
Кстати, код различается. Во-первых, индекс 'id' в процедурном коде находится не в переменной, а подставляется константно. Во-вторых, в процедурном коде сразу выводится, а там сохраняется в переменную. В-третьих, в цикле в процедурном коде вы сразу берете число записей из БД, а в коде класса вы вызываете дополнительную функцию. К тому же, не уверен, но думаю, что обращение к переменным из локальной области видимости осуществляется быстрее, нежели обращение к переменным экземпляра. Исправьте и сравните результаты, если очень хочется.
Ну и да, вообще, ООП-код дольше выполняется. Просто в разработке зачастую удобнее (по крайней мере, в языках, подобных PHP)
Цитата Сообщение от recaptcha Посмотреть сообщение
Чтобы вывести из объектного варианта данные нужно пройтись циклом по n*2 строкам из БД
Все зависит от реализации. Можно и лишь один. К тому же, в PDO, например, есть метод fetchAll()
1
 Аватар для Василий Макогон
270 / 226 / 11
Регистрация: 20.04.2012
Сообщений: 817
18.11.2013, 21:58
остается понять, зачем нужен этот класс вообще..
0
18.11.2013, 22:06

Не по теме:

Василий Макогон, так это,

Цитата Сообщение от recaptcha Посмотреть сообщение
Пытаюсь освоить ООП на PHP

0
1 / 1 / 1
Регистрация: 16.03.2012
Сообщений: 72
18.11.2013, 22:09  [ТС]
Цитата Сообщение от your_tremor Посмотреть сообщение
дело совсем не в медленном ооп похоже... в чем-то другом
Да я и не говорю, что ооп медленный, я говорю что в моей реализации получается, что процедурный подход выгоднее с точки зрения скорости. Я прекрасно понимаю, что скорость в ООП прямопропорционально радиусу кривизны моих рук...
Цитата Сообщение от your_tremor Посмотреть сообщение
каждую итерацию цикла спрашивать какое количество итераций будет в цикле?
Вы можете что-то предложить (идею, не нужно реализации)? Заменить на цикл while(хотя там же тоже вроде нужен будет счетчик)? Цикл foreach?

KOPOJI, спасибо за ваше сообщение! Я так понимаю, чтобы избавиться от одного цикла стоит смотреть в сторону PDO?
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
18.11.2013, 22:14
Необязательно. От БД это, в общем-то, не зависит. Вариантов много. Да, можно использовать fetchAll и один цикл. Можно выводить сразу, в классе. Но да, это противоречит принципам ООП (правда, если создать отдельную функцию для вывода шаблона, то не так уж и сильно, но все же). Но, из того, что выбрать, я бы выбрал fetchAll..
Цитата Сообщение от recaptcha Посмотреть сообщение
Вы можете что-то предложить
я могу. Например, хотя бы высчитать значение один раз, а не на каждой итерации цикла.
PHP
1
for ($i = 1, $cnt = $this->numPull(); $i <= $cnt; $i++)
Аналогично с mysql_num_rows..
1
ищите меня в нирване
 Аватар для your_tremor
36 / 36 / 5
Регистрация: 23.10.2013
Сообщений: 198
18.11.2013, 22:20
Цитата Сообщение от recaptcha Посмотреть сообщение
Вы можете что-то предложить
изучить азы программирования. не надо в цикле вызывать функцию, если она вернет один и тот же результат в каждом вызове.. Разработчики drupal-а, только пару лет назад об этом узнали... и "оптимизировали" свою систему.. их можно понять, они учили программирование по учебникам php
0
1 / 1 / 1
Регистрация: 16.03.2012
Сообщений: 72
18.11.2013, 22:51  [ТС]
KOPOJI, спасибо! Если честно, только сейчас понял свою ошибку в цикле вывода данных.
А насколько правильно с точки зрения ООП будет присвоить какой-либо переменной в самом классе значения количества возвращенных строк? Или опять говнокод?
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
18.11.2013, 22:58
recaptcha, вы сначала ответьте на вопрос, надо ли вам это значение за пределом цикла и вообще этого небольшого метода.. А там уже, в принципе, ответ получите сами - если надо, то можно добавить. Если не надо - то незачем засорять класс ненужными вещами

Добавлено через 5 минут

Не по теме:

Хотя, имхо, использование for для вывода неудобное само по себе. Слишком много лишнего. Куда проще написать сразу while. Пускай он даже будет работать несколько дольше (что, кстати, не факт - ибо, как минимум, отсутствие двух лишних переменных и вычисления числа всех записей), но мне будет удобно. А пара милисекунд большой роли не сыграет..

PHP
1
2
3
4
while($row = mysql_fetch_assoc($dbg->pull())
{
.....
}
Кстати, при взгляде на метод pull проявляется еще одна причина такой большой разницы в коде - в нем вызывается метод connect, что означает, что в цикле вы каждый раз создаете новое подключение к БД. Вот вам ~ 30 % разницы в быстродействии

1
1 / 1 / 1
Регистрация: 16.03.2012
Сообщений: 72
18.11.2013, 23:09  [ТС]
Цитата Сообщение от KOPOJI Посмотреть сообщение
Кстати, при взгляде на метод pull проявляется еще одна причина такой большой разницы в коде - в нем вызывается метод connect, что означает, что в цикле вы каждый раз создаете новое подключение к БД. Вот вам ~ 30 % разницы в быстродействии
Я об этом подумал. Pull по моей задумке должен вызываться только один раз в PullRes. Или я опять где-то ошибся?
По большому счету, мне было неважно, насколько будет медленнее работать код, написанный через объекты, я и так понимал, что он будет медленнее и понимал почему. Ну вот момент с циклом вывода данных для меня был неочивиден, спасибо, что подсказали.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.11.2013, 23:09
Помогаю со студенческими работами здесь

Работа с MySQL базой данных
Когда я ввожу в текстовое поле значение из базы данных и нажимаю кнопку - ничего не происходит public class prog { public static...

Работа с базой mySQL. Проблемы с коннектом
Доброго времени суток. Обращаюсь к Вам, потому как не могу в гугле найти решение проблемы. Создал приложение на языке C#. Оно работает с...

Соединение с базой данных MySQL через ASP
Связь делаю с ASP через ODBC на стороне сервера драйвер MySQL установлен. Подскажите, что нужно написать вместо вопросов. Set...

Работа с базой данных MySQL средствами PHP
Здравствуйте,Помогите пожалуйста с запросом по SQL.. не получается вывести список предметов. Получить список предметов, на изучение...

Работа с базой MySQL/Oracle из кода программы на С/С++
Как работать с базой MySQL/Oracle из кода программы на С/С++, без использования MFC, API и с полной совместимостью с Windows/Linux?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru