• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Фильтрация данных

  • Автор темы @rtem
  • Дата начала
@

@rtem

Здравствуйте, у меня такая проблема. Когда провожу фильтрацию по полям таблицы то 2 поля никак не хотят фильтроваться (по всем остальным фильтрация работает) и возникает ошибка (одинаковая для обоих полей), это поле BNAME, BPUBLISH. они текстовые, а сама база сделанна в InterBase. Поле BAUTHOR тоже текстовое но по нему фильтрация проводится, и код точно такой же как и на тех полях. В чем проблема подскажите.

Код:
procedure TfrmSearchBooks.spbSearchClick(Sender: TObject);
begin

filtr := ' ';
// Поиск по названию товара
if (chbMName.Checked = true) then
//	filtr := 'BNAME = ''' + edtMName.Text + '''';
filtr := 'BNAME = ''' + ComboBox1.Text + '''';
// Поиск по производителю
if (chbMAuthor.Checked = true) and (filtr <> ' ') then
filtr := filtr + ' and ' + 'BAUTHOR = ''' + edtMAuthor.Text + '''';
if (chbMAuthor.Checked = true) and (filtr = ' ') then
filtr := 'BAUTHOR = ''' + edtMAuthor.Text + '''';
// Поиск по поставщику
if (chbMPost.Checked = true) and (filtr <> ' ') then
filtr := filtr + ' and ' + 'BPUBLISH = ''' + edtMPost.Text + '''';
if (chbMPost.Checked = true) and (filtr = ' ') then
filtr := 'BPUBLISH = ''' + edtMPost.Text + '''';
//Поиск по году выпуска
if (chbMYear.Checked = true) and (filtr <> ' ') then
filtr := filtr + ' and ' + 'BYEAR >= ''' + edtMYear1.Text + '''' + ' and BYEAR <= ''' + edtMYear2.Text + '''';
if (chbMYear.Checked = true) and (filtr = ' ') then
filtr := ' BYEAR >= ''' + edtMYear1.Text + '''' + ' and BYEAR <= ''' + edtMYear2.Text + '''';
//Поиск по стандарту упаковки
if (chbMStandart.Checked = true) and (filtr <> ' ' ) then
filtr := filtr + ' and ' + ' BSTAND >= ''' + edtMStandart1.Text + '''' + ' and BSTAND <= ''' + edtMStandart2.Text + '''';
if (chbMStandart.Checked = true) and (filtr = ' ' ) then
filtr := ' BSTAND >= ''' + edtMStandart1.Text + '''' + ' and BSTAND <= ''' + edtMStandart2.Text + '''';
//Поиск по остатку товара на складе
if (chbMQuan.Checked = true) and (filtr <> ' ') then
filtr := filtr + ' and ' + ' BQUAN >= ''' + edtMQuan1.Text + '''' + ' and BQUAN <= ''' + edtMQuan2.Text + '''';
if (chbMQuan.Checked = true) and (filtr = ' ') then
filtr := ' BQUAN >= ''' + edtMQuan1.Text + '''' + ' and BQUAN <= ''' + edtMQuan2.Text + '''';
//Поиск по цене закупки товара
if (chbMPrice.Checked = true) and (filtr <> ' ') then
filtr := filtr + ' and ' + ' BPRICE >= ''' + edtMPrice1.Text + '''' + ' and BPRICE <= ''' + edtMPrice2.Text + '''';
if (chbMPrice.Checked = true) and (filtr = ' ') then
filtr := ' BPRICE >= ''' + edtMPrice1.Text + '''' + ' and BPRICE <= ''' + edtMPrice2.Text + '''';
//Поиск по оптовой цене продажи товара
if (chbMOpt.Checked = true) and (filtr <> ' ') then
filtr := filtr + ' and ' + ' BOPT >= ''' + edtMOpt1.Text + '''' + ' and BOPT <= ''' + edtMOpt2.Text + '''';
if (chbMOpt.Checked = true) and (filtr = ' ') then
filtr := ' BOPT >= ''' + edtMOpt1.Text + '''' + ' and BOPT <= ''' + edtMOpt2.Text + '''';
//Поиск по розничной продажи товара
if (chbMRozn.Checked = true) and (filtr <> ' ') then
filtr := filtr + ' and ' + ' BROZN >= ''' + edtMRozn1.Text + '''' + ' and BROZN <= ''' + edtMRozn2.Text + '''';
if (chbMRozn.Checked = true) and (filtr = ' ') then
filtr := ' BROZN >= ''' + edtMRozn1.Text + '''' + ' and BROZN <= ''' + edtMRozn2.Text + '''';

DM.Books.Filter := filtr;
DM.Books.Filtered := true;
frmSearchBooks.Close();

end;

Есть скрин ошибки.
 

Вложения

  • 1.JPG
    1.JPG
    105,5 КБ · Просмотры: 383
L

LAW

По моему в этом случае было бы более правильно использовать SQL (SELECT FROM WHERE), потому как филтер не умеет пользоваться индексами. То есть скорость выборки может быть убийстевенно долгая.

Но вернёмся к твоим баранам. :)
Какого размера поля? И есть ли зависимости на них?

Странно что ты не используешь else :blink:
например:

Код:
 if (chbMPost.Checked = true) and (filtr <> ' ') then
filtr := filtr + ' and ' + 'BPUBLISH = ''' + edtMPost.Text + '''';
else filtr := 'BPUBLISH = ''' + edtMPost.Text + '''';
 
@

@rtem

поля 75 BNAME и 50 BPUBLISH типа CHAR, зависимостей нет.

поле BAUTHOR 50 тоже текстовое зависимостей нет, а вот фильтрация работает. :blink:

таблица эта типа справочника, где хранится список книг и данные по ним.
 
@

@rtem

LAW
По моему в этом случае было бы более правильно использовать SQL (SELECT FROM WHERE),Для:

При построении запроса на выборку с условием возникает таже ошибка, как выяснилось на эти поля есть индексы.
 
L

LAW

При построении запроса на выборку с условием возникает таже ошибка, как выяснилось на эти поля есть индексы.
Я что-то не понял... При выполнении селекта то же происходит урезание? :)
 
@

@rtem

Для: LAW
Я что-то не понял... При выполнении селекта то же происходит урезание? blink.gif

Именно при написании запроса типа:
Код:
select * from Books where (BName='......')

Вылетает аналогичная ошибка, это происходит только на этих двух полях. Хотя в таблице есть другие текстовые поля. :)
 
L

LAW

А в квери куда ты считываешь поля случаем нет предопределённого набора полей?
Что бы это посмотреть надо дважды кликнуть по Query.
Если есть удали все поля и попробуй выполнить селект заново.
 
@

@rtem

Что бы это посмотреть надо дважды кликнуть по Query.
;) , я догадывался об этом :p

Нет там никаких полей, я даже новый квери закинул, и селект заново написал. НЕТ всеравно ошибка :(
 
L

LAW

А на какой точно строке происходит данная ошибка? на Query->Open?
 
L

LAW

Я не про то. На какои именно строчке кода из приведённыхтобой выше?
 
@

@rtem

Для: LAW
при ошибке никакая строчка не выделяется красным как ошибка, если ты об этом.
 
L

LAW

Измним вопрос. Когда ты трассируешь по F8, то на каккой строке вылетает ошибка, показанная тобой на приложенном скриншоте?
 
M

MatlabX

BYEAR >= '''
BSTAND >= '''
BOPT >= '''

