ФорумПрограммированиеPHP для идиотовPHP и ООП → непонятки с ООП

непонятки с ООП

  • VaseninM

    Сообщения: 2416 Репутация: N Группа: Адекваты

    Spritz Фев. 10, 2010, 4:54 п.п., спустя 4 минуты 50 секунд

    рhpdude, phpdude, воистину неделя дуда))))
    рhpdude, тот, что Артеду. Так я с реальной и ебусь. Более того, мн за нее еще и деньги платят гы)
  • artoodetoo

    Сообщения: 5147 Репутация: N Группа: в ухо

    Spritz Фев. 10, 2010, 4:55 п.п., спустя 58 секунд

    тогда не торопись ;) пусть платят
    ιιlllιlllι унц-унц
  • VaseninM

    Сообщения: 2416 Репутация: N Группа: Адекваты

    Spritz Фев. 10, 2010, 5:45 п.п., спустя 50 минут 31 секунду

    artedooo, :)
    Платят мне за факт сделанной работы. Но ООП то надо учить ка нибудь =)
    PS Посмотрите бегло упрощенный класс для работы с БД. Коннект, дисконект, выполнение запросов и настройки базы собирает с движков. Выполнять селекты мне будет не надо. Видимо только инсерт и апдейт. Если что - допишу еще. Не проблема. Мне главное узнать на сколько это правильно с точки зрения ооп. Ну и послушать, как дуд меня обосрет :D
    <?php
    class DB // Класс работы с базой данных
    {
    	// Объявление членов класса
    	protected $cms="";
    	protected $id="";
    	public $pref="";
    	protected $link="";
    	protected $host="";
        protected $user="";
    	protected $pass="";
    	protected $base="";
    	
    	// Тут подключаемся к базе выбранной кмс.
    	public function __construct($cms = "DLE") 
    	{
    		$this->cms = (strtoupper($cms) == "DLE") ? strtoupper($cms) : "SE";
    		$this->connect();
    	}
    	
    	// Тут закроем соединение с базой.
    	public function __destructor() 
    	{
    		$this->disconnect();
    	}
    	
    	// Коннект к базе
    	private function connect () 
    	{
    		$this->config();
    		$this->id = mysql_connect($this->host, $this->user, $this->pass);
    		if (!$this->id) throw new Exception ("Не удалось подключится к базе.");
    		if (!mysql_select_db($this->base, $this->id)) throw new Exception ("Не удалось найти выбранную базу данных");
    		$this->query("SET NAMES " . $this->charset . ";");
    	}
    	
    	// Закрытие соедиения с базой
    	private function disconnect () 
    	{
    		if(mysql_close($this->id)) throw new Exception ("Не удалось закрть соединение с базой.");
    	}
    	
    	// Извлекаемм настройки подключения к базе.
    	private function config () 
    	{
    		if ($this->cms == 'DLE')
    		{
    			if (!require_once ("engine/data/dbconfig.php")) throw new Exception ("Не удалось найти файл конфигурации DLE.");
    			$this->host = DBHOST;
    			$this->user = DBUSER;
    			$this->pass = DBPASS;
    			$this->base = DBNAME;
    			$this->charset = COLLATE;
    			$this->pref = PREFIX . "_";
    			
    		}
    		elseif ($this->cms == 'SE')
    		{
    			if (!require_once (SE_FOLDER . "/include/database_config.php")) {throw new Exception ("Не удалось найти файл конфигурации SE.");}
    			$this->host = $database_host;
    			$this->user = $database_username;
    			$this->pass = $database_password;
    			$this->base = $database_name;
    			$this->pref = "se_";
    			$this->charset = "UTF8";
    		}
    	}
    	
    	// Выполение запросов
    	public function query ($query) 
    	{
    		if (!$this->id) throw new Exception ('Вы не были подключены к базе.');
    		if (!$this->link = mysql_query ($query, $this->id)) throw new Exception ("Не удалось выполнить запрос. Ошибка: ".mysql_error($this->id));
    		return $this->link;
    	}
    	
    	// Уничтожаем объект в духе ООП :)
    	public function destroy() 
    	{
    		unset($this);
    	}
    }
    ?>
  • NRG

    Сообщения: 4761 Репутация: N Группа: в ухо

    Spritz Фев. 10, 2010, 6:32 п.п., спустя 46 минут 42 секунды

    if(mysql_close($this->id)) throw new Exception ("Не удалось закрть соединение с базой.");

    ниче странного не замечаешь ?
    Спустя 79 сек.
    + у тебя есть метод query()
    а где же метод fetch() ?
  • VaseninM

    Сообщения: 2416 Репутация: N Группа: Адекваты

    Spritz Фев. 10, 2010, 6:37 п.п., спустя 4 минуты 39 секунд

    Я не сразу вспомнил, что мне нужен фетч. Когда код кидал - думал, что будут только insert запросы делать. fetch напишу.
    Странность пропустил. Спасибо.
  • NRG

    Сообщения: 4761 Репутация: N Группа: в ухо

    Spritz Фев. 10, 2010, 6:39 п.п., спустя 2 минуты 48 секунд

    + зачем в методе query() проверка линка ?
    у тебя в конструкторе он уже проверяется
    Спустя 108 сек.
    ну и самое главное,
    у тебя по всему проекту должна быть только одна сущность твоего обьекта DB.
    ну или столько, сколько баз одновременно используется в проекте
  • VaseninM

    Сообщения: 2416 Репутация: N Группа: Адекваты

    Spritz Фев. 10, 2010, 6:46 п.п., спустя 6 минут 41 секунду

    2 базы используется одновременно. Их можно конечно по очереди, но пожалуй это не удобно будет.
    проверка в методе query() - следствие дебага). Удалю.
  • VaseninM

    Сообщения: 2416 Репутация: N Группа: Адекваты

    Spritz Фев. 10, 2010, 7:03 п.п., спустя 17 минут 8 секунд

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

    NRG, я не очень понял то, что ты этим хотел сказать. Это какой то недостаток? Проверка нужна?
  • adw0rd

    Сообщения: 22959 Репутация: N Группа: в ухо

    Spritz Фев. 10, 2010, 7:05 п.п., спустя 1 минуту 41 секунду

    SpartakuS, страшная у тебя аватарка, есть фото получше?
    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • VaseninM

    Сообщения: 2416 Репутация: N Группа: Адекваты

    Spritz Фев. 10, 2010, 7:10 п.п., спустя 5 минут 32 секунды

    adw0rd, да она реально страшная. Я с разбитым еблом, пьяный в хлам и не помнящий всего действия происходящего там.
    Ну а вообще я на фото плохо получаюсь и норм фотки у меня только по синей теме. =) Ну посмотрю. Может что еще поставлю)
  • adw0rd

    Сообщения: 22959 Репутация: N Группа: в ухо

    Spritz Фев. 10, 2010, 7:12 п.п., спустя 1 минуту 14 секунд

    Спасибо :)
    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • NRG

    Сообщения: 4761 Репутация: N Группа: в ухо

    Spritz Фев. 10, 2010, 7:15 п.п., спустя 3 минуты 2 секунды


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

    NRG, я не очень понял то, что ты этим хотел сказать. Это какой то недостаток? Проверка нужна?
    я хотел сказать, что он должен быть синглтоном
    Спустя 164 сек.
    я твой класс вижу приблизительно таким

    <?php
    
    class NRG_Mysql
    {
    	/**
    	 * Host to connect
    	 */
    	protected $_host = 'localhost';
    	
    	/**
    	 * Database user
    	 */
    	protected $_user = 'root';
    	
    	/**
    	 * User password
    	 */
    	protected $_pswd = '';
    	
    	/**
    	 * Port number
    	 */
    	protected $_port = 3306;
    	
    	/**
    	 * Database name
    	 */
    	protected $_database = 'trunk';
    	
    	/**
    	 * Mysql link identifier
    	 */
    	private $_linkIdentifier;
    	
    	/**
    	 * 
    	 */
    	public function __construct()
    	{
    		try {
    			$this->_linkIdentifier = @mysql_connect($this->_host . ':' . $this->_port, $this->_user, $this->_pswd);
    			if (!$this->_linkIdentifier){
    				throw new Exception('Can\'t connect to host: ' . $this->_host);
    			}
    			if (!mysql_select_db($this->_database, $this->_linkIdentifier)) {
    				throw new Exception('Can\'t use database: ' . $this->_database);
    			}
    		} catch (Exception $e) {
    			echo '<b>Caught exception:</b> ' . $e->getMessage();
    		}
    	}
    	
    	/**
    	 * Execute Query
    	 *
    	 * @param string $sql
    	 * @return NRG_Mysql
    	 */
    	public function query($sql)
    	{
    		$this->_queryResult = mysql_query($sql, $this->_linkIdentifier);
    		return $this;
    	}
    	
    	/**
    	 * Fetch query result by specified type
    	 *
    	 * @param string $type
    	 * @return mixed
    	 */
    	public function fetch($type = 'row')
    	{
    		$fetchFunction = 'mysql_fetch_' . $type;
    		return $fetchFunction($this->_queryResult);
    	}
    }
    


    зы: не приебыватся, накидал на скорую руку, может и не работать, и пару методов упустил =)
  • NRG

    Сообщения: 4761 Репутация: N Группа: в ухо

    Spritz Фев. 10, 2010, 7:22 п.п., спустя 7 минут 12 секунд

    и еще одно , твой класс DB не должен вообще ничего знать о существовании каких либо цмс или чтотам у тебя в методе config() ….
    ты всеголишь должен сделать чтото типа NRG::getModel('core/config')->getDatabaseSettings();
    а вот твоя модель конфига уже сама разбирается какие парметры для соединения отдавать
  • VaseninM

    Сообщения: 2416 Репутация: N Группа: Адекваты

    Spritz Фев. 10, 2010, 7:31 п.п., спустя 8 минут 44 секунды

    NRG, на счет последнего действительно упустил момент.
    И вот вопрос. Как лучше?
    В конструкте вызвать метод коннект или прямо там сделать код подключения? Или все равно?
  • NRG

    Сообщения: 4761 Репутация: N Группа: в ухо

    Spritz Фев. 10, 2010, 7:46 п.п., спустя 15 минут 34 секунды

    коннект к базе делай в конструкторе
    если вынесешь сам коннект в отдельный метод а его вызовешь в конструкторе то ниче страшного

Пожалуйста, авторизуйтесь, чтобы написать комментарий!