Есть ли какой-нибудь C SQLite API для цитирования / экранирования имени таблицы? - PullRequest
7 голосов
/ 08 февраля 2010

Невозможно sqlite3_bind_text имя таблицы, потому что sqlite3_prepare_v2 не может подготовить оператор, такой как:

SELECT * FROM ? ;

Я предполагаю, что имя таблицы необходимо для анализа оператора, поэтому цитирование должно произойти до sqlite3_prepare_v2.

Есть что-то вроде sqlite3_quote_tablename? Возможно, оно уже существует под именем, которое я не могу распознать, но я не могу найти ничего в списке функций.

Ответы [ 6 ]

2 голосов
/ 08 февраля 2010

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

sqlite> create table "test table" (id);
sqlite> insert into "test table" values (1);
sqlite> select * from "test table";
id
----------
1

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

1 голос
/ 13 января 2012

ваша предложенная функция sqlite3_quote_tablename может санировать ввод, чтобы предотвратить атаки SQL-инъекций. Для этого он может проанализировать ввод, чтобы убедиться, что это строковый литерал. http://sqlite.org/lang_expr.html#litvalue

1 голос
/ 08 февраля 2010

При использовании подготовленных операторов SQLite с параметрами параметр: "указывает заполнитель в выражении для литерального значения, которое заполняется при время выполнения "

Перед выполнением любого оператора SQL SQLite «компилирует» строку SQL в серию кодов операций , которые выполняются внутренней виртуальной машиной. Имена таблиц и столбцов, с которыми работает оператор SQL, являются обязательной частью процесса компиляции.

Вы можете использовать параметры для привязки "значений" к подготовленным операторам, например так:

SELECT * FROM FOO WHERE name=?;

А затем вызвать sqlite3_bind_text(), чтобы связать строку gavinbeatty с уже скомпилированным оператором. Однако эта архитектура означает, что вы не можете использовать такие параметры:

SELECT * FROM ? WHERE name=?;    // Can't bind table name as a parameter
SELECT * FROM FOO WHERE ?=10;    // Can't bind column name as a parameter
0 голосов
/ 21 октября 2018

SQLite будет экранировать идентификаторы для вас в формате %w в семействе функций https://www.sqlite.org/printf.html.

0 голосов
/ 18 августа 2012

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

0 голосов
/ 08 февраля 2010

Если SQLite не принимает имена таблиц в качестве параметров, я не думаю, что есть решение вашей проблемы ...

Примите во внимание, что:

Параметры, которым не присвоены значения с помощью sqlite3_bind (), обрабатываются как NULL.

поэтому в случае вашего запроса имя таблицы будет равно NULL, что, конечно, неверно.

...