За последние 24 часа нас посетили 15527 программистов и 1610 роботов. Сейчас ищет 871 программист ...

Глюки с классами

Тема в разделе "PHP для новичков", создана пользователем wir_wolf, 9 ноя 2010.

  1. wir_wolf

    wir_wolf Активный пользователь

    С нами с:
    10 янв 2009
    Сообщения:
    183
    Симпатии:
    0
    Здравствуйте, пишу класс работы с базой данный MySQL.
    Вот сам класс
    PHP:
    1. <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
    2. /**
    3.  *
    4.  *
    5.  *
    6.  * @package     Database
    7.  * @subpackage  Libraries
    8.  * @category    Libraries
    9.  * @author      wir_wolf
    10.  * @link        wir_wolf.org.ua
    11.  */
    12. class db {
    13.     var $db_config      = array();
    14.     //var $mySQL;
    15.  
    16.     function db(){
    17.         log_message('DEBUG',"Database Class Initialized");
    18.         require_once(BASEPATH.'config/database'.EXT);
    19.         if ( ! isset($db) OR count($db) == 0)
    20.         {
    21.             show_error('No database connection settings were found in the database config file.');
    22.         }
    23.         else
    24.         {
    25.             $this->db_config = $this->set_conf_db($db, 'default', 'ALL');
    26.         }
    27.         var_dump($this);
    28.         include_once(BASEPATH.'database/DB'.EXT);
    29.         //$this->mySQL = new Core_DB();
    30.         return true;
    31.     }
    32.    
    33.     function database($params = '', $return = FALSE, $couf_ = FALSE)
    34.     {
    35.         echo 'dkk';
    36.        
    37.     }
    38.     // --------------------------------------------------------------------
    39.     /**
    40.      * Задаем имя базы
    41.      *
    42.      * @access  public
    43.      * @return  string
    44.      */
    45.     function set_database($name = '')
    46.     {
    47.         echo 'wertyui';
    48.     }
    49.     // --------------------------------------------------------------------
    50.     /**
    51.      * Load the Database Forge Class
    52.      *
    53.      * @access  public
    54.      * @return  string
    55.      */
    56.     function set_conf_db($database = '', $group)
    57.     {
    58.         $this->db_config = $database[$group];
    59.         var_dump($this);
    60.     }
    61.    
    62.     function query($value = ''){
    63.         var_dump($this->conn_id);
    64.         if($db_config['pconnect'] == TRUE){
    65.             $sql = mysql_escape_string($value);
    66.         }
    67.     //  mysql_query();
    68.     }
    69.    
    70.  
    71.  
    72. }
    73.  
    74.  
    75. ?>
    И у меня 2 непонятки.
    1) с функцией set_conf_db, она себя как то по странному ведет.
    Когда я пишу после строки $this->db_config = $database[$group]; var_dump($this)то все нормально.
    Код (Text):
    1.  
    2. object(db)#2 (1) {
    3.   ["db_config"]=>
    4.   array(11) {
    5.     ["hostname"]=>
    6.     string(9) "localhost"
    7.     ["username"]=>
    8.     string(0) ""
    9.     ["password"]=>
    10.     string(0) ""
    11.     ["database"]=>
    12.     string(0) ""
    13.     ["dbdriver"]=>
    14.     string(5) "mysql"
    15.     ["dbprefix"]=>
    16.     string(0) ""
    17.     ["pconnect"]=>
    18.     bool(true)
    19.     ["db_debug"]=>
    20.     bool(true)
    21.     ["cache_sql"]=>
    22.     bool(false)
    23.     ["cachedir"]=>
    24.     string(0) ""
    25.     ["dbcollat"]=>
    26.     string(15) "utf8_general_ci"
    27.   }
    28. }
    а когда пишу после $this->db_config = $this->set_conf_db($db, 'default', 'ALL'); то вижу
    Код (Text):
    1. object(db)#2 (1) { ["db_config"]=> NULL }
    в чем прабл не могу понять=((
    2)По каким то непонятным причинам когда я после include_once(BASEPATH.'database/DB'.EXT); строку $this->mySQL = new Core_DB();(Объявляю класс который инклюдится) То скрипт зависает на 60 сек после чего скрипт мне выдает мол время ожидание от сервера истекло=(
    В логах скрпита вижу следующее.
    Код (Text):
    1. DEBUG- 09-11-2010 11:02:46 --> Database Class Initialized
    и так много раз. За один раз лог файл с нуля превращается в 27 мб. в чем прабл?
     
  2. Johnatan

    Johnatan Активный пользователь

    С нами с:
    6 мар 2008
    Сообщения:
    508
    Симпатии:
    0
    Адрес:
    Испания
    0) Вам обязательно изобретать велосипед? Это просто невероятно необходимо? Безопасностью, например? Или умопомрачительной высокой производительностью класса? PDO, например, никак не вписывается в ваши требования? Ну или хотя бы mysqli.

    1) У вас функция set_conf_db принимает только 2 параметра, а вы передаёте 3.

    2) Я телепатически догадался, что у вас проблема в коде класса Core_DB.
     
  3. wir_wolf

    wir_wolf Активный пользователь

    С нами с:
    10 янв 2009
    Сообщения:
    183
    Симпатии:
    0
    class Core_DB
    PHP:
    1. <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
    2.  
    3. /**
    4.  *
    5.  *
    6.  */
    7. class Core_DB extends db {
    8.     var $conn_id;
    9.     var $hostname       = "";
    10.     var $username       = "";
    11.     var $password       = "";
    12.     var $database       = "";
    13.     var $dbprefix       = "";
    14.     var $delete_hack    = "";
    15.         var $port                   = "";
    16.  
    17.     /*Иницыализирует переменные*/
    18.     function initialize($config=array()){
    19.         /*если не передано значение */
    20.         if(!count($config)){return false;}
    21.         foreach ($config as $key => $val)
    22.         {
    23.             $this->$key = $val;
    24.         }
    25.     }
    26.     function db_connect()
    27.     {
    28.         if ($this->port != '')
    29.         {
    30.             $this->hostname .= ':'.$this->port;
    31.         }
    32.         $this->conn_id = @mysql_connect($this->hostname, $this->username, $this->password, TRUE);
    33.         return true;
    34.     }
    35.     /*Коннект постоянный*/
    36.     function db_pconnect()
    37.     {
    38.         if ($this->port != '')
    39.         {
    40.             $this->hostname .= ':'.$this->port;
    41.         }
    42.         $this->conn_id = @mysql_pconnect($this->hostname, $this->username, $this->password);
    43.         return TRUE;
    44.     }
    45.     /*Переподключает*/
    46.     function reconnect()
    47.     {
    48.         if (mysql_ping($this->conn_id) === FALSE)
    49.         {
    50.             $this->conn_id = FALSE;
    51.             $this->db_connect();
    52.         }
    53.     }
    54.     /**
    55.      * Version number query string
    56.      *
    57.      * @access  public
    58.      * @return  string
    59.      */
    60.     function _version()
    61.     {
    62.         return "SELECT version() AS ver";
    63.     }
    64.    
    65.     function _execute($sql)
    66.     {
    67.         $sql = $this->_prep_query($sql);
    68.         return @mysql_query($sql, $this->conn_id);
    69.     }
    70.  
    71.     /**
    72.      * Prep the query
    73.      *
    74.      * If needed, each database adapter can prep the query string
    75.      *
    76.      * @access  private called by execute()
    77.      * @param   string  an SQL query
    78.      * @return  string
    79.      */
    80.     function _prep_query($sql)
    81.     {
    82.         // "DELETE FROM TABLE" returns 0 affected rows This hack modifies
    83.         // the query so that it returns the number of affected rows
    84.         if ($this->delete_hack === TRUE)
    85.         {
    86.             if (preg_match('/^\s*DELETE\s+FROM\s+(\S+)\s*$/i', $sql))
    87.             {
    88.                 $sql = preg_replace("/^\s*DELETE\s+FROM\s+(\S+)\s*$/", "DELETE FROM \\1 WHERE 1=1", $sql);
    89.             }
    90.         }
    91.  
    92.         return $sql;
    93.     }
    94.    
    95.     /**
    96.      * The error message string
    97.      *
    98.      * @access  private
    99.      * @return  string
    100.      */
    101.     function _error_message()
    102.     {
    103.         return mysql_error($this->conn_id);
    104.     }
    105.  
    106.     // --------------------------------------------------------------------
    107.  
    108.     /**
    109.      * The error message number
    110.      *
    111.      * @access  private
    112.      * @return  integer
    113.      */
    114.     function _error_number()
    115.     {
    116.         return mysql_errno($this->conn_id);
    117.     }
    118.  
    119.     // --------------------------------------------------------------------
    120.     /**
    121.      * Escape String
    122.      *
    123.      * @access  public
    124.      * @param   string
    125.      * @param   bool    whether or not the string will be used in a LIKE condition
    126.      * @return  string
    127.      */
    128.     function escape_str($str, $like = FALSE)
    129.     {
    130.         if (is_array($str))
    131.         {
    132.             foreach($str as $key => $val)
    133.             {
    134.                 $str[$key] = $this->escape_str($val, $like);
    135.             }
    136.  
    137.             return $str;
    138.         }
    139.  
    140.         if (function_exists('mysql_real_escape_string') AND is_resource($this->conn_id))
    141.         {
    142.             $str = mysql_real_escape_string($str, $this->conn_id);
    143.         }
    144.         elseif (function_exists('mysql_escape_string'))
    145.         {
    146.             $str = mysql_escape_string($str);
    147.         }
    148.         else
    149.         {
    150.             $str = addslashes($str);
    151.         }
    152.  
    153.         // escape LIKE condition wildcards
    154.         if ($like === TRUE)
    155.         {
    156.             $str = str_replace(array('%', '_'), array('\\%', '\\_'), $str);
    157.         }
    158.  
    159.         return $str;
    160.     }
    161. }
    162.  
    163. ?>
    А по поводу функции, то пофиксил, и без результата=(
     
  4. Johnatan

    Johnatan Активный пользователь

    С нами с:
    6 мар 2008
    Сообщения:
    508
    Симпатии:
    0
    Адрес:
    Испания
    $this->db_config = $this->set_conf_db($db, 'default', 'ALL');

    Ваша функция ничего не возвращает (NULL). А присвоение происходит внутри функции. Таким образом вы сначала присваиваете правильное значение, а потом NULL. Либо делайте return и присваивайте снаружи, либо уберите присвоение возврата функции свойству.

    Про Core_DB... Какая страшная рекурсия.. И зачем вы объявляете класс внутри класса вызывая дочерний класс?
     
  5. wir_wolf

    wir_wolf Активный пользователь

    С нами с:
    10 янв 2009
    Сообщения:
    183
    Симпатии:
    0
    Вот блин, такую элементарную ошибку не заметил.
    А по поводу объявлений, мне нужно будет управлять переменными класса Core_DB
     
  6. Johnatan

    Johnatan Активный пользователь

    С нами с:
    6 мар 2008
    Сообщения:
    508
    Симпатии:
    0
    Адрес:
    Испания
    Мне кажется вы напутали всё-таки там с взаимодействием классов. У вас получается рекурсия вызова классов и бесконечно создаются новые объекты, вот скрипт и виснет. Вам нужно четко разобраться зачем вам такая паутина. Должно быть достаточно одного дочернего класса, так как он наследует всё от предка.
     
  7. ridraider

    ridraider Активный пользователь

    С нами с:
    23 окт 2010
    Сообщения:
    65
    Симпатии:
    0
    DbSimple поддержка плейсхолдеров