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 :: Проблема с mysqli_free_result()

 PHP.SU

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


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

> Без описания
aldan8
Отправлено: 17 Июня, 2009 - 15:57:43
Post Id



Новичок


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


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




Ситуация такая , добавляю данные в БД
CODE (text):
скопировать код в буфер обмена
  1.  
  2. $result = $db->query('insert into . . . ');
  3. if(!$result)
  4. {
  5. echo 'error';
  6. exit;
  7. }
  8. $result->free();
  9. $db->close();
  10. и т. д.
  11.  

и когда выполняется :
CODE (text):
скопировать код в буфер обмена
  1. $result->free(); // или же mysqli_free_result();
  2. $db->clolse;

выводит след. ошибку:
CODE (text):
скопировать код в буфер обмена
  1. Fatal error: Call to a member function free() on a non-object in Z:\home\webpage.com\www\func_123.php on line 76


Что то не могу понять в чем дело , данные добавляются В БД .
Дальше, наверное, уже не возвращается "ответ" о результате выполнения запроса из БД или не присваеваетя объект в переменную $result , а другое больше ничего не могу придумать .
Главное , что в другом сценарии эта "комбинация" работает без проблем у меня.
Может кто то уже сталкивался с подобной прблемой ?
 
 Top
JustUserR
Отправлено: 17 Июня, 2009 - 16:04:17
Post Id



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


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


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




Ну ошибка явно не в mysqli_free_result а в вашем классе
Зачему чт в разных версиях PHP классы ведут себя поразному
Вероятно вы забыли указать префикс $this-> когда в вашем методе указывали идентификатор соединения с базой данныз


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
RomAndry Администратор
Отправлено: 17 Июня, 2009 - 16:09:51
Post Id



Частый посетитель


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


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




перевод говорит, что free() функции не существует или не подключена должным образом
 
My status
 Top
vitaliy_mad
Отправлено: 17 Июня, 2009 - 16:21:29
Post Id


Участник


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


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




RomAndry пишет:
что free() функции не существует или не подключена должным образом
нет ошибка говорит о том что функция применена не на объекте, т.е. $result - неявляется объектом
 
 Top
aldan8
Отправлено: 17 Июня, 2009 - 16:37:18
Post Id



Новичок


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


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




JustUserR пишет:
Вероятно вы забыли указать префикс $this-> когда в вашем методе указывали идентификатор соединения с базой данныз


Я соединяюсь с БД прямо из сценария .
Я думаю, может проблемма в самом файле, но я вроде всё по правилам написал.
Складывается такое впечатление , что если перепиши этот код в точности до запятой в другом php файле то он заработает Растерялся


RomAndry пишет:
перевод говорит, что free() функции не существует или не подключена должным образом

Это понятно , вопрос - почему не существует или как это подключить долным образом , ведь если бы из БД не было ответа что запрос обработан без проблем ,то во время проверки в сценарии выдалобы 'erorr' и 'exit;'


Может мне использовать просто $db->close() ? Тогда, не останется ли в памяти уже не нужный объект $result ?

(Отредактировано автором: 17 Июня, 2009 - 16:43:45)

 
 Top
Viraban009
Отправлено: 17 Июня, 2009 - 16:53:09
Post Id


Гость


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


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




заголовок функции такой
void mysqli_free_result ( mysqli_result $result )

это говорит о том что функции нужно обязательно передать перемную $result которая должна быть типом mysqli_result .

вот пример
http://phpclub.ru/detail/article/mysqli#part_3_1

(Отредактировано автором: 17 Июня, 2009 - 16:57:15)

 
 Top
aldan8
Отправлено: 17 Июня, 2009 - 17:00:22
Post Id



Новичок


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


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




Viraban009 пишет:
заголовок функции такой
void mysqli_free_result ( mysqli_result $result )

это говорит о том что функции нужно обязательно передать перемную $result и типа mysqli_result .


этот вариант тоже проверял и конечно с $result в качестве значения , но в таком случае выдает уже такую ошибку
CODE (text):
скопировать код в буфер обмена
  1. Warning: mysqli_free_result() expects parameter 1 to be mysqli_result, boolean given in Z:\home\webpage.com\www\func_123.php on line 76
 
 Top
Viraban009
Отправлено: 17 Июня, 2009 - 17:02:41
Post Id


Гость


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


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




ну ты ему походу передаещь тип булин, а надо именно вот мускуль_результ
ты где то переменную переназначил походу

сравни с этим
http://phpclub[dot]ru/detail/article/mysqli#part_3_1
(Добавление)
тут просто нужно понять что этот $result не какой то массив, а просто ссылка на некий объект данных где хранится результат запроса, вот функции и нужно знать что чистить то

(Отредактировано автором: 17 Июня, 2009 - 17:04:06)

 
 Top
aldan8
Отправлено: 17 Июня, 2009 - 17:40:14
Post Id



Новичок


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


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




Viraban009
Спасибо за сылку. В том то и дело что проблему я понял , дело в том что я понятия не имею что нужно изменить/подправить в сценарии что бы исправить ошибку , потому что у меня там почти так же как и в той же сылке .
Вообщем , всё вроде по правилам и поэтому я не знаю где искать ошибку:

CODE (text):
скопировать код в буфер обмена
  1.  
  2.         $host = 'localhost';
  3.         $user = 'user123';
  4.         $pass = 'password123';
  5.         $db = 'database_123';
  6.         @ $db = new mysqli($host,$user,$pass,$db);
  7.         if(mysqli_connect_errno())
  8.         {
  9.          echo 'error !';
  10.         exit;
  11.         }
  12.         $result = $db->query($query);
  13.         if(!$result)
  14.         {
  15.         echo 'ERROR !';
  16.         exit;
  17.         }
  18.         $result->free();
  19.         $db->close();
  20.  

(Отредактировано автором: 17 Июня, 2009 - 17:41:27)

 
 Top
JustUserR
Отправлено: 17 Июня, 2009 - 18:06:50
Post Id



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


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


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




Собсвтенно я так и думал - кто вам сказал что ресурс $result это экземпляр класса который поддержиавает свойство free() - и все равно класса mysqli я не вижу
Допустим мы бы решили сделать свой класс и рассмотрисм его некоторые части
private $db_link; - Тут будет храниться ресурс подключения к БД
private $db_res; - Тяут будет храниться то что вернулось после SQL-запроса из БД
$this->db_link=mysqli_connent(Параметры); - Это конструктор
$this->db_res=mysqli_query(SQL-запрос, $this->db_link); - Вот бы сделали SQL-запрос и чтото поулчили потом поработали с этим
mysqli_free_result($this->db_res); - Вот и почистили память от запроса
Я конечно изобразил класс гипотетически но если вы хоитет чтобы ваш метод free() не принимал параметор то ресурс ответа SQL должен нахожится внутри класса - в нашем примере это $this->db_res


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Viraban009
Отправлено: 17 Июня, 2009 - 18:10:58
Post Id


Гость


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


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




тогда давай полностью код от объяления классов и самих классов с этими методами (функциями).

нужно обязательно передавать атрибуты
$result->free();
$db->close();
иначе можно встретить еще больше мистических проблем в будущем.

и перед тем как начать работать с классами обязательно прочитай эту очень хорошую статью о ООП в php
http://www.php.su/learnphp/phpoo/
именно "обязательно" потому что в классах есть такие нюансы которые интуитивно не понятны (можешь ждать одно а получается другое).

С кодом поможем, но вот если будешь дальше с ООП возится, то все о ней нужно знать из той статьи.

(Отредактировано автором: 17 Июня, 2009 - 18:12:48)

 
 Top
JustUserR
Отправлено: 17 Июня, 2009 - 18:17:10
Post Id



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


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


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




Viraban009 Да уже весьма очевидно в чем проблема - я выше описал
Просто когда он делает SQL-запрос то ресурс ответа сохраняется далеко не внутри класса а когда он вызывает метод free() то подразумевается что этот ресурс уже сам по себе лежит внутри класса хотя его никто туда не копировал


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Viraban009
Отправлено: 17 Июня, 2009 - 18:30:26
Post Id


Гость


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


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




JustUserR
но он же писал что передавал результат, а пхп ему выругался.
Тут еще бы код полностью взглянуть потому, что мне кажется проблема не только в зоне видимости элементов.
 
 Top
aldan8
Отправлено: 17 Июня, 2009 - 18:59:41
Post Id



Новичок


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


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




Viraban009 пишет:
обязательно прочитай эту очень хорошую статью о ООП в php
http://www.php.su/learnphp/phpoo/
именно "обязательно" потому что в классах есть такие нюансы которые интуитивно не понятны (можешь ждать одно а получается другое).

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

Viraban009 пишет:
тогда давай полностью код от объяления классов и самих классов с этими методами (функциями).

Выше этого обращения только проверки и редактирование вводимых данных, типа :
if(isset($_POST['name']) . . . ) . . . trim($_POST['name']) и всё такое.
JustUserR пишет:
$this->db_link=mysqli_connent(Параметры); - Это конструктор
$this->db_res=mysqli_query(SQL-запрос, $this->db_link);

Я обращаюсь к БД из сценария и не использую классы чтобы из них подключаться к БД и соххранять результат в своиствах типа $this->db_res и т.д. То есть , я подключаюсь к БД прямо из "основного" кода.

JustUserR пишет:
кто вам сказал что ресурс $result это экземпляр класса который поддержиавает свойство free() - и все равно класса mysqli я не вижу


Я уже начинаю сомневаться в "простых истинах" . Улыбка
класс mysqli разве не "встроенный класс", типа автоматически подключается к сценариям так же как и такие классы как : Exception, ReflectionClass и т.д. ?
И как я помню , оператор(не знаю как правильнее называется) - $db->query('insert . . . ' ) возвращает что то вроде объекта , в котором содержаться своиства с результатами выполненого запроса и методами которые позволяют их "использовать"(извлекать- fetch_assoc(), num_rows и т.д.) и всё это надо к чемуто присвоить , типа :
$result = $db->query('insert . . . ' );
После того как он ненужен , его "самоликвидуруют" спомощью внутреннего метода free() : "$result->free();" --- типа , удаляют возвращенный объект(из БД) - очистить память.

Если я не правильно задаю вопрос , то - извините , буду внимательнее.
Если я что то не так выучил - скажите и я начну заново изучать ООП (честно сказать так не хочется Хм ).
Да , кстати, не думаю что бы чем то координально отличались способы обращения к БД - объектный или с использованием функций.

(Отредактировано автором: 17 Июня, 2009 - 19:02:10)

 
 Top
JustUserR
Отправлено: 17 Июня, 2009 - 19:14:58
Post Id



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


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


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




aldan8 Вопервых всетаки mysqli не всегда автоматически подключается и не при всех конфигурацях (У меня он по умолчанию не подключается)
Вовторых хоть внутренностей сего класса я не знаю но зато знаю что при работе с mysqli есть два способа работы - ООПшный и процедурный (Как я привел в примерах внутри класса)
Так вот такое ощущение что вы смшиваете это два стиля и посему не работает
Что будет если сделать mysqli_free_result($result)
И кстати нельзя отвечать что хоть сий класс встроенный - в разных версия он может бытьт разный и вероятно с глюкомс в какойто версии (Урра - можно послать багрепорт разработчикам сего модуля Улыбка)


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB