Православный коннект а базе данных

PHP:
Krugozor_Database_Mysql::create(
                        Krugozor_Registry::getInstance()->DATABASE['HOST'],
                        Krugozor_Registry::getInstance()->DATABASE['USER'],
                        Krugozor_Registry::getInstance()->DATABASE['PASSWORD']
                    )->setDatabaseName(Krugozor_Registry::getInstance()->DATABASE['NAME'])
                     ->setCharset(Krugozor_Registry::getInstance()->DATABASE['CHARSET']);
м?

PHP:
$db_config = Krugozor_Registry::getInstance()->DATABASE;
Krugozor_Database_Mysql::create(
                        $db_config['HOST'], 
                        $db_config['USER'], 
                        $db_config['PASSWORD']
                    )->setDatabaseName($db_config['NAME'])
                     ->setCharset($db_config['CHARSET']);
м!
 
craz
Это совершенно естественная реакция! потому что понятие проверки по белому списку - НОВОЕ для пхп разработчиков. При том, что оно ключевое для безопасности, когда мы работаем с именами полей и таблиц.
Ну конечно, когда я тебе рассказывал про модели, которые структуру таблицы проверяют, и что для этого и нужны всякие ->where($column, $operand, $value) — это же было совсем другое, ага.
 
Ад и багдад. Может проще взять все с конфига по индексу?
 
флоппик
Ну дык метод mysqli::query делает тоже самое только класс у него mysqli_result
Не вижу логики.
Его по другому не создать.
 
А еще можно вопрос, зачем все это пишут постоянно? Почему не использовать что-то готовое? Что ни у кого нет нормальной готовой библиотеки?

Причем постоянно это скатывается в обсуждении, что лучше, что понятнее, что безопаснее, и каждого свое мнение, и каждый берет и пишет свое. Тогда для кого кроме себя это все пишется?
 
Для себя и пишется, мышление и привычка работать с данными у всех разные... Кто-то все же осиливает и переползает с велосипедов на стандартные штуки с фреймворков.
 
Ну получается че Фанат не осилил? Ты сейчас разрушил мою вселенную...
 
А еще можно вопрос, зачем все это пишут постоянно? Почему не использовать что-то готовое?
Я на последний ДР клуба приехал с девушкой.
Она спросила, чем мы занимаемся вообще на работе.
Я говорю - ну, вот делаем новую фичу на сайте, потом смотрим, как она пошла, и переделываем, исправляем ошибки...
Она спрашивает - "а разве нельзя сразу хорошо сделать, чтобы потом не переделывать?".
Я пересказываю эту фразу Антохе, так он аж подпрыгнул - "Если она знает - как сделать сразу хорошо - пусть расскажет!!!"
;)
Так что одна проблема в том, что все развивается.

Вторая проблема в том, что все развивается слишком хорошо.

Жила была маленькая и супер-удобная программа для мгновенных сообщений, icq. её развивали-развивали, и доразвивали до непотребного монстра, которым никто не захотел пользоваться.
И тут на арену вышла маленькая и супер-удобная программа для мгновенных сообщений,qip. её развивали-развивали, и доразвивали до непотребного монстра, которым никто не захотел пользоваться.
Жила-была маленькая и супер-удобная СУБД mysql. её развивали-развивали, и доразвивали до состояния, когда маленькой её уже никак не назовёшь.
И тут на арену вышла маленькая СУБД sqlite....
Этот процесс вечен.
 
Ну получается че Фанат не осилил? Ты сейчас разрушил мою вселенную...
Во-первых, да, я с большим трудом осиливаю новое.
несколько раз подступался к yii, но то ли у нас пример плохой то ли я тупой, но стойко у меня вырабатывалось только чувство бешенства.
Во-вторых, меня не устраивают сучесвтующие решения. они всегда чудовищно громоздкие, и зачастую решают совсем не те задачи, которые надо решать. происходит подмена целей. классический пример - "Шаблонизатор нужен для того, чтобы изгнать пхп из хтмл". или вот prepared statements в драйверах БД - ни для защиты, ни для удобства они недостаточны
 
