Создал класс (ООП PHP5) для работы с БД MySQL - покритикуйте, похвалите

r4sh

Новичок
Не спорю что PDO не абстрагирует от субд. И часто задаюсь вопросом, почему нет до сих пор экстеншина, полностью абстрагирующего, однако это всетак лучше чем ничего, и как никак число своего кода позволит уменьшить.
 

zerkms

TDD infected
Команда форума
whirlwind, r4sh
смысл писать запросы, которые будут работать везде и тем самым забить на диалект/расширения SQL конкретной субд?

вы ведь не требуете от интерпретаторов/компиляторов ЯП универсальности уровня "я написал код на php, хочу чтобы он и gcc тоже компилировался"
 

whirlwind

TDD infected, paranoid
смысл использовать dbal, если ты используешь конкретный диалект? сразу в пользовательских классах религия юзать не позволяет?
 

zerkms

TDD infected
Команда форума
whirlwind
я его использую, потому что у него удобный интерфейс (повторяю уже в третий раз). потому что мне не нравится mysql_* и потому что при работе с mysql' и mssql'ными базами одновременно в одном проекте (или разных) я не хочу запоминать особенности "нативных" библиотек, аргументы, названия функций. итд итп.
 

whirlwind

TDD infected, paranoid
не, на самом деле, слабый аргумент конкретно от тебя :) вот если бы ты сказал, что тебе важно PDOStatement, я бы понял, что ты его mock и т.п. а так я делаю выводы, что все таки пдо для тебя это абстракция от маразма. Ну скажи, много мозгов надо, что бы дотумкать что субд это e.g. exec ?
 

zerkms

TDD infected
Команда форума
whirlwind
для меня PDO - абстракция от интерфейса, но не абстракция от диалекта.
я прекрасно представляю при работе с конкретным инстансом PDO что это mysql или mssql и помню особенности диалекта там и там.
всё абстрагировать ты не сможешь. ну будет там LIMIT на TOP с подзапросом подменяться, но останется куча субд-зависимых вещей, которые абстрагировать не получится по определению.
 

Krishna

Продался Java
почему ещё никто не сказал про PDO?
Для начала, скорее про mysqli, которой пытается подражать автор)

-~{}~ 24.09.09 04:35:

З.Ы.
PDO уже стоит юзать хотя бы ради плейсхолдеров, избавляющих от гемора с экранированием.
 

varan

Б̈́̈̽ͮͣ̈Л̩̲̮̻̤̹͓ДͦЖ̯̙̭̥̑͆А͇̠̱͓͇̾ͨД͙͈̰̳͈͛ͅ
4 - да, таки надо делать 2 отдельные функции (одну - для SELECT, другую - для остальных запросов, в которых не надо возвращать данные)
И еще одну - для возвращения единичного значения отдельного столбца (иногда нужно получить отдельное значение из таблицы)
По-моему ты не совсем понял, что я написал. Функция является "deprecated" - это когда функция исчезнет в будущих версиях php. В данном случае eregi исчезает, preg_match рулит.

А по поводу того, что написал, хочу сказать, что тебе стоит-таки попробовать поюзать Zend Framework или еще какой-нибудь framework; они все сплош ООП, и волей-неволей в мозгу начнет кое-что проясняться.
 

Volmir

Новичок
Автор оригинала: varan
По-моему ты не совсем понял, что я написал. Функция является "deprecated" - это когда функция исчезнет в будущих версиях php. В данном случае eregi исчезает, preg_match рулит.
Да. Я неправильно тебя понял.

А по поводу того, что написал, хочу сказать, что тебе стоит-таки попробовать поюзать Zend Framework или еще какой-нибудь framework; они все сплошь ООП, и волей-неволей в мозгу начнет кое-что проясняться.
Так и делаю сейчас. Качаю разные и смотрю внутреннюю структуру, примеры реализации и код включенных классов.
 

Beavis

Banned
+1 за DbSimple
не идеал конечно, но возможностей довольно много...
особенно радуют разнообразные плейсхолдеры и возможность сразу группировать данные по одному или нескольким полям
 

Alexandre

PHPПенсионер
$db = new db();
$db->connect();
я бы функцию коннект объединил бы с консруктором:
$db = new db( 'localhost' , 'myDb', 'guest', 3306);
если проект требует одновременного подключения нескольких серверов, то использовал бы фабрику:

$db1 = DbFactory.Create( 'db1.myhost.local' , 'myDb', 'guest', 3306 );
$db2 = DbFactory.Create( 'db2.myhost.local' , 'myDb', 'guest', 3306 );
 

Alexandre

PHPПенсионер
а я бы коннектился по требованию
а в чем разница? или пишем конструктор в одном методе - например, конструктор другого класса а конектимся в другом? не проще ли в этом же месте и написать коннект-конструктор

если есть в коде места коннект-дисконнект, то возможно и имеет место писать их раздельно. как правило - это исключение из правил.
 

fixxxer

К.О.
Партнер клуба
>>а я бы коннектился по требованию
>а в чем разница?

http://ibash.org.ru/quote.php?id=11195
 

Beavis

Banned
страниц через 20 будут сформулированы критерии идеального класса для работы с БД =)
 

Volmir

Новичок
Вопрос, как это сделать?

Есть такой метод, $db->getInstance(), которая позволяет раз соединиться с БД и потом передавать ссылку на это соединение, на этот объект.

В примере такое соединеие создается при помощи PDO:

PHP:
<php

class db {

	/**
	 * Holds an insance of self
	 * @var $instance
	 */
	private static $instance = NULL;


	/**
	*
	* Return DB instance or create intitial connection
	*
	* @return object (PDO)
	*
	* @access public
	*
	*/
	public static function getInstance()
	{
		if (!self::$instance)
		{
			$config = config::getInstance();
			$db_type = $config->config_values['database']['db_type'];
			$hostname = $config->config_values['database']['db_hostname'];
			$dbname = $config->config_values['database']['db_name'];
			$db_password = $config->config_values['database']['db_password'];
			$db_username = $config->config_values['database']['db_username'];
			$db_port = $config->config_values['database']['db_port'];
			$db_encoding = $config->config_values['database']['db_encoding'];

			$driver_options = array();
			if($db_type == 'mysql')
				$driver_options[PDO::MYSQL_ATTR_INIT_COMMAND] = 'SET NAMES '.$db_encoding;
			
			self::$instance = new PDO("$db_type:host=$hostname;port=$db_port;dbname=$dbname", $db_username, $db_password, $driver_options);
		}
		return self::$instance;
	}

?>
Соответственно, вызов соединения с БД в модели (модель не знает, открыто соедиение или нет):

PHP:
<?php
class newsModel extends db {
	private $db;
	
	public function __construct() {
		$this->db = db::getInstance(); // connect to database
	}

        // .....
?>

Вопрос: можно ли реализовать соединение с БД MySQL, записать это соединение в объект и потом отдавать его в методе getInstance().

Конструкция типа приведенной ниже, я так понимаю объекта не создаст:
PHP:
<php

class db {

	private static $instance = NULL;

	public static function getInstance()
	{
		if (!self::$instance)
		{

			self::$instance = mysql_select_db($db, mysql_connect($host,$user,$password)); 

		}
		return self::$instance;
	}

?>
Как записать в объект текущее соeдинение с БД MySQL (созданное функциями mysql_select_db(), mysql_connect() )?
 

zerkms

TDD infected
Команда форума
в статической переменной будет хандлер. вполне себе идентификатор соединения.
 
Сверху