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

Beavis

Banned
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']);
м!
 

флоппик

promotor fidei
Команда форума
Партнер клуба
craz
Это совершенно естественная реакция! потому что понятие проверки по белому списку - НОВОЕ для пхп разработчиков. При том, что оно ключевое для безопасности, когда мы работаем с именами полей и таблиц.
Ну конечно, когда я тебе рассказывал про модели, которые структуру таблицы проверяют, и что для этого и нужны всякие ->where($column, $operand, $value) — это же было совсем другое, ага.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Ад и багдад. Может проще взять все с конфига по индексу?
 

serglt

Анус, ой, Ахтунг
флоппик
Ну дык метод mysqli::query делает тоже самое только класс у него mysqli_result
Не вижу логики.
Его по другому не создать.
 

craz

Нестандартное звание
А еще можно вопрос, зачем все это пишут постоянно? Почему не использовать что-то готовое? Что ни у кого нет нормальной готовой библиотеки?

Причем постоянно это скатывается в обсуждении, что лучше, что понятнее, что безопаснее, и каждого свое мнение, и каждый берет и пишет свое. Тогда для кого кроме себя это все пишется?
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Для себя и пишется, мышление и привычка работать с данными у всех разные... Кто-то все же осиливает и переползает с велосипедов на стандартные штуки с фреймворков.
 

craz

Нестандартное звание
Ну получается че Фанат не осилил? Ты сейчас разрушил мою вселенную...
 

Фанат

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

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

Жила была маленькая и супер-удобная программа для мгновенных сообщений, icq. её развивали-развивали, и доразвивали до непотребного монстра, которым никто не захотел пользоваться.
И тут на арену вышла маленькая и супер-удобная программа для мгновенных сообщений,qip. её развивали-развивали, и доразвивали до непотребного монстра, которым никто не захотел пользоваться.
Жила-была маленькая и супер-удобная СУБД mysql. её развивали-развивали, и доразвивали до состояния, когда маленькой её уже никак не назовёшь.
И тут на арену вышла маленькая СУБД sqlite....
Этот процесс вечен.
 

Фанат

oncle terrible
Команда форума
Ну получается че Фанат не осилил? Ты сейчас разрушил мою вселенную...
Во-первых, да, я с большим трудом осиливаю новое.
несколько раз подступался к yii, но то ли у нас пример плохой то ли я тупой, но стойко у меня вырабатывалось только чувство бешенства.
Во-вторых, меня не устраивают сучесвтующие решения. они всегда чудовищно громоздкие, и зачастую решают совсем не те задачи, которые надо решать. происходит подмена целей. классический пример - "Шаблонизатор нужен для того, чтобы изгнать пхп из хтмл". или вот prepared statements в драйверах БД - ни для защиты, ни для удобства они недостаточны
 

craz

Нестандартное звание
Во-первых, да, я с большим трудом осиливаю новое.
несколько раз подступался к yii, но то ли у нас пример плохой то ли я тупой, но стойко у меня вырабатывалось только чувство бешенства.
Во-вторых, меня не устраивают сучесвтующие решения. они всегда чудовищно громоздкие, и зачастую решают совсем не те задачи, которые надо решать. происходит подмена целей. классический пример - "Шаблонизатор нужен для того, чтобы изгнать пхп из хтмл". или вот prepared statements в драйверах БД - ни для защиты, ни для удобства они недостаточны
посмотри zf2) я хоть все эти DI понимаю только в теории, но ниче сижу разбираюсь.
 

Фанат

oncle terrible
Команда форума
Там другой подход.
По поводу заворачивания SQL в отдельные операторы типа select('name')->from('table')->where->addcondition() было обсуждение в топике с Amdy, возвращаться я к нему не хочу.
Возможно, я неправ, но такой подход, во-первых, не устраивает лично меня, а во-вторых, перетащить на него орду пыхапёров - задача нереальная.
инструмент должен быть ПРОСТЫМ.
причина бешеной популярности пыха -в простоте.
я хочу соблюсти максимальную простоту (можно назвать это близостью к говнокоду) при максимальной же безопасности
 

флоппик

promotor fidei
Команда форума
Партнер клуба
prepared statements в драйверах БД - ни для защиты, ни для удобства они недостаточны
Вообще, как бы, они нужны были, что бы в программах работающих с нормальным постоянным соединением не перестраивать план запроса при изменении данных. А то что они как побочный эффект адекватно позволяют передавать параметры без строкового экранирования спецсимволов — оно нечаянно получилось, и поскольку основная их цель в PHP не прижилась (и не сильно осмысленна)... получилось все как обычно, в общем.
 

serglt

Анус, ой, Ахтунг
Вот вам пример маленького и простого :)
Уложился в чуть меньше чем 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'));
 

serglt

Анус, ой, Ахтунг
Ну как бы, не соглашусь, ключи всегда проверяются, это же поля, там такие поля просто быть не должны.
 

serglt

Анус, ой, Ахтунг
Хотя конечно для новичка, возможно вы и правы, там никто проверкой заниматься не будет, всунут c формы сразу в запрос и хана.
Но с другой стороны, поделочники вообще разленятся, что тоже не есть гуд.
 
Сверху