Названия таблиц и столбцов не могут быть заменены параметрами в PDO.
В этом случае вы просто захотите фильтровать и дезинфицировать данные вручную. Один из способов сделать это - передать сокращенные параметры функции, которая будет выполнять запрос динамически, а затем использовать оператор switch()
для создания белого списка допустимых значений, которые будут использоваться для имени таблицы или имени столбца. Таким образом, пользовательский ввод никогда не попадает непосредственно в запрос. Например:
function buildQuery( $get_var )
{
switch($get_var)
{
case 1:
$tbl = 'users';
break;
}
$sql = "SELECT * FROM $tbl";
}
Не оставляя случая по умолчанию или используя случай по умолчанию, который возвращает сообщение об ошибке, вы убедитесь, что используются только значения, которые вы хотите использовать.
Если вы все еще застреваете, проблема, с которой вы используете подменю services=$(compgen -A variable | grep service)
, состоит в том, что она создает одну длинную строку, содержащую service1 service2 service3...
. Хотя вы можете разобрать это с обычным расщеплением слов, вам лучше обслуживать сохранение требуемой переменной окружения в индексированном массиве, например
services=( $(compgen -A variable | grep 'service' | grep -v 'services') )
(grep -v 'services'
в необходимости удаления services
из список, который объявлен перед вызовом compgen
)
Теперь вы можете просто перебрать ваш массив с использованием косвенности и переменной счетчика, чтобы создать выход serverX=val
вы хотите, например,
declare -i n=1
for i in ${services[@]}; do
printf "%s=%s\n" "server$((n++))" "${!i}"
done
Введя его в целом в коротком примере, вы можете сделать что-то вроде следующего:
#!/bin/bash
service1=1
service2=a
service3=dd
## fill services with all variable containing "service", excluding "services"
services=( $(compgen -A variable | grep 'service' | grep -v 'services') )
declare -i n=1
for i in ${services[@]}; do
printf "%s=%s\n" "server$((n++))" "${!i}" ## use indirection to get value of i
done
Пример использования / вывода
$ bash compgen_tst.sh
server1=1
server2=a
server3=dd
Посмотрите все и дайте мне знать, если у вас появятся дополнительные вопросы.
"${!service@}"
. Не было бы необходимости ни дляgrep
:), и флаг-i
может только создать путаницу, на мой взгляд, в то время как преимущества довольно малы. – PesaThe 14 July 2018 в 07:14${!services[@]}'. You would still need a loop variable (or old
$ 1` иshift
), чтобы удерживать значения, но я вижу, как это может быть чище. – David C. Rankin 14 July 2018 в 09:08