У меня проблема с построителем запросов. Когда я удаляю параметры и передаю переменные в 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'




Это действительно означает плохой дизайн, если вам нужно указать произвольные имена столбцов и заменить их в подготовленном операторе. Могу я предложить вам изменить дизайн вашей БД, чтобы имена столбцов были постоянными (по запросу)?
Если приведенное выше вам не подходит, вам нужно будет вернуться к ручной дезинфекции ваших входных данных (например, имен столбцов) и объединить их с вашим запросом. В отличие от этого, вы по-прежнему можете использовать подготовленные операторы в разделе запроса предиката 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 (при необходимости)
Надеюсь это поможет...
Ах, я ожидал этого :) В этом случае примените очень строгую проверку / дезинфекцию ввода ...
Я добавил пример для проверки, но он далек от идеала (честно говоря, не пробовал запускать). Помните, не стреляйте себе в ногу (или полностью оторвите ногу) какой-нибудь неприятной SQL-инъекцией :)
Спасибо за поддержку :) Может быть, какой-нибудь вдохновитель покажет, как обычно использовать параметры: D Насчет инъекции хм, я думаю, что это не проблема, потому что пользователь вручную вводит данные подключения db :)
хорошо, но :) db не моя. Я получаю эти данные (dbname, host, citytable, petroltable и т. д.) от пользователя. Тогда я не могу изменить db.