передача строки в запросе к базе данных MySQL в MATLAB - PullRequest
1 голос
/ 21 июля 2011

Я использую MySQL с MATLAB, и я хочу получить имя от пользователя и передать его в таблицу в mySQL, но она отклоняет имя переменной вместо строки

var_name=input('enter the name:');

mysql('insert into table (name) values (var_name)');

Любойпредложения?

Ответы [ 3 ]

3 голосов
/ 21 июля 2011

FIRST Прочтите комментарии к этому вопросу - вы не хотите стрелять себе в ногу из-за проблем с безопасностью инъекций mysql. Вы были предупреждены. Теперь, чтобы решить вашу текущую проблему, не обращаясь к риску безопасности всего подхода, когда речь идет о построении SQL-запросов, читайте дальше ...

В принципе, Amro уже опубликовал два решения для вас, которые работают, но, поскольку вы не приняли его, я объясню подробнее.

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

Между этими литеральными строками вы хотите добавить содержимое ваших переменных, поэтому вам нужно указать MATLAB, чтобы конкаталировали ваши литеральные строки с вашими переменными, поскольку команда mysql, вероятно, ожидает весь запрос как одна строка Поэтому, по сути, вы хотите взять строку 'insert to table (' и строку, сохраненную в переменной name и строку ') values ​​(' и т. Д. И склеить их в одну большую строку. Amro и Исаак показали вам два решения, как это сделать без особых объяснений:

horzcat('insert into table (', name, ') values (', var_name, ')')

использует функцию horzcat , а

['insert into table (' name ') values (' var_name ')']

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

Третье решение, предлагаемое Amro, немного сложнее:

sprintf('insert into table (%s) values (%s)',name,var_name)

Он сообщает функции sprintf (которая сделана для этой цели) "взять строку, которую я предоставляю в качестве первого параметра, и заменить вхождения %s на строки, которые я предоставляю, в качестве следующих параметров Этот последний метод особенно полезен, если вам также необходимо вставить числа в строку, поскольку sprintf также может преобразовывать числа в строку и позволяет точно контролировать их форматирование. Вам следует внимательно изучить Страница справки для sprintf , чтобы узнать больше: -).

2 голосов
/ 21 июля 2011

Попробуйте вместо этого:

mysql(['insert into table (' name ') values (' var_name ')']);

или даже:

mysql(sprintf('insert into table (%s) values (%s)',name,var_name));
1 голос
/ 21 июля 2011

Я полагаю, что проблема, с которой вы столкнулись, такая же, как и в в этом другом вопросе . Звучит так, будто вы хотите создать командную строку, которая сама содержит строку с разделителями ', которая потребует от вас экранировать каждую ' с другой ' при создании командной строки (обратите внимание на первый пример в эта строка обрабатывает документацию ). Также обратите внимание, что вы можете использовать опцию 's' для функции INPUT :

var_name = input('Enter the name: ','s');  %# Treats input like a string
commandString = sprintf('insert into table (name) values (''%s'')', var_name);
                            %# Note the two apostrophes --^
mysql(commandString);

Если бы я ввел Ken для ввода, строка commandString будет содержать следующее:

insert into table (name) values ('Ken')

И, конечно, как уже упоминали другие, остерегайтесь уязвимостей внедрения .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...