Здравствуйте, пишу класс работы с базой данный MySQL. Вот сам класс PHP: <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); /** * * * * @package Database * @subpackage Libraries * @category Libraries * @author wir_wolf * @link wir_wolf.org.ua */ class db { var $db_config = array(); //var $mySQL; function db(){ log_message('DEBUG',"Database Class Initialized"); require_once(BASEPATH.'config/database'.EXT); if ( ! isset($db) OR count($db) == 0) { show_error('No database connection settings were found in the database config file.'); } else { $this->db_config = $this->set_conf_db($db, 'default', 'ALL'); } var_dump($this); include_once(BASEPATH.'database/DB'.EXT); //$this->mySQL = new Core_DB(); return true; } function database($params = '', $return = FALSE, $couf_ = FALSE) { echo 'dkk'; } // -------------------------------------------------------------------- /** * Задаем имя базы * * @access public * @return string */ function set_database($name = '') { echo 'wertyui'; } // -------------------------------------------------------------------- /** * Load the Database Forge Class * * @access public * @return string */ function set_conf_db($database = '', $group) { $this->db_config = $database[$group]; var_dump($this); } function query($value = ''){ var_dump($this->conn_id); if($db_config['pconnect'] == TRUE){ $sql = mysql_escape_string($value); } // mysql_query(); } } ?> И у меня 2 непонятки. 1) с функцией set_conf_db, она себя как то по странному ведет. Когда я пишу после строки $this->db_config = $database[$group]; var_dump($this)то все нормально. Код (Text): object(db)#2 (1) { ["db_config"]=> array(11) { ["hostname"]=> string(9) "localhost" ["username"]=> string(0) "" ["password"]=> string(0) "" ["database"]=> string(0) "" ["dbdriver"]=> string(5) "mysql" ["dbprefix"]=> string(0) "" ["pconnect"]=> bool(true) ["db_debug"]=> bool(true) ["cache_sql"]=> bool(false) ["cachedir"]=> string(0) "" ["dbcollat"]=> string(15) "utf8_general_ci" } } а когда пишу после $this->db_config = $this->set_conf_db($db, 'default', 'ALL'); то вижу Код (Text): object(db)#2 (1) { ["db_config"]=> NULL } в чем прабл не могу понять=(( 2)По каким то непонятным причинам когда я после include_once(BASEPATH.'database/DB'.EXT); строку $this->mySQL = new Core_DB();(Объявляю класс который инклюдится) То скрипт зависает на 60 сек после чего скрипт мне выдает мол время ожидание от сервера истекло=( В логах скрпита вижу следующее. Код (Text): DEBUG- 09-11-2010 11:02:46 --> Database Class Initialized и так много раз. За один раз лог файл с нуля превращается в 27 мб. в чем прабл?
0) Вам обязательно изобретать велосипед? Это просто невероятно необходимо? Безопасностью, например? Или умопомрачительной высокой производительностью класса? PDO, например, никак не вписывается в ваши требования? Ну или хотя бы mysqli. 1) У вас функция set_conf_db принимает только 2 параметра, а вы передаёте 3. 2) Я телепатически догадался, что у вас проблема в коде класса Core_DB.
class Core_DB PHP: <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); /** * * */ class Core_DB extends db { var $conn_id; var $hostname = ""; var $username = ""; var $password = ""; var $database = ""; var $dbprefix = ""; var $delete_hack = ""; var $port = ""; /*Иницыализирует переменные*/ function initialize($config=array()){ /*если не передано значение */ if(!count($config)){return false;} foreach ($config as $key => $val) { $this->$key = $val; } } function db_connect() { if ($this->port != '') { $this->hostname .= ':'.$this->port; } $this->conn_id = @mysql_connect($this->hostname, $this->username, $this->password, TRUE); return true; } /*Коннект постоянный*/ function db_pconnect() { if ($this->port != '') { $this->hostname .= ':'.$this->port; } $this->conn_id = @mysql_pconnect($this->hostname, $this->username, $this->password); return TRUE; } /*Переподключает*/ function reconnect() { if (mysql_ping($this->conn_id) === FALSE) { $this->conn_id = FALSE; $this->db_connect(); } } /** * Version number query string * * @access public * @return string */ function _version() { return "SELECT version() AS ver"; } function _execute($sql) { $sql = $this->_prep_query($sql); return @mysql_query($sql, $this->conn_id); } /** * Prep the query * * If needed, each database adapter can prep the query string * * @access private called by execute() * @param string an SQL query * @return string */ function _prep_query($sql) { // "DELETE FROM TABLE" returns 0 affected rows This hack modifies // the query so that it returns the number of affected rows if ($this->delete_hack === TRUE) { if (preg_match('/^\s*DELETE\s+FROM\s+(\S+)\s*$/i', $sql)) { $sql = preg_replace("/^\s*DELETE\s+FROM\s+(\S+)\s*$/", "DELETE FROM \\1 WHERE 1=1", $sql); } } return $sql; } /** * The error message string * * @access private * @return string */ function _error_message() { return mysql_error($this->conn_id); } // -------------------------------------------------------------------- /** * The error message number * * @access private * @return integer */ function _error_number() { return mysql_errno($this->conn_id); } // -------------------------------------------------------------------- /** * Escape String * * @access public * @param string * @param bool whether or not the string will be used in a LIKE condition * @return string */ function escape_str($str, $like = FALSE) { if (is_array($str)) { foreach($str as $key => $val) { $str[$key] = $this->escape_str($val, $like); } return $str; } if (function_exists('mysql_real_escape_string') AND is_resource($this->conn_id)) { $str = mysql_real_escape_string($str, $this->conn_id); } elseif (function_exists('mysql_escape_string')) { $str = mysql_escape_string($str); } else { $str = addslashes($str); } // escape LIKE condition wildcards if ($like === TRUE) { $str = str_replace(array('%', '_'), array('\\%', '\\_'), $str); } return $str; } } ?> А по поводу функции, то пофиксил, и без результата=(
$this->db_config = $this->set_conf_db($db, 'default', 'ALL'); Ваша функция ничего не возвращает (NULL). А присвоение происходит внутри функции. Таким образом вы сначала присваиваете правильное значение, а потом NULL. Либо делайте return и присваивайте снаружи, либо уберите присвоение возврата функции свойству. Про Core_DB... Какая страшная рекурсия.. И зачем вы объявляете класс внутри класса вызывая дочерний класс?
Вот блин, такую элементарную ошибку не заметил. А по поводу объявлений, мне нужно будет управлять переменными класса Core_DB
Мне кажется вы напутали всё-таки там с взаимодействием классов. У вас получается рекурсия вызова классов и бесконечно создаются новые объекты, вот скрипт и виснет. Вам нужно четко разобраться зачем вам такая паутина. Должно быть достаточно одного дочернего класса, так как он наследует всё от предка.