Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

поиск по базе


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. Только бред это


Наверх

Титульная страница Поиск, карта сайта Написать письмо