Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Интернет » Web-программирование » PHP классы

Модерирует : Cheery

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2

Открыть новую тему     Написать ответ в эту тему

DarkSmoke



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Добрый день.
Пишу код

Код:
 
class DB
{
    var $link;
    var $server;
    var $username;
    var $password;
    var $database_name;
 
    function  __construct($server, $username, $password, $database_name)
    {
        $this->server = $server;
        $this->username = $username;
        $this->password = $password;
        $this->database_name = $database_name;
 
        $this->link = mysql_connect($this->server, $this->username, $this->password) or die ('Не могу подключится к БД.');
        mysql_select_db($this->database_name, $this->link);
 
        return $this->link;
    }
 
    public function FetchAll($query)     #<---- Строка 24
    {
        $result = mysql_query($query);
 
        if (mysql_num_rows($result) == 0) { echo 'Net'; }   # <---- строка 28
 
        while ($row = mysql_fetch_array($result, MYSQL_ASSOC))  # <---- строка 30
        {
            $array[] = $row;
        }
 
        return $array;
    }
}
 
$link = new DB('localhost','zf','123456','zf');
 
$a = $link->FetchAll("SELECT * FROM `rob`");  #<---- строка 53
print_r($a);
 

выдает ошибку  

Цитата:
Warning: Missing argument 1 for DB::FetchAll(), called in Z:\home\mvc\www\index.php on line 53 and defined in Z:\home\mvc\www\index.php  on line 24
 
Warning: mysql_num_rows() expects parameter 1 to be resource, boolean given in Z:\home\mvc\www\index.php on line 28
Net
Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in Z:\home\mvc\www\index.php on line 30

Всего записей: 962 | Зарегистр. 08-10-2005 | Отправлено: 16:37 04-05-2010
pavluha



Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
1. В классе для 5ой версии php используются в качестве определений переменных var - это пережиток 4ки. Надо использовать public,private, protected.
2. Зачем вы в конструкторе возвращаете указатель на соединение (return $this->link) - этого делать не надо.
3. Зачем вы храните указатель на соединение с БД если вы его не используете в последующем коде -  FetchAll - mysql_query. Используйте его в этой функции.
4. Условие с mysql_num_rows ни к чему не приводит. Бессмысленная проверка - т.к. после нее все равно происходит дальнейшая обработка, даже если запрос ничего не вернул. Логичнее было бы mysql_num_rows присвоить значение переменной проверить не возвращает ли она 0 - если так то завершить работу функции.
 
P.S. Данный код выполнился у меня на 5.2.9 без ошибок.

Всего записей: 366 | Зарегистр. 01-04-2003 | Отправлено: 17:26 04-05-2010
Tyman



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
P.S. Данный код выполнился у меня на 5.2.9 без ошибок.  

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

Всего записей: 67 | Зарегистр. 11-11-2003 | Отправлено: 17:33 04-05-2010
pavluha



Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

Цитата:
А тут то ошибок, как таковых и нет, только предупреждения, о том что передается не ресурс, а булев тип.  

Я имел ввиду что никаких сообщений - erorr,warning,notice.

Всего записей: 366 | Зарегистр. 01-04-2003 | Отправлено: 17:40 04-05-2010
Tyman



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Да у него просто таблицы `rob` не существует.
Надо же писать

Код:
$result = mysql_query($query) or die('Ошибка: ' . mysql_error());

А не

Код:
$result = mysql_query($query);

Всего записей: 67 | Зарегистр. 11-11-2003 | Отправлено: 18:24 04-05-2010 | Исправлено: Tyman, 18:28 04-05-2010
pavluha



Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

Цитата:
Да у него просто таблицы `rob` не существует.

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

Цитата:
$result = mysql_query($query) or die('Ошибка: ' . mysql_error());

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

Код:
 
if($result) {
   //код
}
 

так как не всегда хорошо просто останавливать выполнение скрипта в середине.

Всего записей: 366 | Зарегистр. 01-04-2003 | Отправлено: 18:29 04-05-2010 | Исправлено: pavluha, 18:38 04-05-2010
DarkSmoke



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

Цитата:
2. Зачем вы в конструкторе возвращаете указатель на соединение (return $this->link) - этого делать не надо.

А как тогда будет идентификатор будет идти дальше в код?
 

Всего записей: 962 | Зарегистр. 08-10-2005 | Отправлено: 19:13 04-05-2010
Tyman



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Заглянем в ман?

Код:
resource mysql_query  (  string $query  [,  resource $link_identifier  ] )

 
link_identifier
 
