LINUX.ORG.RU
Ответ на: комментарий от buddhist
table t1 has no column named $item
    while executing
"db1 eval {INSERT INTO t1 ("$item") VALUES (2)}"
 
anonymous
()

Прочитай man Tcl:

Если ты хочешь, чтобы внутри строки выполнялись подстановки — заключаешь в кавычки, если не хочешь — в фигурные скобки. В твоём примере надо заменить скобки на кавычки, а не ставить кавычки вокруг строки.

Xenius ★★★★★
()
db1 eval "INSERT INTO t1 (${item}) VALUES (2)"
qaqa ★★
()

Всё мимо. Правильно будет так

set cmd "set myinsert {INSERT INTO t1 ($item) VALUES ([lindex $res 1])}"
eval $cmd
db1 eval $myinsert

Tcl is Lisp on drugs.

macumazan ★★
() автор топика
Ответ на: комментарий от macumazan

Всё мимо. Правильно будет так

Это юмор такой, да?

Вот еще вариант:

db1 eval [format {INSERT INTO t1 (%s) VALUES (%s)} $item [lindex $res 1]]

Ну а вообще - изучите документацию. Ее не так уж и много.

qaqa ★★
()
Последнее исправление: qaqa (всего исправлений: 1)
Ответ на: комментарий от macumazan

Я начал писать ответ, до этого сообщения - поэтому не видел.

qaqa ★★
()
Ответ на: комментарий от macumazan

Плохо:

$ tclsh

% package require sqlite3
3.8.7.1
% sqlite3 db :memory:

% db eval {CREATE TABLE t1(id INTEGER PRIMARY KEY, user TEXT, key TEXT, CONSTRAINT uniqline UNIQUE (user,key))}

% set f1 key
key

%set f2 user
user

% set key 123
123

%set user {"kuku"); INSERT INTO t1 (key,user) VALUES (007,"bond"}
"kuku"); INSERT INTO t1 (key,user) VALUES (007,"bond"

% db eval "INSERT INTO t1 ($f1,$f2) VALUES ($key,$user)"

% db eval {SELECT * FROM t1}
1 kuku 123
2 bond 7

Правильно:


% package require sqlite3
3.8.7.1
% sqlite3 db :memory:

% db eval {CREATE TABLE t1(id INTEGER PRIMARY KEY, user TEXT, key TEXT, CONSTRAINT uniqline UNIQUE (user,key))}

% set f1 key
key

% set f2 user
user

%  set key 123
123

% set user {"kuku"); INSERT INTO t1 (key,user) VALUES (007,"bond"}
"kuku"); INSERT INTO t1 (key,user) VALUES (007,"bond"

% set cmd "INSERT INTO t1 ($f1,$f2) VALUES (\$key,\$user)"
INSERT INTO t1 (key,user) VALUES ($key,$user)

% db eval $cmd
% db eval {SELECT * FROM t1}
1 {"kuku"); INSERT INTO t1 (key,user) VALUES (007,"bond"} 123

anonymous
()
Ответ на: комментарий от anonymous

sql injection? Не, не слышали.

Про sql injection слышал, хотя мне в моей деятельности с этим сталкиваться не приходится.

Посмотрел документацию на db eval. Да, ваш способ безопаснее, так как подстановка в текст запроса не производится. Любое содержимое переменной будет сразу помещено в базу, без подстановки в текст запроса. Это такой аналог prepared statements?

qaqa ★★
()
Последнее исправление: qaqa (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.