Symfony QueryBuilder setParameters, заменяющие значения

У меня проблема с построителем запросов. Когда я удаляю параметры и передаю переменные в select, он возвращает хорошие значения;

Значения параметров:

dbpetrolcolumn = petrol_type

dbpricecolumn = цена

dbcitycolumn = город

$qb = $conn->createQueryBuilder();
                $result =$qb
                    ->select(':city,:petrol,:price')
                    ->from($form['dbtable']->getData(), 'p')
                    ->setParameters([
                        'petrol'=>$form['dbpetrolcolumn']->getData(),
                        'price'=>$form['dbpricecolumn']->getData(),
                        'city'=>$form['dbcitycolumn']->getData(),
                    ])
                    ->execute()
                    ->fetchAll();
                var_dump($result);

и он возвращает этот массив:

array (size=6)
  0 => 
    array (size=3)
      'city' => string 'city' (length=4)
      'petrol_type' => string 'petrol_type' (length=11)
      'price' => string 'price' (length=5)
  1 => 
    array (size=3)
      'city' => string 'city' (length=4)
      'petrol_type' => string 'petrol_type' (length=11)
      'price' => string 'price' (length=5)
  2 => 
    array (size=3)
      'city' => string 'city' (length=4)
      'petrol_type' => string 'petrol_type' (length=11)
      'price' => string 'price' (length=5)

Хороший должен выглядеть

array (size=6)
      0 => 
        array (size=3)
          'city' => string 'Katowic' (length=4)
          'petrol_type' => string 'Pb95' (length=11)
          '4.50' 
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
1
0
248
1

Ответы 1

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

Если приведенное выше вам не подходит, вам нужно будет вернуться к ручной дезинфекции ваших входных данных (например, имен столбцов) и объединить их с вашим запросом. В отличие от этого, вы по-прежнему можете использовать подготовленные операторы в разделе запроса предиката WHERE.

Как-то неоднозначно: вы мог создаете VIEW поверх своей таблицы, а затем позволяете вашему приложению взаимодействовать с этим представлением ...

Что-то вроде этого:

$validColumnNames = [ ... ];
$validTableNames = [ ... ];

$inputColumns = [ 
    $form['dbpetrolcolumn']->getData(),
    $form['dbpricecolumn']->getData(),
    $form['dbcitycolumn']->getData()
];

$inputTableName = $form['dbtable']->getData();

if (!in_array($inputTableName, $validTableNames, TRUE)){
    throw new InvalidArgumentException("Go away!");
}

foreach ( $inputColumns as $col ){
    if ( !in_array($col, $validColumnNames, TRUE){
        throw new InvalidArgumentException("Go away!");
    }
}

$query = sprintf("SELECT %s, %s, %s FROM %s",
    $inputColumns[0], 
    $inputColumns[1], 
    $inputColumns[2], 
    $inputTableName
);

Затем вы можете продолжить с PreparedStatement и применить раздел WHERE (при необходимости)

Надеюсь это поможет...

хорошо, но :) db не моя. Я получаю эти данные (dbname, host, citytable, petroltable и т. д.) от пользователя. Тогда я не могу изменить db.

Paweł Suchodolski 03.08.2018 10:45

Ах, я ожидал этого :) В этом случае примените очень строгую проверку / дезинфекцию ввода ...

Jovan Perovic 03.08.2018 12:10

Я добавил пример для проверки, но он далек от идеала (честно говоря, не пробовал запускать). Помните, не стреляйте себе в ногу (или полностью оторвите ногу) какой-нибудь неприятной SQL-инъекцией :)

Jovan Perovic 03.08.2018 12:21

Спасибо за поддержку :) Может быть, какой-нибудь вдохновитель покажет, как обычно использовать параметры: D Насчет инъекции хм, я думаю, что это не проблема, потому что пользователь вручную вводит данные подключения db :)

Paweł Suchodolski 03.08.2018 12:41

Другие вопросы по теме