The MySQL connection. If the link identifier is not specified, the last link opened by mysql_connect() is assumed. If no such link is found, it will try to create one as if mysql_connect() was called with no arguments. If no connection is found or established, an E_WARNING level error is generated.

Всего записей: 67 | Зарегистр. 11-11-2003 | Отправлено: 19:41 04-05-2010
pavluha



Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

Цитата:
А как тогда будет идентификатор будет идти дальше в код?  

вообще то как я писал выше - вы используете в классе переменную var $link; - которую надо правильно определить :
Код:
public $link

либо же private or protected в зависимости от надобностей.
Если в пределах класса, то к ней обращаться можно $this->link - если нужно получить в не класса - то $link->link  
либо же как писал Tyman если идентификатор не указывается ручками - то функции используют последние созданное соединение, либо же пытаются соединиться сами - с пустыми значениями по умолчанию.
 
 

Всего записей: 366 | Зарегистр. 01-04-2003 | Отправлено: 19:55 04-05-2010 | Исправлено: pavluha, 20:16 04-05-2010
modja

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Здравствуйте, помогите мне пожалуйста исправить ошибки на сайте.
 
Строка ошибка в логах сайта, так как я отключил показ ошибок в функциях пхп:
 

Цитата:
1    Warning: mysql_error() expects parameter 1 to be resource, boolean given in /home/public_html/admin/inc/db.php on line 439

 
Кусок кода из этого файла пометил красным:
 

Код:
 
//print $sql.'<br><br>';
     
      if($this->connection->dbtype=='mssql')
      { ob_start();
          $this->res = mssql_query($sql, $this->connection->connection);
          if(!$this->res) add_error('mssql_query()', var_export(mssql_get_last_message(!$this->res), true).'<br />SQL: '.$sql);
        ob_clean();
 
      }elseif($this->connection->dbtype=='mysql')
      { ob_start();
          $this->res = mysql_query($sql, $this->connection->connection);
          if(!$this->res) add_error('mysql_query()', var_export(mysql_error($this->res), true).'<br />SQL: '.$sql);
        ob_clean();
 
      }elseif($this->connection->dbtype=='oracle')
      {

 
 
 
Кстати, в админке есть функция просмотра ошибок системых функций и там такое сообщение постоянно:

Код:
Warning: mysql_query(): NULL
SQL: select if(val=0,'',concat(' (',val,')')) as val from(select (select count(*) from foto_comment where is_enabled=0) + (select count(*) from foto where is_enabled=0) as val from dual ) t
1    [07-Apr-2014 18:33:13]
2    Warning: mysql_error() expects parameter 1 to be resource, boolean given in /home/public_html/admin/inc/db.php on line 439

 
Спасибо!

Всего записей: 86 | Зарегистр. 29-05-2006 | Отправлено: 18:42 07-04-2014 | Исправлено: modja, 18:49 07-04-2014
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
modja
потому, что  
mysql_error($this->connection->connection)

----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 18:45 07-04-2014
modja

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Cheery, спасибо. нужно мне убрать дублирующее connection ? )

Всего записей: 86 | Зарегистр. 29-05-2006 | Отправлено: 18:50 07-04-2014
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
modja

Цитата:
нужно мне убрать дублирующее connection

это не дублирующее.


----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 18:51 07-04-2014
modja

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Перед тем, как писать на форуме я искал в поисковиках причину.. но код древний и аналогичных решений не нашел. Может я не правильно задаю вопрос? Глубоких знаний нет в программировании, поэтому прошу о помощи, как исправить ошибку.

Всего записей: 86 | Зарегистр. 29-05-2006 | Отправлено: 18:59 07-04-2014
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
modja
я же написал вам что сделать, в чем проблема то?
 
вместо

Цитата:
if(!$this->res) add_error('mysql_query()', var_export(mysql_error($this->res), true).'<br />SQL: '.$sql);

 
должно быть

Цитата:
if($this->res === false) add_error('mysql_query()', var_export(mysql_error($this->connection->connection), true).'<br />SQL: '.$sql);

 
первое выделенное, в принципе, необязательно.

----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 19:00 07-04-2014 | Исправлено: Cheery, 19:01 07-04-2014
modja

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Дай Бог вам благо!  
Понял теперь)) до жирафа долго доходит) решена ошибка с пхп.
 
Остается вот эта:

Код:
Warning: mysql_query(): 'Unknown column 'is_enabled' in 'where clause''
SQL: select if(val=0,'',concat(' (',val,')')) as val from(select (select count(*) from foto_comment where is_enabled=0) + (select count(*) from foto where is_enabled=0) as val from dual ) t

Ошибки создаются именно когда перехожу по разделам в админке сайта.

Всего записей: 86 | Зарегистр. 29-05-2006 | Отправлено: 19:14 07-04-2014
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
modja

Цитата:
 'Unknown column 'is_enabled' in 'where clause''

ну так ясно сказано - в таблице foto (или в foto_comment, а может и там и там) нет столбца is_enabled

----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 19:16 07-04-2014 | Исправлено: Cheery, 19:16 07-04-2014
modja

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
От души!!!! Вы не представляете, как Вы мне сильно помогли, как всегда Cheery вы супер! Благодарю!

Всего записей: 86 | Зарегистр. 29-05-2006 | Отправлено: 01:35 08-04-2014
modja

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Здравствуйте, у меня снова возникли проблемы на сайте, как только хостер сменил пхп веерсию.
 
Проблема при парсере новостей из рсс источников.
 

Код:
Strict Standards: Only variables should be passed by reference in /home/public_html/parser/update_news.php on line 236 Notice: Undefined
 
$depth = count($this->tags);
list($parent, $num) = each($tmp = end($this->tags));
 if($parent) $this->tags[$depth-1][$parent][$tagname]++;
                }
 
--------------------
 index: CHANNEL in /home/public_html/parser/update_news.php on line 237 Notice: Undefined index: RSS in  
 
$depth = count($this->tags);
 list($parent, $num) = each($tmp = end($this->tags));
 if($parent) $this->tags[$depth-1][$parent][$tagname]++;
                }
 
--------------------
/home/public_html/parser/update_news.php(302) : eval()'d code on line 1 Notice: Undefined index: LINK in  
/home/public_html/parser/update_news.php(302) : eval()'d code on line 1 Notice: Undefined index: DESCRIPTION in
 /home/public_html/parser/update_news.php(302) : eval()'d code on line 1 Notice: Undefined index: LANGUAGE in  
/home/public_html/parser/update_news.php(302) : eval()'d code on line 1 Strict Standards: Only variables should be passed by reference in  
 
      # return if data contains no text
        if(!trim($data)) return;
        $evalcode = "\$this->output";
 
        foreach($this->tags as $tag)
        {
            if(is_array($tag))
            {
                list($tagname, $indexes) = each($tag);
                $evalcode .= "[\"$tagname\"]";
                if(@${$tagname})
                $evalcode .= "[" . (${$tagname} - 1) . "]";
                if(@$indexes)
                extract($indexes);
            }
            else
            {
                if(preg_match("/^([A-Z]+)[A-Z]+)$/U", $tag, $matches))
                {
                    $evalcode .= "[\"$matches[1]\"][\"$matches[2]\"]";
                }
                else
                {
                    $evalcode .= "[\"$tag\"]";
                }
            }
        }
        if(isset($this->encoding['CONTENT']) && $this->encoding['CONTENT'] == "text/plain") {
            $data = "<pre>$data</pre>";
        }
 
        eval("$evalcode = $evalcode . '" . addslashes($data) . "';");
 
    }
 
 
-------------------
 
/home/public_html/parser/update_news.php on line 236 Notice: Undefined index: ITEM in  
/home/public_html/parser/update_news.php on line 237 Notice: Undefined index: ITEM in
 
$depth = count($this->tags);
    
строка 236 list($parent, $num) = each($tmp = end($this->tags));
строка 237 if($parent) $this->tags[$depth-1][$parent][$tagname]++;

                }
 

 
 
После каждой ошибки привожу строчку кода.
 
Спасибо за любую помощь

Всего записей: 86 | Зарегистр. 29-05-2006 | Отправлено: 00:38 19-04-2014 | Исправлено: modja, 00:41 19-04-2014
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
modja

Цитата:
Notice: Undefined index: RSS

нет элемента с таким ключем в массиве.
по умолчанию эти сообщения отображаются и, следуя правилам языка, перед обращением к элементу массива следует проверить его существование.
можно сделать так, можно в настройках php или в скрипте отключить вывод этих сообщений.
можно "заглушить" вывод, поставив @ перед той переменной, в которой находится массив.
 

Цитата:
eval("$evalcode = $evalcode . '" . addslashes($data) . "';");  

eval вообще очень и очень плохая функция, не нужно так делать.
но ругается на то, что написано ниже и выше  - такие "ошибки" содержатся в строке, что передается функции eval
 

Цитата:
list($parent, $num) = each($tmp = end($this->tags));

перепишите как

Цитата:
$tmp = end($this->tags);
list($parent, $num) = each($tmp);


----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 00:41 19-04-2014 | Исправлено: Cheery, 00:44 19-04-2014
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2

Компьютерный форум Ru.Board » Интернет » Web-программирование » PHP классы


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru