![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
поиск по базе
lancomm © (2013-08-19 21:24:00)Доброго вечера. Подскажите пожалуйста как совершать поиск по таблице более какого то значения. Есть код
datamodule1.ADOQuery1.Active :=False;
datamodule1.ADOQuery1.SQL.Clear;
datamodule1.ADOQuery1.SQL.Add('SELECT*');
datamodule1.ADOQuery1.SQL.Add('FROM sey1');
datamodule1.ADOQuery1.SQL.Add('WHERE Cena > 31000');
datamodule1.ADOQuery1.Active := true;
form9.ShowModal;
ищет в таблице sey1 в столбце Cena значения больше 31000, если не трудно подскажите синтаксис как искать больше не уже известного значения, а больше введенного например в Edit
megavoid (2013-08-20 11:38:00) [1]Заменяем всего одно слово, роберта на truncate - и визуальная запоминалка xkcd начинает пробуксовывать, а значит, не столь эффективна :)
[13] Datamodule1.ADOQuery1.SQL.Add формирует SQL запрос, чтобы потом отобразить полученный набор данных куда-нибудь, в dbgrid, например. Если вписать в TEdit обыкновенное число - то запрос к базе получится такой, как и планировался, то бишьSELECT * FROM sey1 WHERE Cena > 31000
Некоторые же персоналии, со зла или по недомыслию, могут попробовать вписать в Edit1 более оригинальный текст, как уже привёл пример:31000; TRUNCATE sey1;. К чему это приведёт? Получится не один запрос к базе, а два; точка с запятой служит признаком конца запроса для SQL, и база выполнит не только первую команду с селектом, но и вторую, которая стирает все данные из заданной таблицы. Это можно лечить разными способами, можно кавычками, а в данном случае можно и просто заменить Tedit на TSpinEdit, например.
PS гыы, вбил в поиск "adoquery sql injection" - на первом же месте ветка с SQL.ru от 2009 года, где АП с грустью во словах в который раз её объясняет :D
lancomm (2013-08-20 11:17:00) [2]вписывал 31000 и более, все ок
Anatoly Podgoretsky (2013-08-20 09:35:00) [3]Cуть проблемы в "TRUNCATE TABLE sey1;"
lancomm (2013-08-20 08:04:00) [4]я понимаю что вы знаете в чем проблема, но не могли бы вы мне человеческим языком объяснить в чем суть проблемы при
[1] опасно, а если в TEdit(указатель) впишут что-то типа 31000; TRUNCATE TABLE sey1; ?
Dennis I. Komarov (2013-08-19 23:40:00) [5]
> megavoid © (19.08.13 23:34) [9]
> [8] Да Dennis I. Komarov-то знает, не сомневаюсь, а вот
> ТС :))
Судя по запросу, оно и не надо - работает и ...
megavoid (2013-08-19 23:34:00) [6][8] Да Dennis I. Komarov-то знает, не сомневаюсь, а вот ТС :))
Юрий Зотов (2013-08-19 23:21:00) [7]
> megavoid © (19.08.13 22:39) [6]
Видел забавную картинку: перед ГАИшной камерой едет авто с номерным знаком "Drop Database".
PS
Для двоичных программистов - это на тему внедренного SQL-кода.
PPS
Для супердвоичных программистов - я в курсе, что код не выполнится.
Dennis I. Komarov (2013-08-19 23:21:00) [8]megavoid © (19.08.13 22:39) [6]
> [1] опасно
Говорю же, бред...
megavoid (2013-08-19 22:39:00) [9][1] опасно, а если в TEdit(указатель) впишут что-то типа
31000; TRUNCATE TABLE sey1;?
lancomm (2013-08-19 22:05:00) [10]Спасибо еще раз, буду разбираться
Dennis I. Komarov (2013-08-19 22:02:00) [11]http://docwiki.embarcadero.com/Libraries/XE2/en/Data.Win.ADODB.TParameters
Пойдет?
lancomm (2013-08-19 21:57:00) [12]Спасибо, работает, подскажите поподробнее о параметрах, если не трудно, или ссылку где почитать, делаю все по древним методичкам
Dennis I. Komarov (2013-08-19 21:50:00) [13]Избавиться от Query и использовать параметры
Dennis I. Komarov (2013-08-19 21:49:00) [14]
datamodule1.ADOQuery1.Active :=False;
datamodule1.ADOQuery1.SQL.Clear;
datamodule1.ADOQuery1.SQL.Add('SELECT*');
datamodule1.ADOQuery1.SQL.Add('FROM sey1');
datamodule1.ADOQuery1.SQL.Add('WHERE Cena > ' + TEdit(указатель).Text);
datamodule1.ADOQuery1.Active := true;
form9.ShowModal;
P.S. Только бред это