2015-11-03 2 views
0

Вот проблема: если я использую {} для команды обновления, как так:Tcl SQLite обновление подстановки переменная не может иметь апостроф

package require sqlite3 
fileRepo eval {UPDATE uploads SET $col=$data WHERE rowid=$id} 

Я не могу заменить переменные внутри фигурных скобок. все это должно быть жестко закодировано.

Однако, если я использую «» для команды обновления, как так:

fileRepo eval "UPDATE uploads SET $col='$data' WHERE rowid=$id" 

я могу заменить переменные в двойных кавычках, но я должен использовать «» для того, чтобы поместить в данных с пробелами так SQL видит его как один вход. Если я не я получаю сообщение об ошибке, если я отправить что-то вроде

$data = "Legit Stack"

Поскольку это имеет место SQL-подавится на слово: Stack , если оно не помещается в одинарные кавычки

Таким образом .. .

Если я отправить эти данные в команде обновления:

$col = description 
$data = "Stack's Pet" 

Я получаю следующее сообщение об ошибке:

near "s": syntax error while executing "fileRepo eval "UPDATE uploads SET $col='$data' WHERE rowid=$id" ...

Таким образом, с учетом этих правил я не вижу возможности успешно передать одну цитату или апостроф команде обновления. Есть ли другой способ сделать это?

Спасибо!

ответ

4

Хотя это правда, что вы можете избежать одиночные кавычки по их удвоения (как обычно в SQL), вы откроете свой код в опасности атак с внедрением SQL.

Это может быть лучше разделить код на две стадии:

  • Замена с format {UPDATE uploads SET %s=$data WHERE rowid=$id} $col

  • пусть sqlite3 магии Eval превратить $data и $id в связанный переменные для подготовленного заявления

Таким образом, вам необходимо только очистить col, чтобы убедиться, что он содержит допустимое имя столбца и ничего больше (должно быть легко), а не все ваши данные. Кроме того, вам не нужно копировать большие значения так часто, поэтому двухэтапный подход будет даже быстрее. Чтобы сделать еще более ясным, вы хотите использовать переменную связывания, попробуйте альтернативный синтаксис с : перед именем переменной.

package require sqlite3 
set stmt [format {UPDATE uploads SET %s=:data WHERE rowid=:id} $col] 
fileRepo eval $stmt 

Рекомендуемая литература:

0

Вы должны использовать апостроф побега. Так оно и должно выглядеть следующим образом:

$data = "Stack''s Pet"

+0

Как глупо с моей стороны! Я просто не знаю, достаточно! –

+2

Экранирование одиночных кавычек, подобных тому, что это действительно вещь SQL –

Смежные вопросы