Конвертация текста для sql

proffman

Client
Регистрация
24.01.2013
Сообщения
547
Благодарностей
51
Баллы
28
Доброго времени суток!)
Давно на форуме не был, возникла проблема при копировании текста в базу данных. Например, экранировать одинарные кавычки добавляя еще одну это понятно. Но бывают случаи и двсе сразу кавычки могут быть, а с заменой уже получатся 3.

Текст очень большой и хз что там еще может быть.... Потому и нужен сниппет который на вход из переменной подавался бы текст а на выходе уже получили бы отформатированный текст с нужным нам синтаксисом sql.

Заранее спасибочки за помощь!)))))
 

Dimionix

Moderator
Регистрация
09.04.2011
Сообщения
3 068
Благодарностей
3 105
Баллы
113
Экшен "Обработка текста - Escape строки"
 

proffman

Client
Регистрация
24.01.2013
Сообщения
547
Благодарностей
51
Баллы
28
Регистрация
08.07.2015
Сообщения
2 848
Благодарностей
712
Баллы
113

proffman

Client
Регистрация
24.01.2013
Сообщения
547
Благодарностей
51
Баллы
28

Dimionix

Moderator
Регистрация
09.04.2011
Сообщения
3 068
Благодарностей
3 105
Баллы
113

Gfoblin

Client
Регистрация
30.05.2013
Сообщения
4 521
Благодарностей
991
Баллы
113
замена
' на \'
когда будете выдерать то обратно...
ну или
" на \"
 

proffman

Client
Регистрация
24.01.2013
Сообщения
547
Благодарностей
51
Баллы
28
замена
' на \'
когда будете выдерать то обратно...
ну или
" на \"
Вчера так пробовал, работает. Сегодня почему то забыл.. А разьве только одинарные кавычки нужно экранировать, нет больше каких-то спец символов? А то вдруг попадутся..

Вот если данным способом экранировать повторные одинарные кавычки \'\'тест\'\', то на выходе получим »тест».... Я вот думаю, наверняка должен быть для этого снипет?
 
Регистрация
08.07.2015
Сообщения
2 848
Благодарностей
712
Баллы
113

proffman

Client
Регистрация
24.01.2013
Сообщения
547
Благодарностей
51
Баллы
28
Хотелось бы более рациональный и рабочий способ для этого...
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 613
Благодарностей
4 601
Баллы
113
суть экрана в том, чтобы синтаксис скл записи не нарушался. Если переменные обрамлены в одинарные кавычки - экранируем одинарные кавычки и слэши \
Обрамлены в двойные - двойные и слэши
 

Gfoblin

Client
Регистрация
30.05.2013
Сообщения
4 521
Благодарностей
991
Баллы
113
Хотелось бы более рациональный и рабочий способ для этого...
суть экрана в том, чтобы синтаксис скл записи не нарушался. Если переменные обрамлены в одинарные кавычки - экранируем одинарные кавычки и слэши \
Обрамлены в двойные - двойные и слэши
Вот точно так оно и есть!
На пхп юзаю http://php.net/manual/ru/function.htmlspecialchars.php с ENT_QUOTES - на шарпе я хз мож есть что подобное...

И да смотри на кодировку ) UTF-8 или win у тебя...
 
Регистрация
08.07.2015
Сообщения
2 848
Благодарностей
712
Баллы
113
  • Спасибо
Реакции: proffman

Gfoblin

Client
Регистрация
30.05.2013
Сообщения
4 521
Благодарностей
991
Баллы
113

arhip1985

Client
Регистрация
31.10.2011
Сообщения
2 955
Благодарностей
781
Баллы
113
на си вроде вот это Server.HTMLencode , но там какие-то исключения надо учитывать
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 613
Благодарностей
4 601
Баллы
113
Вот точно так оно и есть!
На пхп юзаю http://php.net/manual/ru/function.htmlspecialchars.php с ENT_QUOTES - на шарпе я хз мож есть что подобное...

