Да, вы правы, это O (n), где n - длина списка. Дополнительную информацию смотрите здесь: https://www.ics.uci.edu/~pattis/ICS-33/lectures/complexitypython.txt
Вместо того, чтобы передать имена столбцов, просто передайте идентификатор, который Вы кодируете, переведет в имя столбца с помощью hardcoded таблицы. Это означает, что Вы не должны волноваться о злонамеренных передаваемых данных, так как все данные или переводятся по закону или, как известно, недопустимы. Код Psudoish:
@columns = qw/Name Address Telephone/;
if ($columns[$param]) {
$query = "select * from contacts where $columns[$param] = ?";
} else {
die "Invalid column!";
}
run_sql($query, $search);
Прием должен быть уверен в Вашем выходе и проверке стандартных программ. Я использую свою собственную функцию Escape SQL, которая перегружается для литералов различных типов. Нигде не сделайте я вставляю выражения (в противоположность заключенным в кавычки литеральным значениям) непосредственно от ввода данных пользователем.
Однако, это может быть сделано, я рекомендую, чтобы отдельное — и строгий — функционировало для проверки имени столбца. Позвольте этому принимать только единственный идентификатор, что-то как
/^\w[\w\d_]*$/
Необходимо будет полагаться на предположения, которые можно сделать о собственных именах столбцов.
Сделайте столбец на основе результатов другого запроса к таблице, которая перечисляет возможные значения схемы. В том втором запросе Вы можете hardcode выбор к имени столбца, которое используется для определения схемы. если никакие строки не возвращаются затем, вводимый столбец недопустим.
Я использую ADO.NET и использование Команд SQL и SQLParameters к тем командам, которые заботятся о проблеме Escape. Таким образом, если Вы находитесь в среде инструмента Microsoft также, я могу сказать, что использую это очень sucesfully, чтобы создать динамический SQL и все же защитить мои параметры
всего наилучшего
Имена столбцов в некоторых базах данных могут содержать пробелы, которые означают, что необходимо было бы заключить имя столбца в кавычки, но если база данных не содержит таких столбцов, просто выполните имя столбца через регулярное выражение или своего рода проверку прежде, чем соединить в SQL:
if ( $column !~ /^\w+$/ ) {
die "Bad column name [$column]";
}
В стандартном SQL Вы включаете выделенные идентификаторы в двойные кавычки. Это означает что:
SELECT * FROM "SomeTable" WHERE "SomeColumn" = ?
выберет из таблицы под названием SomeTable с показанной капитализацией (не преобразованная из случая версия имени) и применит условие к столбцу под названием SomeColumn с показанной капитализацией.
Из себя это не очень полезно, но... если можно применить Escape () техника с двойными кавычками к именам, введенным с помощью веб-формы, затем можно создать запрос обоснованно уверенно.
Конечно, Вы сказали, что хотели избегать использования Escape - и действительно Вы не должны использовать его на параметрах, где Вы обеспечиваете? заполнители. Но где Вы помещаете обеспеченные пользователями данные в запрос, необходимо защитить себя от злонамеренных людей.
Другой DBMS имеет различные способы обеспечить выделенные идентификаторы. SQL Server MS, например, кажется, использует квадратные скобки [SomeTable] вместо двойных кавычек.