Было бы преувеличением сказать, что это «неправильно», но это может быть agile и, как правило, не считается лучшей практикой. Рекомендация этого руководства по значениям привязки является хорошей техникой.
Например, что если значение, связанное со столбцом name
, содержит '
? Например, «О'Коннор». Одиночная кавычка в этой строке преждевременно завершит вашу строку SQL, например,
INSERT INTO item (itemid, characterClass, itemtype, itemtypeid, mincharges, maxcharges, name)
VALUES (1,2,3,4,5,6,'O'Connor');
. В этом сценарии (среди прочих) подготовка вручную созданного оператора SQL может завершиться неудачно. sqlite3_bind_text
устраняет этот класс проблем и всегда безопасен. Как документация гласит:
Затем используйте функции sqlite3_bind_XXXX()
, чтобы связать ваши большие строковые значения с оператором SQL. Использование связывания избавляет от необходимости экранировать кавычки в строке, снижая риск атак SQL инъекций. Он также работает быстрее, так как большую строку не нужно анализировать или копировать столько же.
Конечно, если вы знаете , что у вас никогда не возникнет проблем c input (например, это просто числовые или внутренние строковые значения, которые, как вы знаете, никогда не могут иметь ни одного из этих проблемных c значений), тогда вам не нужно использовать sqlite3_bind_xxx
функции, но такое предположение, которое имеет тенденцию кусаться позже.
Как правило, значения привязки безопаснее. И если вы обеспокоены тем, что синтаксис sqlite3_bind_text
является громоздким, то я мог бы предложить класс-оболочку SQLite, который выполняет связывание для вас, но абстрагирует вас от этих деталей.
Кстати, другое преимущество связывания для NULLABLE
столбцов. Если вы просто используете ?
заполнителей, то вы можете связать либо NULL
, либо правильное значение для этого столбца. Если вы создаете SQL вручную, правильная обработка столбцов NULLABLE
немного сложнее.