Во-первых, да, я с большим трудом осиливаю новое.
несколько раз подступался к yii, но то ли у нас пример плохой то ли я тупой, но стойко у меня вырабатывалось только чувство бешенства.
Во-вторых, меня не устраивают сучесвтующие решения. они всегда чудовищно громоздкие, и зачастую решают совсем не те задачи, которые надо решать. происходит подмена целей. классический пример - "Шаблонизатор нужен для того, чтобы изгнать пхп из хтмл". или вот prepared statements в драйверах БД - ни для защиты, ни для удобства они недостаточны
посмотри zf2) я хоть все эти DI понимаю только в теории, но ниче сижу разбираюсь.
 
Там другой подход.
По поводу заворачивания SQL в отдельные операторы типа select('name')->from('table')->where->addcondition() было обсуждение в топике с Amdy, возвращаться я к нему не хочу.
Возможно, я неправ, но такой подход, во-первых, не устраивает лично меня, а во-вторых, перетащить на него орду пыхапёров - задача нереальная.
инструмент должен быть ПРОСТЫМ.
причина бешеной популярности пыха -в простоте.
я хочу соблюсти максимальную простоту (можно назвать это близостью к говнокоду) при максимальной же безопасности
 
prepared statements в драйверах БД - ни для защиты, ни для удобства они недостаточны
Вообще, как бы, они нужны были, что бы в программах работающих с нормальным постоянным соединением не перестраивать план запроса при изменении данных. А то что они как побочный эффект адекватно позволяют передавать параметры без строкового экранирования спецсимволов — оно нечаянно получилось, и поскольку основная их цель в PHP не прижилась (и не сильно осмысленна)... получилось все как обычно, в общем.
 
Вот вам пример маленького и простого :)
Уложился в чуть меньше чем 200 строк с примерами, блек ждеком и прочими :).
Три класса, функцианал родителей не затронут, совсем цуть цуть.
Расширяйте допиливайте, делайте большое и громоздкое :)

PHP:
class SqlQuery {
	protected $sql = null;
	protected $query = null;
	protected $params = null;
	protected $preparedQuery = null;
	function __construct ($sql, $query = null, $params = null) {
		$this -> sql = $sql;
		$this -> query = $query;
		$this -> params = $params;
	}
	
	function replace_m ($m) {
		$res = array ();
		foreach ($m as $k => $v) {
			$k = str_replace (array ('`', '\\'), '', $k); //пофиксил
			$res [] = "`$k` = '" . $this -> sql -> escapeString ($v) . "'";
		}
		return join (',', $res);
	}
	
	function replace_a ($a) {
		return "'" . join ("','", array_map (array ($this -> sql, 'escapeString'), $a)) . "'";
	}
	
	protected function replace ($m) {
		if (isset ($m [1])) {
			if ($m [1] == '_') return $this -> sql -> getTablePreffix ();
			$f = 'replace_' . $m [1];
			if (method_exists ($this, $f))
				return $this -> $f (array_shift ($this -> params));
		}
		return $this -> sql -> escapeString (array_shift ($this -> params));
	}
	
	function setQuery ($q) {
		$this -> preparedQuery = null;
		$this -> query = $q;
	}
	
	function setParams ($p) {
		$this -> preparedQuery = null;
		$this -> params = $p;
	}
	
	function __toString () {
		if ($this -> preparedQuery == null)
			$this -> preparedQuery = preg_replace_callback ('~\?(m|a|_)?~', array ($this, 'replace'), $this -> query);
		return $this -> preparedQuery; 
	}
}

class Sql extends mysqli {
	protected static $instances = array ();
	static $config;
	protected $myConf;
	
	protected function __construct ($n) {
		$c = self::$config [$n];
		parent::__construct ($c ['host'], $c ['user'], $c ['password'], $c ['name']);
		$this -> myConf = $c;
	}
	
