Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.03.2013, 09:03   #1
bakanaev
Форумчанин
 
Регистрация: 27.03.2012
Сообщений: 438
По умолчанию ADOQuery какие символы нужно экранировать ?

Сабж. Пользователь указывает данные и софт закидывает их в БД.
Знаю что нужно '"\, какие еще ?
Может в ADOQuery есть аналог php функции addslashes?
Спасибо
bakanaev вне форума Ответить с цитированием
Старый 20.03.2013, 09:12   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

а для чего Вы собираетесь экранировать символы?!
Если правильно пользоваться ADOQuery - то вообще ничего экранировать не нужно!
Откройте для себя параметры (параметрические запросы).
И всё.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 20.03.2013, 09:14   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Не понял...
Зачем экранировать? И главное - чем?
Передавай по параметру - там никакого экрана не нужно.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 20.03.2013, 09:18   #4
bakanaev
Форумчанин
 
Регистрация: 27.03.2012
Сообщений: 438
По умолчанию

Цитата:
ADOQuery.SQL.Add('INSERT INTO info (login_data, frend_id, posted_time) VALUES ("'+account+'", "'+frend_id+'", NOW());');
account может быть таким
Цитата:
olol'
account вводит сам пользователь, если не экранировать кавычку то будет ошибка
И главное - чем?
Цитата:
olol\'
Пройдет на ура
bakanaev вне форума Ответить с цитированием
Старый 20.03.2013, 09:30   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

bakanaev, повторяю:

откройте для себя ПАРАМЕТРЫ в запросе!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 20.03.2013, 09:32   #6
bakanaev
Форумчанин
 
Регистрация: 27.03.2012
Сообщений: 438
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
bakanaev, повторяю:

откройте для себя ПАРАМЕТРЫ в запросе!
Не понимаю о чем Вы)
Ткните носом )
UPD: Нашел

Последний раз редактировалось bakanaev; 20.03.2013 в 09:51.
bakanaev вне форума Ответить с цитированием
Старый 20.03.2013, 12:51   #7
bakanaev
Форумчанин
 
Регистрация: 27.03.2012
Сообщений: 438
По умолчанию

откройте для себя ПАРАМЕТРЫ в запросе!
В итоге толку ноль!
Вот пример
Код:
     ADOQuery.SQL.Add('SELECT * FROM info WHERE login_data=:account');
     ADOQuery.Parameters.ParamByName('account').Value := account;
     CoInitialize(0);
     ADOQuery.Open();
     CoUninitialize();
В account попадает строка :"машенька" (вместе с кавычками)
В ответ получаем
Цитата:
[9:47:12 AM] :"машенька"| [MySQL][ODBC 5.2(w) Driver][mysqld-5.6.10]You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'машенька""' at line 1
bakanaev вне форума Ответить с цитированием
Старый 20.03.2013, 13:26   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
function ShieldingSymbols(Text: String): String;
const OldSymbols: array[0..6] of String = ('\',#39,#34,#0,#10,#13,#26);
      NewSymbols: array[0..6] of String = ('\\','\'#39,'\'#34,'\0','\n','\r','\Z');
var i: Integer;
begin
  for i:=Low(OldSymbols) to High(OldSymbols) do
    Result:=StringReplace(Text,OldSymbols[i],NewSymbols[i],[rfReplaceAll]);
end;
Как-то так. Насчет всего перечня символов для MySQL не уверен. С таким поведением ADOQuery не сталкивался, возможно глюк одебисишного провайдера. Не зря на форумах рекомендуют специализированные компоненты для MySQL дабы не набивать шишек в связке ADO-MySQL
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 20.03.2013, 13:29   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

попробуйте так:
Код:
     ADOQuery.Close;
     ADOQuery.SQL.Clear;
     ADOQuery.SQL.Add('SELECT * FROM info WHERE login_data=:account');
     ADOQuery.Parameters.ParamByName('account').Value := account;
     ADOQuery.Open();
p.s. кстати, удобство использования параметрами состоит ещё и в том, что запрос не обязательно прописывать КАЖДЫЙ раз. Достаточно сделать это ОДИН раз (можно даже в DesignTime) и потом менять только параметр (ну и переоткрывая запрос, разумеется)
Serge_Bliznykov вне форума Ответить с цитированием
Старый 20.03.2013, 13:31   #10
bakanaev
Форумчанин
 
Регистрация: 27.03.2012
Сообщений: 438
По умолчанию

Аватар да суть то в том что и в php тоже самое, если не используется экранирующая функция addslashes или ее аналоги. Это ведь SQL Inj)
А так спасибо конечно за функцию )

Последний раз редактировалось bakanaev; 20.03.2013 в 14:18.
bakanaev вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Даны 3 массива символов. Определить какие символы входят в состав всех трёх массивов VENOMIK Паскаль, Turbo Pascal, PascalABC.NET 9 07.12.2011 18:17
SaveDialog и какие-то странные символы Tycuk Компоненты Delphi 5 25.10.2010 14:23
Параметры в Adoquery, Обнаружены символы за пределами инструкции SQL ulala Помощь студентам 0 15.10.2010 15:38
какие знания языков нужно для создания бота frikziks Свободное общение 0 30.09.2010 21:04
какие еще книги нужно читать MeGaTpoH Свободное общение 18 05.04.2009 03:09