#mysql #sql #node.js
#mysql #sql #node.js
Вопрос:
Я пытаюсь передать данные из Webscraper в базу данных MySQL. У меня есть много переменных, которые нужно вводить одновременно в базу данных, и ниже приведен фрагмент кода, который я использую. (где etc. есть еще куча переменных.
con.query(INSERT INTO Paper_2 (referenceCodeSubject,referenceCode,subject, etc.) values ('" referenceCodeSubject "','" referenceCode "','" subject "', etc.))
Столбцы в базе данных имеют типы INT, VARCHAR и CHAR .
Моя проблема в том, что при очистке не всем переменным будут присвоены значения, и они останутся как ‘null’, и я не могу передать это значение null как NULL в MySQL. Также было бы довольно сложно сортировать разные случаи, когда передавать что из-за большого количества переменных.
Я надеюсь, что есть простой способ сделать это, поскольку единственные решения, которые я видел до сих пор, — это опустить значение в запросе (что сложно, потому что тогда мне нужно будет решить, какие значения опустить) или передать строку «NULL» или просто значение 0. Есть ли какой-либо другой способ сделать это?
Комментарии:
1. Разве вы не используете параметризованные запросы? Я надеюсь, что вы не используете конкатенацию строк, так вы открываете себя уязвимостям SQL-инъекций.
2. показать свой код?
3. эй, не беспокойтесь о SQL-инъекции, поскольку я использую puppeteer для очистки элементов и сохранения их локально в базе данных MySQL.
4. коды действительно длинные, как 500 строк, и, вероятно, не очень эффективны (я большой новичок), поэтому я не уверен, что стоит делиться. Однако он выполняет свою работу, не хватает только этого последнего шага.
Ответ №1:
Лучше используйте встроенную функцию экранирования, чтобы избежать атак SQL-инъекций!
conn.query(
'INSERT INTO Paper_2 (referenceCodeSubject,referenceCode,subject) VALUES ?'
[
['refCodeSubject1', 'refCode1', 'subject1'],
['refCodeSubject2', 'refCode2', null]
],
(error, results, fields) => {
...
}
)
Комментарии:
1. насколько я понимаю, инъекционные атаки не являются проблемой. Я использую puppeteer для сбора данных и сохранения их в локальной базе данных MySQL, к которой есть доступ только у меня (я действительно новичок в этом, поэтому могу ошибаться). Означает ли предлагаемое вами решение, что я должен хранить переменные в виде массива?
2. Не обязательно, мое решение предполагает использование встроенного экранирования для предоставления значений, хотя бы для правильного предоставления нулевого значения. Нравится
conn.query('SELECT ?', [null], (error, result) => { ... });