Привет! По моему ты не надо было использовать ''' - кавичек, и ты при это м отправляешь стрингивую полю, а тан в запросе (в фильтре) проверяешь как числовую.
По этому просто напиши место ''' - ' и все твои проблемы решутся ....

Пример:
место этого filtr := ' BQUAN >= ''' + edtMQuan1.Text + '''' + ' and BQUAN <= ''' + edtMQuan2.Text + '''';
надо вот так filtr := ' BQUAN >= ' + edtMQuan1.Text + ' and BQUAN <= ' + edtMQuan2.Text;
 
@

@rtem

Для: MatlabX
спасибо я попробую, но дело в том, что с этими полями и так все работает, а вот поля BNAME, BPUBLISH в них проблема. Но я гляну ответ напишу.
 
M

MatlabX

[/quote]а вот поля BNAME, BPUBLISH в них проблема[/quote]

По тоей ошибки ты место integer а отправляешь string. Попробуй как я написал, и пожалуюстя
напиши ответ.
 
@

@rtem

Для: LAW
Измним вопрос. Когда ты трассируешь по F8, то на каккой строке вылетает ошибка, показанная тобой на приложенном скриншоте?

Код:
 DM.AllQuery.Close();
DM.AllQuery.SQL.Text := memSQL_Editor.Lines.Text;
DM.AllQuery.Open(); <------- на этой строчке вылетает ошибка
Я не могу понять запрос составлен правильно, а ошибка вылетает. причем если делать полную выборку то все запрос работает, а если по условию и по этим полям то ошибка.

Для: MatlabX
пробывал возникает другая ошибка
Dinamyc SQL Error SQL Error code=-104, Token unknow -line2, char 17
 
A

Andromeda

Судя по скрину ошибки, при попытке преобразования кодировки строки происходит ошибка.
Тут надо уточнить, в какой кодировке хранятся поля BNAME и BPUBLISH в базе (я пользуюсь бесплатной оболочкой IBExpert для таких вещей) и какой порядок сортировки установлен для этих полей.

Второй вариант - это отсутствие языковых библиотек INTL - сервер не может получить информацию по правилам сортировки в разных кодовых страницах....
 
@

@rtem

Для: Andromeda Хм кодировка одна WIN 1251 :blink:
 
M

MatlabX

Код:
memSQL_Editor.Lines.Text

если сможешь отошли текст
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!