Эквивалент php's mysql_real_escape_string - PullRequest
4 голосов
/ 16 декабря 2011

Мне нужен динамический SQL для вставки большого количества значений в базу данных.

INSERT INTO table1 (a,b,c,d) VALUES (1,2,3,'string with possible quotes'),....

Поскольку я хочу вставить около 1000 строк на пакет, параметры на самом деле не подходят.
В php я бы использовал mysql_ lib и mysql_real_escape_string для предотвращения ошибок и SQL-инъекций.

Как мне избежать строковых значений в Delphi?

1 Ответ

11 голосов
/ 16 декабря 2011

Некоторое время назад я написал эквивалентную функцию delphi, следуя документации MySql о функции mysql_real_escape_string.

Строка в from кодируется в экранированную строку SQL,с учетом текущего набора символов соединения.Результат помещается в и добавляется завершающий нулевой байт.Кодируются следующие символы: «\», «'», «» », NUL (ASCII 0),« \ n »,« \ r »и Control + Z. Строго говоря, MySQL требует только того, чтобы использовалась обратная косая черта и символ кавычек длязаключать в кавычки строку в запросе. mysql_real_escape_string () заключает в кавычки другие символы, чтобы их было легче читать в файлах журналов

очевидно, что часть ..taking into account the current character set of the connection здесь игнорируется.

function StringReplaceExt(const S : string; OldPattern, NewPattern:  array of string; Flags: TReplaceFlags):string;
var
 i : integer;
begin
   Assert(Length(OldPattern)=(Length(NewPattern)));
   Result:=S;
   for  i:= Low(OldPattern) to High(OldPattern) do
    Result:=StringReplace(Result,OldPattern[i], NewPattern[i], Flags);
end;

function mysql_real_escape_string(const unescaped_string : string ) : string;
begin
  Result:=StringReplaceExt(unescaped_string,
    ['\', #39, #34, #0, #10, #13, #26], ['\\','\'#39,'\'#34,'\0','\n','\r','\Z'] ,
    [rfReplaceAll]
  );
end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...