Node js - Mysql запрос не выполняется в кодированном виде - PullRequest
0 голосов
/ 01 августа 2020

Я создал несколько операторов sql в node.js и теперь хочу выполнить их в своей базе данных. Однако строка запроса не выполняется так, как закодировано.

Это моя функция для генерации строки запроса.

function insertProducts(products) {
    if (!connection) {
        // Create MYSQL-Connection
        console.log('BUILDING connection to DB');
        connection = getConnection();
        connection.connect();
    }

    let query = "";
    for (let i = 0; i < products.length; i++) {
// Iterate trough the products array and create a sql query
        query += "INSERT INTO `tShortDescription`(`ShortDescription`, `Language`) VALUES ('" + products[i].short_description + "', 'DE'); " +
            "INSERT INTO `tDescription`(`Description`, `Language`) VALUES ('" + products[i].description + "', 'DE'); " +
            "INSERT INTO `tManufacturer`(`Name`) VALUES ('" + products[i].manufactur + "'); " +
            "INSERT INTO `tSupplier`(`Name`) VALUES ('" + products[i].supplier + "'); " +

            "INSERT INTO `tProduct`(`Sku`, `Title`, `ShortDescriptionId`, `DescriptionId`, `WohlesalePrice`, `SellingPrice`, `Quantity`, " +
            "`ManufacturerId`, `SupplierId`, `Ean`) VALUES ('" + products[i].sku + "', '" + products[i].name + "', " +
            "(SELECT id FROM tShortDescription WHERE ShortDescription = '" + products[i].short_description + "' LIMIT 1), " +
            "(SELECT id FROM tDescription WHERE Description LIKE '" + products[i].description + "' LIMIT 1), " +
            products[i].wholesale_price + ", " + products[i].selling_price + ", " + products[i].quantity + ", " +
            "(SELECT id FROM tManufacturer WHERE Name = '" + products[i].manufactur + "' LIMIT 1), " +
            "(SELECT id FROM tSupplier WHERE Name = '" + products[i].supplier + "' LIMIT 1), " + products[i].ean + "); ";

        for (let j = 0; j < products[i].categories.length; j++) {
            // Ad all categories to query
            query += "INSERT INTO `rtCategory`(`ProductId`, `CategoryId`) " +
                "VALUES ((SELECT `Id` FROM `tProduct` WHERE sku = '" + products[i].sku + "' LIMIT 1), " +
                "(SELECT `Id` FROM `tCategory` WHERE Id = " + products[i].categories[j].src + " LIMIT 1)); "

            for (let c = 0; c < products[i].images.length; c++) {
                // Ad all images to query
                query += "INSERT INTO `tImage`(`Url`) VALUES ('" + products[i].images[c].src + "'); " +
                    "INSERT INTO `rtImage`(`ProductId`, `ImageId`) " +
                    "VALUES ((SELECT `Id` FROM `tProduct` WHERE sku = '" + products[i].sku + "' LIMIT 1), " +
                    "(SELECT `Id` FROM `tImage` WHERE url = '" + products[i].images[c].src + "' LIMIT 1)); "
            }
        }
    }

    query = query.replace(/[\n\r\t]/g,);

    if (query != "") {
        // Create new Product in DB 
        return new Promise((resolve, reject) => {
            connection.query(query, function (error, results, fields) {
                if (error) { console.log(error) };
                console.log('INSERTING successful');
                resolve(results);
            });
        });
    } else {
        console.log('There are no new products to insert in db');
    }
}

If i console.log(query) (до того, как запрос будет выведен на мой db ) и выполнить строку непосредственно в php myadmin, все работает нормально, но если я выполню запрос в коде типа connection.query(query, function (error, results, fields)....., у меня будет несколько ошибок.

Сообщение об ошибке в терминале:

code: 'ER_PARSE_ERROR',
  errno: 1064,
  sqlMessage: "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'INSERT INTO `tDescription`(`Description`, `Language`) VALUES ('<p><strong>Tantra' at line 1",
  sqlState: '42000',
  index: 0,

Я также получаю запрос sql, возвращенный в терминале из-за ошибки, и если я выполняю этот запрос непосредственно в php myadmin, я также получаю сообщение об ошибке ->

SQL query: Documentation


INSERT INTO `rtImage`(`ProductId`, `ImageId`) VALUES ((SELECT `Id` FROM `tProduct` WHERE sku = 'H1500148' LM 
IT 1), (SELECT `Id` FROM `tImage` WHERE url = 'https://cdnbigbuy.com/images/H1500148_409897.jpg' LIMIT 1))
MySQL said: Documentation

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'LM
IT 1), (SELECT `Id` FROM `tImage` WHERE url = 'https://cdnbigbuy.com/images' at line 1

Это выглядит как если LIMIT каким-то образом разделен ...use near 'LM IT 1)....

Надеюсь, вы понимаете, в чем проблема, и у кого-то может быть подсказка.

Ответы [ 2 ]

0 голосов
/ 04 августа 2020

Спасибо за полезные советы.

Проблема была в том, что я не установил multiple statements: true в своем коде. Эта переменная по умолчанию ложна и должна быть истинной, иначе невозможно выполнить несколько запросов за один запрос!

0 голосов
/ 01 августа 2020

Ваш запрос обрабатывается как 'LIMIT', это просто новая строка в консоли, в которой обнаружена ошибка.

Вы не должны использовать конкатенацию строк (или даже шаблонные литералы) для SQL запросов под любые обстоятельства, потому что 1. Скорее всего, это источник вашей проблемы. 2. Это очень опасно, так как допускает SQL инъекционных атак.

Вместо этого используйте параметры. Вот пример:

connection.query("SELECT * FROM bank_accounts WHERE dob = ? AND bank_account = ?",[
     req.body.dob,
     req.body.account_number
    ],function(error, results){});

Чтобы узнать больше о SQL инъекциях и заполнителях , прочтите эту статью.

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