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

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

Macik
#34934 2012-07-11 10:00

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

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

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

SQL
1
2
3
...
and user_region in ('ECE','RUS','USA')
...

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

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

было:

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

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

PHP
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
$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
Bu gönderi Macik tarafından düzenlendi (2012-07-16 14:27, 12 yıllar önce)