Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Класс и mysql. Вопрос новичка, проблема с циклом. 
:(
    Опции темы
lemniscate
Дата 23.11.2009, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 23.11.2009

Репутация: нет
Всего: нет



Доброго времени суток. Это моя первая попытка по освоению ООП. Решил наверное сразу за сложно взяться. И вот в чем проблема, вроде бы все работает, но вот функция 

Код

function fetch_array()
{
if($this->s_query){
while($row = mysql_fetch_array($this->m_query())){}
}


приводит к зависанию браузера. Не могу разобраться, быть может я вообще все не так делаю. Спасибо

Собственно вот класс.

Код

class db
{
var $error_nomer;
var $error_title;
var $connection;
var $num_rows;
var $s_query;
var $result;

function connect()
{
$db = mysql_connect("localhost","***","***");
$this->error_nomer = mysql_errno();
$this->error_title = mysql_error();
if($this->error_nomer == 0){$this->connection=1;}
mysql_select_db("***", $db);
}


function connect_status_print()
{
if($this->connection){echo 'Ñîåäèíåíèå óñòàíîâëåíî';}
else{echo '<b>Êîä îøèáêè MySQL: </b>'.$this->error_nomer.' ('.$this->error_title.') ';}
}


function m_query()
{
if(!$this->connection){$this->connect();}
$this->result = mysql_query($this->s_query);
return $this->result;
}

function num_rows()
{
$num = mysql_num_rows($this->m_query());
return $num;
}


function fetch_array()
{
if($this->s_query){
while($row = mysql_fetch_array($this->m_query())){}
}
else{echo 'Çàïðîñ íå îïðåäåëåí';}

}


}

$obj = new db;
#$obj->connect();
#$obj->connect_status_print();
$obj->s_query = 'select * from *** limit 10';
$obj->fetch_array();





PM MAIL   Вверх
solenko
Дата 23.11.2009, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1473
Регистрация: 15.1.2006
Где: Украина

Репутация: 34
Всего: 67



Цитата(lemniscate @  23.11.2009,  14:48 Найти цитируемый пост)
while($row = mysql_fetch_array($this->m_query())){}

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


--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
K0T9I
Дата 23.11.2009, 18:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 20.11.2009

Репутация: 2
Всего: 2



да ладно зачем мучать человека smile 

каждый вызов mysql_fetch_array обрабатывает ряд результата запроса и сдвигает внутренний указатель на следующий ряд, и так пока ряды не закончатся.

mysql_query же получает эти ряды из базы и ставит внутренний указатель на начало.

смотрим  что у вас:
Код

while($row = mysql_fetch_array($this->m_query())){
}


при первой итерации вызывается $this->m_query() (что есть ни что иное, как mysql_query), она производит запрос к базе и  возвращает результат запроса, с указателем на первом ряду,
mysql_fetch_array обрабатывает ряд и смещает указатель на следующий ряд, вроде пока все хорошо.
но вот на следующей итерации опять вызывается $this->m_query(), которая снова посылает запрос к базе и возвращает результат, снова устанавливая указатель на первый ряд, mysql_fetch_array обрабатывает ряд и смещает указатель на следующий ряд... чувствуете? все колеблется между первым и вторым рядом, и так до бесконености.

ps: тс, не обижайтесь, но пока здесь ООП нет, а есть функциональное программирование, только с помощью классов... 


Это сообщение отредактировал(а) K0T9I - 23.11.2009, 18:40
PM MAIL   Вверх
Pitlord
Дата 23.11.2009, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 246
Регистрация: 31.10.2009

Репутация: 4
Всего: 7



Кстати, мне кажется разумным дескрипторы запросов вообще в коде (в смысле — за пределами класса) никак не светить, т.е. чтобы они внутри объекта и оставались. Каждый очередной запрос клал бы в стек свой дескриптор:

Код

<?php

class db
{
    private $resource_stack = array();

    # ...

    function query($q)
    {
        # ...

        if( $r = mysql_query($q) )
        {
            array_push($this->resource_stack, $r);

            return true;
        }

        return false;
    }

    function fetch_assoc()
    {
        if( empty($resource_stack) )
            return false;

        if( $row = mysql_fetch_assoc(end($this->resource_stack)) )
        {
            return $row;
        }

        array_pop($this->resource_stack);

        return false;
    }
}

$db->query('SELECT ... FROM `tbl1` ...;');

while( $row1 = $db->fetch_assoc() )
{
    $db->query('SELECT ... FROM `tbl2` ...;');

    while( $row2 = $db->fetch_assoc() )
    {
        # ...
    }
}

?>

Остальные функции (num_rows(), affected_rows()) вызывать надо будет на соответствующем уровне. И все результаты запроса должны быть обязательно высбождены.

К текущему треду это сильно не относится, понимаю, но хочется высказать свою мысль.

Это сообщение отредактировал(а) Pitlord - 23.11.2009, 19:23
PM MAIL   Вверх
Ипатьев
Дата 23.11.2009, 19:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2232
Регистрация: 5.7.2009

Репутация: 28
Всего: 37



Не понимаю, к чему все эти дескрипторы-шмескрипторы.
Три метода, которые получают, соответственно, скаляр, строку и массив. 
Все. 
В рамках стандартного пхп скрипта этого достаточно. 
Городить этот стек, чтобы использовать его в единственном скрипте на все приложение - вот это я называю го.. неправильной архитектурой
PM MAIL   Вверх
Pitlord
Дата 23.11.2009, 19:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 246
Регистрация: 31.10.2009

Репутация: 4
Всего: 7



Ипатьев, я Вас вообще не понимаю, Вы про что?

Добавлено через 11 минут и 55 секунд
P.S. Правда с mysql_unbuffered_query() я, возможно, погорячился
PM MAIL   Вверх
nerezus
Дата 23.11.2009, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


Профиль
Группа: Участник
Сообщений: 3330
Регистрация: 15.6.2005

Репутация: 12
Всего: 43



Цитата

Собственно вот класс.


1. Код ужасно оформлен.
2. Не соблюдены правила именования сущностей.
3. Переменные должны носить выразительные имена.
4. Класс должен быть переносим. Следовательно в корне неверно прописывать параметры конекта к СУБД внутри конструктора.
5. Кодировка! Используй исключительно UTF-8, иначе будет та же хрень, что и сейчас.
6. Уроаень абстракции. У тебя он нулевой - ты просто загнал функции в методы, при этом их реалдьно неудобно юзать. Т.е. тут нету смысла ООП. Исправляй.
7. Класс не несет смысла - является лишь НЕУДОБНОЙ оберткой над фйункциями. Исправляй.


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
lemniscate
Дата 24.11.2009, 09:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 23.11.2009

Репутация: нет
Всего: нет



Всем спасибо за ответы, есть к чему идти и стремится. Это мои первые шаги в ООП, и как оказались не в том направлении. Сегодня обязательно попробую закончить. Спасибо. 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0482 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.