Forums / National / Russian / Тех. поддержка / Работа с БД через передачу параметров массивом

как передать список (лист) значений

Macik
#1 2012-07-11 10:00

[кому лень читать подробности - в конце страницы самая суть и вопрос]

Стараюсь использовать запросы в БД через $cotDB->query($query,$parameters); Т.е. передавая параметры массивом, а не забивая их на прямую в текст запроса.

В общем проблем нет, но частенько надо передать как параметр список опций, например: 

...
and user_region in ('ECE','RUS','USA')
...

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

Для этих нужд немного расширил database.php, в частности функцию «_prepare» во внутреннем цикле:

было:

				$placeholder = is_int($key) ? '?' : ':' . $key;
				$value = is_int($val) ? $val : $this->quote($val);
 				$query = preg_replace('`' . preg_quote($placeholder) . '`', $value, $query, 1);

стало (выделил добавленное):

				$placeholder = is_int($key) ? '?' : ':' . $key;
				if (!is_array($val))
				{
					$value = is_int($val) ? $val : $this->quote($val);
				} 
				else // added array processing 
				{ 
					$value = array();
					foreach ($val as $v)
					{
						$value[] = is_int($v) ? $v : $this->quote($v);
					}
					$value = implode(',',$value);
				}
 				$query = preg_replace('`' . preg_quote($placeholder) . '`', $value, $query, 1);

Т.е. просто добавил проверку, и если передается массив - формируем соотв. строку со значениями массива.

-------

Однако в $cotDB->query есть проверка $this->_prepare_itself  и если версия клиентской библиотеки => 5.1.0 вместо «_prepare» будет вызван «_bindParams», в котором используются родной PDOStatement::bindValue и я ума не приложу как изменить _bindParams , аналогичным образом (как описано выше), что бы была возможность передавать в параметре списки значений.

 

https://github.com/macik
правильный хостинг — https://goo.gl/fjCa1F
This post was edited by Macik (2012-07-16 14:27, 11 years ago)
Trustmaster
#2 2012-07-11 18:14

Обходить конём, то есть сразу (ещё в query/insert/update/delete) вставлять массив в запрос и убирать его из списка параметров, после чего передавать полученный запрос и оставшиеся параметры далее по цепочке.

Главный вопрос - стоит ли оно того?

May the Source be with you!
Macik
#3 2012-07-11 20:45

Да... Тогда проще остаться с «вечным» _prepare_itself = trur; и поправить только  «_prepare».

https://github.com/macik
правильный хостинг — https://goo.gl/fjCa1F
This post was edited by Macik (2012-07-16 14:28, 11 years ago)