Nodejs и SQL - проблема со вставкой данных в SQL с использованием нескольких операторов выбора. - PullRequest
0 голосов
/ 08 мая 2020

Изображение ошибки
При вставке данных в SQL таблицу базы данных user_recipe_consuming с использованием нескольких операторов выбора, я столкнулся с ошибкой: throw err; // Повторно вывести не- MySQL ошибки ^ Ошибка: ER_PARSE_ERROR: у вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии MySQL сервера, чтобы найти правильный синтаксис для использования рядом с 'Mushroom pasta'); ' , '(выберите vegEmission из RecipeEmissions, где RecipeName' в строке 1

for (var dataVal = 0; dataVal < req.body.length; dataVal++) {
    var recipeInfo = req.body[dataVal].RecipeName;
    var deviceID = req.body[dataVal].deviceID;
    var totEmission = req.body[dataVal].totalEmission;
    var sql = "INSERT INTO user_recipe_consumption (deviceID, totalEmission, recipeID , vegEmission,date_of_entry) VALUES ('" + deviceID + "','" + totEmission + "', '( select RecipeID, from RecipeEmissions where RecipeName = ?);' , '( select vegEmission from RecipeEmissions where RecipeName = ? );' ,'" + now + "')";              
    con.query(sql, recipeInfo, function(err, result) {
            if (err) throw err;
            console.log("Number of records inserted: " + result.affectedRows);
        });
    }

Ответы [ 2 ]

1 голос
/ 08 мая 2020

Вместо SQL с объединенным var (и связанная проблема с типом данных и SQL инъекцией) вы должны использовать запрос, полностью основанный на привязке параметров (например: named param). Вы также должны использовать синтаксис выбора вставки вместо нескольких вариантов выбора из одной и той же таблицы

"INSERT INTO user_recipe_consumption (deviceID, totalEmission, recipeID , vegEmission,date_of_entry) 
SELECT :deviceID, :totEmissino,  RecipeID, vegEmission, :date_of_entry 
FROM RecipeEmissions 
where RecipeName = :RecipeName;"

например:

connection.execute(
    "INSERT INTO user_recipe_consumption (deviceID, totalEmission, recipeID , vegEmission,date_of_entry) 
    SELECT :deviceID, :totEmission ,  RecipeID, vegEmission, :date_of_entry 
    FROM RecipeEmissions 
    WHERE RecipeName = :RecipeName;",
    {deviceID: deviceID, totEmission: totEmission, date_of_entry:date_of_entry,RecipeName:RecipeName},
function(err, result)
.......
0 голосов
/ 08 мая 2020

В вашем операторе SQL слишком много точек с запятой. Вы также заключаете подзапрос в одинарные кавычки, что фактически превращает его в строковый литерал. И вы неправильно используете NOW(). Попробуйте это:

var sql = "INSERT INTO user_recipe_consumption (deviceID, totalEmission, recipeID , vegEmission,date_of_entry) VALUES ('" + deviceID + "','" + totEmission + "', ( select RecipeID, from RecipeEmissions where RecipeName = ?) , ( select vegEmission from RecipeEmissions where RecipeName = ? ) , NOW())";

Если вы имеете в виду, что now является переменной JS, тогда вы можете вернуть эту часть запроса к тому, что было у вас изначально, но неясно, что now предполагается содержать.

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