Имя: Пароль:
1C
1C 7.7
v7: Как лучше экранировать MySQL запрос
0 sysadminlk
 
08.10.24
06:54
db = СоздатьОбъект("ADODB.Connection");
    db.Open("driver={MySQL ODBC 5.1 Driver}; server="+ИпСервера+"; uid="+userid+"; pwd="+password+"; database="+database+"; port=3306; STMT=SET CHARACTER SET cp1251");
    Сообщить(db.State);
    str = "Patrick O'Reilly";
    qString = db.qStr(str);
    SQL = "SELECT * FROM names WHERE name="+qString+"";
    Сообщить(SQL);
    db.Close();
    db="";




1
qString = db.qStr(str);
{D:\ДЛЯТЕСТОВ.ERT(51)}: ADODB.Connection: Аргументы имеют неверный тип, выходят за пределы допустимого диапазона или вступают в конфликт друг с другом.
1 formista2000
 
08.10.24
07:51
Что значит "экранировать запрос"? О.о
2 AlexKimp
 
08.10.24
08:02
https://dev.mysql.com/doc/refman/8.4/en/string-type-syntax.html

перевожу на русский:
  SQL = "SELECT * FROM names WHERE name='"+qString+"'";

по вопросу ирландской фамилии:
https://dev.mysql.com/doc/refman/8.4/en/string-literals.html
3 AlexKimp
 
08.10.24
08:02
(2)+

ну там СтрЗаменить спец символы на экраны.

смотря, какие данные можем ожидать.

конкретно с товарищем ирландцем можно в запросе параметр обернуть не в ', а в ", тогда экран для ' в фамилии не потребуется
4 Волшебник
 
08.10.24
08:02
(2) сработает ли на имени? Patrick O'Reilly
5 Волшебник
 
08.10.24
08:03
(3) А что если там будет другая фамилия, например, Doctor "Who"
6 AlexKimp
 
08.10.24
08:12
(5) вот поэтому я и указал пункт "смотря, какие данные можем ожидать". разумеется, предварительная обработка параметров на предмет экранирования спецсимволов предпочтительнее
7 sysadminlk
 
08.10.24
09:06
Функция СтрMySQL(Вход)
    Истина=-1;
    Ложь=0;
    RegExp = CreateObject("VBScript.RegExp");
    RegExp.IgnoreCase = Истина; //Игнорировать регистр
    RegExp.Global = Истина; //Поиск всех вхождений шаблона
    RegExp.MultiLine = Истина; //Многострочный режим
    RegExp.Pattern = "(')|(\\)";
    Возврат RegExp.Replace(Вход, "\$&");
КонецФункции


По идее как-то так тогда должно работать
8 AlexKimp
 
08.10.24
10:00
(7) Да, и не забыть в кавычки - одинарные или двойные - обернуть строковые параметры. и литералы типа дата тоже (не уверен, нет времени глянуть, дата вродь ток в одинарные. но это не точно).