И да смотри на кодировку ) UTF-8 или win у тебя...
я однокурснику перед сдачей его курсовой сайт положил скл инъекцией. Он теперь тоже эти функции юзает)
 

Gfoblin

Client
Регистрация
30.05.2013
Сообщения
4 521
Благодарностей
991
Баллы
113

Gfoblin

Client
Регистрация
30.05.2013
Сообщения
4 521
Благодарностей
991
Баллы
113
я однокурснику перед сдачей его курсовой сайт положил скл инъекцией. Он теперь тоже эти функции юзает)
да это первое от чего помогает ) я по паранои ваще base64 кодил )
 

proffman

Client
Регистрация
24.01.2013
Сообщения
547
Благодарностей
51
Баллы
28

Gfoblin

Client
Регистрация
30.05.2013
Сообщения
4 521
Благодарностей
991
Баллы
113
Регистрация
08.07.2015
Сообщения
2 848
Благодарностей
712
Баллы
113

arhip1985

Client
Регистрация
31.10.2011
Сообщения
2 955
Благодарностей
781
Баллы
113
вот решение на javascript , вроде пишут, что работает:
Код:
function htmlspecialchars (string, quote_style, charset, double_encode) {
  var optTemp = 0,i = 0,noquotes = false;
  if (typeof quote_style === 'undefined' || quote_style === null) {
    quote_style = 2;
  }
  string = string+'';
  if (double_encode !== false) { // Put this first to avoid double-encoding
    string = string.replace(/&/g, '&');
  }
  string = string.replace(/</g, '<').replace(/>/g, '>');
  var OPTS = {
    'ENT_NOQUOTES': 0,
    'ENT_HTML_QUOTE_SINGLE': 1,
    'ENT_HTML_QUOTE_DOUBLE': 2,
    'ENT_COMPAT': 2,
    'ENT_QUOTES': 3,
    'ENT_IGNORE': 4
  };
  if ( quote_style === 0 ) {
    noquotes = true;
  }
  if (typeof quote_style !== 'number') { // Allow for a single string or an array of string flags
    quote_style = [].concat(quote_style);
    for (i = 0; i < quote_style.length; i++) {
      // Resolve string input to bitwise e.g. 'ENT_IGNORE' becomes 4
      if (OPTS[quote_style[i]] === 0) {
        noquotes = true;
      }else if (OPTS[quote_style[i]]) {
        optTemp = optTemp | OPTS[quote_style[i]];
      }
    }
    quote_style = optTemp;
  }
  if (quote_style & OPTS.ENT_HTML_QUOTE_SINGLE) {
    string = string.replace(/'/g, '&#039;');
  }
  if (!noquotes) {
    string = string.replace(/"/g, '"');
  }
  return string;
}
 
  • Спасибо
Реакции: proffman

Gfoblin

Client
Регистрация
30.05.2013
Сообщения
4 521
Благодарностей
991
Баллы
113
Ага, вот и говорю что получится - \'\'тест\'\', на выходе »тест».
если че тебе надо экранить ток сам текст, а не запрос целиком... причем как выше написали или ' или "
 
Регистрация
08.07.2015
Сообщения
2 848
Благодарностей
712
Баллы
113
если че тебе надо экранить ток сам текст, а не запрос целиком... причем как выше написали или ' или "
а что заменить все ' на " перед экранированием нельзя ?
Или как в коде выше заменить все ' на &#039;
 
  • Спасибо
Реакции: proffman

proffman

Client
Регистрация
24.01.2013
Сообщения
547
Благодарностей
51
Баллы
28
вот решение на javascript , вроде пишут, что работает:
Код:
function htmlspecialchars (string, quote_style, charset, double_encode) {
  var optTemp = 0,i = 0,noquotes = false;
  if (typeof quote_style === 'undefined' || quote_style === null) {
    quote_style = 2;
  }
  string = string+'';
  if (double_encode !== false) { // Put this first to avoid double-encoding
    string = string.replace(/&/g, '&amp;');
  }
  string = string.replace(/</g, '<').replace(/>/g, '>');
  var OPTS = {
    'ENT_NOQUOTES': 0,
    'ENT_HTML_QUOTE_SINGLE': 1,
    'ENT_HTML_QUOTE_DOUBLE': 2,
    'ENT_COMPAT': 2,
    'ENT_QUOTES': 3,
    'ENT_IGNORE': 4
  };
  if ( quote_style === 0 ) {
    noquotes = true;
  }
  if (typeof quote_style !== 'number') { // Allow for a single string or an array of string flags
    quote_style = [].concat(quote_style);
    for (i = 0; i < quote_style.length; i++) {
      // Resolve string input to bitwise e.g. 'ENT_IGNORE' becomes 4
      if (OPTS[quote_style[i]] === 0) {
        noquotes = true;
      }else if (OPTS[quote_style[i]]) {
        optTemp = optTemp | OPTS[quote_style[i]];
      }
    }
    quote_style = optTemp;
  }
  if (quote_style & OPTS.ENT_HTML_QUOTE_SINGLE) {
    string = string.replace(/'/g, '&#039;');
  }
  if (!noquotes) {
    string = string.replace(/"/g, '"');
  }
  return string;
}
Возвращает в логе ошибку "Компиляция кода Ошибка в действии 'СБ1012' Превышение допустимого числа символов в символьной константе'. [Строка: 37; Столбец: 37]"
 
Регистрация
08.07.2015
Сообщения
2 848
Благодарностей
712
Баллы
113
вот решение на javascript , вроде пишут, что работает:
как сюда переменную прикрутить, чтобы из переменной текст JS обрабатывал?
JavaScript:
function htmlspecialchars (string, quote_style, charset, double_encode) {
  var optTemp = 0,i = 0,noquotes = false;
  if (typeof quote_style === 'undefined' || quote_style === null) {
    quote_style = 2;
  }
  string = string+'';
  if (double_encode !== false) { // Put this first to avoid double-encoding
    string = string.replace(/&/g, '&amp;');
  }
  string = string.replace(/</g, '<').replace(/>/g, '>');
  var OPTS = {
    'ENT_NOQUOTES': 0,
    'ENT_HTML_QUOTE_SINGLE': 1,
    'ENT_HTML_QUOTE_DOUBLE': 2,
    'ENT_COMPAT': 2,
    'ENT_QUOTES': 3,
    'ENT_IGNORE': 4
  };
  if ( quote_style === 0 ) {
    noquotes = true;
  }
  if (typeof quote_style !== 'number') { // Allow for a single string or an array of string flags
    quote_style = [].concat(quote_style);
    for (i = 0; i < quote_style.length; i++) {
      // Resolve string input to bitwise e.g. 'ENT_IGNORE' becomes 4
      if (OPTS[quote_style[i]] === 0) {
        noquotes = true;
      }else if (OPTS[quote_style[i]]) {
        optTemp = optTemp | OPTS[quote_style[i]];
      }
    }
    quote_style = optTemp;
  }
  if (quote_style & OPTS.ENT_HTML_QUOTE_SINGLE) {
    string = string.replace(/'/g, '&#039;');
  }
  if (!noquotes) {
    string = string.replace(/"/g, '"');
  }
  return string;
}
 

proffman

Client
Регистрация
24.01.2013
Сообщения
547
Благодарностей
51
Баллы
28
а что заменить все ' на " перед экранированием нельзя ?
Или как в коде выше заменить все ' на &#039;
как сюда переменную прикрутить, чтобы из переменной текст JS обрабатывал?
JavaScript:
function htmlspecialchars (string, quote_style, charset, double_encode) {
  var optTemp = 0,i = 0,noquotes = false;
  if (typeof quote_style === 'undefined' || quote_style === null) {
    quote_style = 2;
  }
  string = string+'';
  if (double_encode !== false) { // Put this first to avoid double-encoding
    string = string.replace(/&/g, '&amp;');
  }
  string = string.replace(/</g, '<').replace(/>/g, '>');
  var OPTS = {
    'ENT_NOQUOTES': 0,
    'ENT_HTML_QUOTE_SINGLE': 1,
    'ENT_HTML_QUOTE_DOUBLE': 2,
    'ENT_COMPAT': 2,
    'ENT_QUOTES': 3,
    'ENT_IGNORE': 4
  };
  if ( quote_style === 0 ) {
    noquotes = true;
  }
  if (typeof quote_style !== 'number') { // Allow for a single string or an array of string flags
    quote_style = [].concat(quote_style);
    for (i = 0; i < quote_style.length; i++) {
      // Resolve string input to bitwise e.g. 'ENT_IGNORE' becomes 4
      if (OPTS[quote_style[i]] === 0) {
        noquotes = true;
      }else if (OPTS[quote_style[i]]) {
        optTemp = optTemp | OPTS[quote_style[i]];
      }
    }
    quote_style = optTemp;
  }
  if (quote_style & OPTS.ENT_HTML_QUOTE_SINGLE) {
    string = string.replace(/'/g, '&#039;');
  }
  if (!noquotes) {
    string = string.replace(/"/g, '"');
  }
  return string;
}
Да проблема в том что &#039; выводит на экран. Та же ошибка в коде на том-же самом месте...(
 

proffman

Client
Регистрация
24.01.2013
Сообщения
547
Благодарностей
51
Баллы
28

proffman

Client
Регистрация
24.01.2013
Сообщения
547
Благодарностей
51
Баллы
28
вот решение на javascript , вроде пишут, что работает:
Код:
function htmlspecialchars (string, quote_style, charset, double_encode) {
  var optTemp = 0,i = 0,noquotes = false;
  if (typeof quote_style === 'undefined' || quote_style === null) {
    quote_style = 2;
  }
  string = string+'';
  if (double_encode !== false) { // Put this first to avoid double-encoding
    string = string.replace(/&/g, '&amp;');
  }
  string = string.replace(/</g, '<').replace(/>/g, '>');
  var OPTS = {
    'ENT_NOQUOTES': 0,
    'ENT_HTML_QUOTE_SINGLE': 1,
    'ENT_HTML_QUOTE_DOUBLE': 2,
    'ENT_COMPAT': 2,
    'ENT_QUOTES': 3,
    'ENT_IGNORE': 4
  };
  if ( quote_style === 0 ) {
    noquotes = true;
  }
  if (typeof quote_style !== 'number') { // Allow for a single string or an array of string flags
    quote_style = [].concat(quote_style);
    for (i = 0; i < quote_style.length; i++) {
      // Resolve string input to bitwise e.g. 'ENT_IGNORE' becomes 4
      if (OPTS[quote_style[i]] === 0) {
        noquotes = true;
      }else if (OPTS[quote_style[i]]) {
        optTemp = optTemp | OPTS[quote_style[i]];
      }
    }
    quote_style = optTemp;
  }
  if (quote_style & OPTS.ENT_HTML_QUOTE_SINGLE) {
    string = string.replace(/'/g, '&#039;');
  }
  if (!noquotes) {
    string = string.replace(/"/g, '"');
  }
  return string;
}
Честно говоря я тут нифига не понял( Возвращает undefined, он же при входе чистый без кавычек или че то не доулавливаю..
P.S. Присоединяюсь к вопросу как тут переменную прикрутить чтобы из неё брало текст.
 

proffman

Client
Регистрация
24.01.2013
Сообщения
547
Благодарностей
51
Баллы
28
-
 
Последнее редактирование:

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)