	function getTablePreffix () {
		return isset ($this -> myConf ['prefix']) ? $this -> myConf ['prefix'] : '';
	}
	
	static function getInstance ($c = 'default') {
		if (!isset (self::$instances [$c])) self::$instances [$c] = new self ($c);
		return self::$instances [$c];
	}
	
	function insert_id () {
		return $this -> insert_id;
	}
	
	function escapeString ($s) {
		return $this -> real_escape_string ($s);
	}
	
	function query ($q) {
		$args = func_get_args ();
		if (isset ($args [1])) {
			$o = new SqlQuery ($this, array_shift ($args), $args);
			$q = $o -> __toString ();
		}
		$qe = $this -> real_query ($q);
		return new SqlResult ($this, !$qe);
	}
	
	function run ($q) {
		$args = func_get_args ();
		if (isset ($args [1])) {
			$o = new SqlQuery ($this, array_shift ($args), $args);
			$q = $o -> __toString ();
		}
		return parent::query ($q);
	}
}

class SqlResult extends mysqli_result {
	protected $_queryError;

	function __construct ($sql, $queryError) {
		$this -> _queryError = $queryError;
		parent::__construct ($sql);
	}

	function num_rows () {
		if ($this -> _queryError) return 0;
		return $this -> num_rows;
	}

	function getRow () {
		if ($this -> num_rows () == 0) return false;
		$row = $this -> fetch_assoc ();
		$this -> free_result ();
		return $row;
	}

	function getArray () {
		if ($this -> num_rows () == 0) return false;
		$d = array ();
		while ($r = $this -> fetch_assoc ())
			$d [] = $r;
		$this -> free_result ();
		return $d;
	}

	function getMap ($key) {
		if ($this -> num_rows () == 0) return false;
		$keys = func_get_args ();
		if (is_array ($keys [0])) $keys = $keys [0];

		$d = array ();
		while ($row = $this -> fetch_assoc ()) {
			$ptr = &$d;
			foreach ($keys as $key) {
				if (!isset ($row [$key])) {
					$bt = debug_backtrace ();
					trigger_error ('Undefined index ' . $key . ' in result row: in ' . $bt [2] ['file'] . ' on line ' . $bt [2] ['line'] . "\n", E_USER_NOTICE);
				}
				if (!isset ($ptr [$row [$key]]))
					$ptr [$row [$key]] = null;
				$ptr = &$ptr [$row [$key]];
			}
			$ptr = $row;
		}
		$this -> free_result ();
		return $d;
	}

	function getCell () {
		if ($this -> num_rows () == 0) return false;
		$row = $this -> fetch_row ();
		$this -> free_result ();
		return $row [0];
	}

	function getColl () {
		if ($this -> num_rows () == 0) return false;
		$d = array ();
		while ($row = $this -> fetch_row ())
			$d [] = $row [0];
		return $d;
	}
}
error_reporting (E_ALL);

Sql::$config = array (
	'default' => array ('host' => 'localhost', 'user' => 'root', 'password' => '', 'name' => 'DEMOVB', 'prefix' => 'vb_'),
);
$sql = Sql::getInstance ();
print_r ($sql -> query ("SELECT * FROM ?_User where ID = '?'", 1) -> getRow ());
print_r ($sql -> query ("SELECT Name FROM ?_User where ID IN(?a)", array (1, 2, 3)) -> getColl ());
print_r ($sql -> query ("SELECT * FROM ?_User limit ?, ?", 10, 10) -> getMap ('Name', 'ID'));
$sql -> run ("INSERT INTO vb_User SET ?m, InsertDate = NOW()", array ('Name' => 'vasia', 'Surname' => 'Pupkin'));
 
Ну как бы, не соглашусь, ключи всегда проверяются, это же поля, там такие поля просто быть не должны.
 
Хотя конечно для новичка, возможно вы и правы, там никто проверкой заниматься не будет, всунут c формы сразу в запрос и хана.
Но с другой стороны, поделочники вообще разленятся, что тоже не есть гуд.
 
Сверху