Javascript-форум (https://javascript.ru/forum/)
-   Серверные языки и технологии (https://javascript.ru/forum/server/)
-   -   Прозрачная работа с несколькими базами данных на PHP (https://javascript.ru/forum/server/7857-prozrachnaya-rabota-s-neskolkimi-bazami-dannykh-na-php.html)

PeaceCoder 26.02.2010 14:22

Цитата:

Сообщение от e1f
запросы будут формироватся пользователем вашей CMS

Да. Будет стандартный синтаксис (шаблоны написания запросов), все остальное - функции не реазлизованные на той или инной БД берет на себя модуль. Например SELECT INTO не везде одиноков, но по стандарту он таков: "SELECT ... INTO ... FROM ......"
Цитата:

Сообщение от e1f
Как будет реализован квотинг данных?

А вот над этим я думаю, пытаюсь вообще все на автомат поставить. Потому как задолбало постоянно писать типа
$db->q("SELECT * FROM ... WHERE ...='".sql_escape($data)."'"


Может есть идеи как избавиться от функции ?

Kolyaj 26.02.2010 14:26

Цитата:

Сообщение от PeaceCoder
Может есть идеи как избавиться от функции ?

От sql_escape?
Код:

PDO::prepare

e1f 26.02.2010 15:05

bind_param

Tim 26.02.2010 16:00

Цитата:

Да. Будет стандартный синтаксис
Т.е. запрос будет в виде строки а потом будет парсится регулярками и приводиться к нужному виду?

Цитата:

Сообщение от e1f (Сообщение 45811)
Если делать грамотный Storage-wrapper, то от запросов везде, кроме как в классах, реализующих функционал для каждого типа БД, надо бежать как от огня.

Человек дело говорит! PeaceCoder зря вы мой призыв обратить внимание на Zend не услышали. Посмотрите как там сделано:

$params = array(
	'host'     => 'localhost',
	'username' => 'root',
	'password' => '',
	'dbname'   => 'drupal'
);

// Инициализация адаптера с указанием нужного диалекта
$db = Zend_Db::factory('Pdo_Mysql', $params);

// Выполнение запроса
$result = $db->fetchAll(
	$db	->	select()
		->	from('users')
		->	order('uid')
		->	limit(15)
);

PeaceCoder 26.02.2010 16:14

Цитата:

Сообщение от Kolyaj
От sql_escape?

Идейка понравилась, думал что-то в этом роде но не думал что это будет удобно...

PeaceCoder 26.02.2010 17:52

Цитата:

Сообщение от Tim
зря вы мой призыв обратить внимание на Zend не услышали

услышал. пока размышляю что будет лучше. то как построены зенд запросы и хорошо и плохо. хорошо - мы в нутри класса имеем четкую структуру запроса, плохо такое формирование уменьшает кпд программиста, т.к. постоянно повторятся array(name=>adwd,...) утомляет

PeaceCoder 26.02.2010 18:34

Цитата:

Сообщение от Tim
Посмотрите как там сделано

А вот кста, я так и не понял как сформировать запрос с сабзапросом?

Tim 27.02.2010 00:41

Цитата:

А вот кста, я так и не понял как сформировать запрос с сабзапросом?
// Запрос номер 1 (вложенный)
$query1 = $db	->	select()
				->	from('blocks', 'delta')
				->	where('bid = 2');

// Запрос номер 2
$query2 = $db	->	select()
				->	from('users')
				->	where('uid = ?' , $query1)
				->	limit(2);

// Посмотрим как выглядит строка запроса
print $query2->assemble();

/* Вот она:
SELECT users.* FROM users WHERE (uid = (SELECT blocks.delta FROM blocks WHERE (bid = 2))) LIMIT 2
*/

// Теперь выполним этот запрос
$result = $db->fetchAll($query2);

// Распечатаем массив результатов
print_r($result);


Теперь обратим внимание на строку:
->	where('uid = ?' , $query1)

Запрос 1 будет подставлен вместо знака вопроса. В принципе, можно использовать и конкатенацию, но тогда добавлять скобки придётся руками.
->	where('uid = (' . $query1 . ')' )


Ещё можно так:
->	where('uid = (SELECT delta FROM blocks WHERE bid = 2)')

но это уже совсем быдлокодерство.

P.S.: Сдавайтесь PeaceCoder ;) Zend рулит. Хотя, конечно есть и минусы: они перестраховщики большие - много линних проверок и перепроверок.

PeaceCoder 27.02.2010 01:41

Цитата:

Сообщение от Tim
Запрос 1 будет подставлен вместо знака вопроса. В принципе, можно использовать и конкатенацию,

только вот интересно как это происходит конкатенация если на выходе постоянно обьект, а не строка ? Или в пхп принцип -> иной return не влияет на эту команду ?
Цитата:

Сообщение от Tim
Сдавайтесь PeaceCoder Zend рулит

Рулит но не в том направлении в котором буду делать я. На счет сабов так и подумал...

Tim 27.02.2010 02:46

Цитата:

только вот интересно как это происходит конкатенация если на выходе постоянно обьект, а не строка ?
Нужно определить в классе метод __toString() и он будет автоматически вызываться. Беглый осмотр кода кода Zend показал, что так оно и сделано.

class my_class {

	function __toString()
	{
		return 'Вдруг как в сказке скрипнула дверь ;)';
	}
}

$my_obj = new my_class();

print $my_obj;


Часовой пояс GMT +3, время: 22:28.