Пятница. Говнокод. Парсинг плейсхолдеров.

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Это ещё почему? Там показано отдельно с prepare и execute
PHP:
$stmt = pg_prepare($conn, 'multitest', 'insert into roles (role_name) values ($1), ($2), ($3)');
$res = pg_execute($conn, 'multitest', array('Тестовый админ', 'Тестовый юзер', 'Тестовый придурок'));
но это же только pg, и только неименованные :(
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
уже подствленные данные в конечном запросе будут всяко нагляднее именованного плейсхолдера
все эти ваши архитектурные муки выбора "куда сохранять значения" - высокое искусство на фоне бытовых задач анализа логов вида
2013/03/27 19:48:04 [trace] [system.db.CDbCommand] Executing SQL: INSERT INTO `customers_basket_list_x_product` (`basket_list`, `product_id`, `quantity`, `product_price`, `product_status`, `option_id`, `date_add`) VALUES ( :yp0, :yp1, :yp2, :yp3, :yp4, :yp5, NOW()). Bound with :yp0='110', :yp1='617109', :yp2='3', :yp3='550', :yp4='3', :yp5=NULL
in /newrpc/models/ServiceOrderCartItem.php (253)
методами PHP вы полный текст запроса не вытяните никак - только из лога MySQL, а попробуйте включить лог на 100-гигабайтной базе?

в обычной жизни хочется такой парсер плейсхолдеров, который позволит писать в лог запрос в том виде, который можно понять, проверить без мысленной эквилибристики и выполнить в консоли
 

Фанат

oncle terrible
Команда форума
в обычной жизни хочется такой парсер плейсхолдеров
Ну вот парсер-то уже есть :)
Мы тут пытаемся обратную задачу решить - как плейсхолдер в нативный превратить.
Но задача, прямо скажем, больше теоретическая
 

hell0w0rd

Продвинутый новичок
grigori
а в чем проблема подставить значения в запрос самостоятельно для записи в лог?
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Тут обсуждается мыскльная либа, если ты не заметил.
Так а почему не в гетто форуме по MySQL? Если серьёзно, я думал, в MySQL уж можно разбить строку на куски и получить набор записей? Строку-то пропихнуть в штатный placeholder уже не проблема.
 

Фанат

oncle terrible
Команда форума
Кстати, Давид сделал себе либу на типизованных плейсхолдерах для ПДО и постгреса.
Надо спросить, не выложит ли.
 

hell0w0rd

Продвинутый новичок
Ну вот смртри, тут примеры:
http://phpfaq.ru/examples#where
http://phpfaq.ru/examples#multiparse
В текущем варианте данные подставляются прямо на месте
А если их копить отдельно, то куда? В отдельную глобальную переменную? Пременную класса? Ни то ни другое мне не нравится.
В общем поглядывая на тот класс, сделал свой, тестов еще не написал, но вроде все должно работать:) То есть можно одновременно использовать и именованные и не именованные плейсхолдеры, и вроде как даже на один плейсхолдер биндить несколько значений
 

Фанат

oncle terrible
Команда форума
В общем поглядывая на тот класс, сделал свой, тестов еще не написал, но вроде все должно работать:) То есть можно одновременно использовать и именованные и не именованные плейсхолдеры, и вроде как даже на один плейсхолдер биндить несколько значений
ё. А куда ты его убрал-то?
Я и посмотреть толком не успел :(
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
grigori
а в чем проблема подставить значения в запрос самостоятельно для записи в лог?
пропустил вопрос на той неделе

мешают 2 вещи: то, что Yii - нифига не MVC, текст лога формируется прямо в драйвере,
и любовь кетайца к зависимостям в коде
https://github.com/yiisoft/yii/blob/master/framework/db/CDbCommand.php#L353
 

Вурдалак

Продвинутый новичок
Я не удивлюсь, если сообщения в лог сыпятся на языке пользователя.
 

riff

Новичок
Небольшое улучшение:

SELECT * FROM tbl WHERE id IN (a:ids) // или (?a)
PHP:
	case 'a':
		$part = $this->createIN($value);
		break;
1. Можно избавиться от параметра "a" (и в запросе и в коде), а отталкиваться от того факта, что $value = array.

PHP:
	private function createIN($data)
	{
		//...
		foreach ($data as $value)
		{
			$query .= $comma.$this->escapeString($value); //Все числа заключаются в кавычки.
			$comma  = ",";
		}
		//...
	}
2. Если указывать тип массива (т.е. не "a:ids", а "i:ids" или "?i"), то вместо $this->escapeString($value) можно будет более подходящее $this->escapeInt($value) писать.

Немного сумбурно написал, если не поймёте, скажите, попробую переформулировать.
 
Сверху