Опыт с Гудзоном - Разрабатывающий матричный проект

Я написал эту небольшую функцию несколько лет назад:

function sqlvprintf($query, $args)
{
    global $DB_LINK;
    $ctr = 0;
    ensureConnection(); // Connect to database if not connected already.
    $values = array();
    foreach ($args as $value)
    {
        if (is_string($value))
        {
            $value = "'" . mysqli_real_escape_string($DB_LINK, $value) . "'";
        }
        else if (is_null($value))
        {
            $value = 'NULL';
        }
        else if (!is_int($value) && !is_float($value))
        {
            die('Only numeric, string, array and NULL arguments allowed in a query. Argument '.($ctr+1).' is not a basic type, it\'s type is '. gettype($value). '.');
        }
        $values[] = $value;
        $ctr++;
    }
    $query = preg_replace_callback(
        '/{(\\d+)}/', 
        function($match) use ($values)
        {
            if (isset($values[$match[1]]))
            {
                return $values[$match[1]];
            }
            else
            {
                return $match[0];
            }
        },
        $query
    );
    return $query;
}

function runEscapedQuery($preparedQuery /*, ...*/)
{
    $params = array_slice(func_get_args(), 1);
    $results = runQuery(sqlvprintf($preparedQuery, $params)); // Run query and fetch results.   
    return $results;
}

Это позволяет запускать операторы в однострочном C # -ish String.Format, например:

runEscapedQuery("INSERT INTO Whatever (id, foo, bar) VALUES ({0}, {1}, {2})", $numericVar, $stringVar1, $stringVar2);

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

ОБНОВЛЕНИЕ БЕЗОПАСНОСТИ: предыдущая версия str_replace разрешала инъекции, добавляя токены {#} в пользовательские данные. Эта версия preg_replace_callback не вызывает проблем, если замена содержит эти токены.

23
задан asheeshr 18 February 2013 в 05:46
поделиться

1 ответ

Я попробовал эту функцию несколько месяцев назад, но я больше не использую ее (просто, потому что мне не нужна она, не потому что это не хорошая функция).

В основном, Вы определяете n Ось, каждая ось является свойством с несколькими значениями.

Позволяют нам пойти с примером: Вы определяете Ось "JDK", с возможным значением "1.4", "1.5", "1.6", и Вы определяете другое свойство "база данных", где возможные значения являются "оракулом", "mysql".

Таким образом, Гудзон запустит Вашу сборку 6 раз:

  • с JDK 1.4, со свойством database=oracle (т.е. JVM запускается с-Ddatabase=oracle)
  • с JDK 1.5, со свойством database=oracle
  • с JDK 1.6, со свойством database=oracle
  • с JDK 1.4, со свойством database=mysql
  • с JDK 1.5, со свойством database=mysql
  • с JDK 1.6, со свойством database=mysql

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

Эта функция может быть действительно полезной, когда необходимо протестировать приложение в нескольких средах (в моем примере с различными версиями JDK или базы данных).

Примечание, что за исключением оси JDK, необходимо управлять собой свойством, данным как запись Гудзоном. В моем примере приложение должно принять во внимание само свойство "базы данных". В конечном счете хорошая идея состоит в том, чтобы использовать это свойство для включения конкретного профиля в конфигурации Maven2, если Вы проектируете, mavenized (см. здесь для получения дополнительной информации об этом).

я надеюсь, что мои объяснения являются достаточно четкими:)

27
ответ дан Romain Linsolas 29 November 2019 в 02:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: