MySQL таинственным образом добавляет VALUES

У меня есть этот код в моем проекте

app.post('/history/form/confirm', isLoggedIn, (req,res)=>{
        let code = req.body.pcode,
        quanti = req.body.qty, 
        price = req.body.price, 
        cust = req.body.orderedBy, 
        oDate = req.body.orderDate; 
        [code].forEach((product, index, arr) =>{
            const q = quanti[index];
            let sql = `INSERT INTO inventory.orders (productCode, productName, unitPrice, quantity, totalPrice, customer, date)
                       VALUES (`+con.escape(product)+`, (SELECT productName FROM inventory.receive WHERE productCode = `+con.escape(product)+`), (SELECT unitPrice FROM inventory.receive WHERE productCode = `+con.escape(product)+`), `+con.escape(q)+`,`+con.escape(price)+`,`+con.escape(cust)+`,`+con.escape(oDate)+`)`
            con.query(sql, (err,result)=>{
                if (!err){
                    req.flash('historyMessage', 'Order Created')
                    res.redirect('/admin/history')
                }
                else{
                    res.status(404).send(err);
                }
            })
        })
    });

let sql = `INSERT INTO inventory.orders (productCode, productName, unitPrice, quantity, totalPrice, customer, date) VALUES (`+con.escape(product)+`, (SELECT productName FROM inventory.receive WHERE productCode = `+con.escape(product)+`), (SELECT unitPrice FROM inventory.receive WHERE productCode = `+con.escape(product)+`), `+con.escape(q)+`,`+con.escape(price)+`,`+con.escape(cust)+`,`+con.escape(oDate)+`)`

тогда я получаю эту ошибку MySQL таинственным образом добавляет VALUES

он добавляет еще два столбца к VALUES, даже если у меня есть только 8 столбцов в моей таблице, а идентификатор автоматически увеличивается

MySQL таинственным образом добавляет VALUES

Что может быть виновником?

Я пробовал другие способы кодирования, такие как отсутствие подзапроса, и по какой-то причине он все еще добавляет эти 3 дополнительных значения.

ЗДЕСЬ код из моего другого проекта, но я не использовал Select, потому что я не получил другие значения из других таблиц

.post("/send-data", (req,res)=>{
        let order = req.body.OrderNo;
        let quantity = req.body.quantity;
        let first = req.body.fname, 
        last = req.body.lname,
        contact = req.body.Contact,
        email = req.body.emailAdd,
        fb = req.body.facebook,
        date = req.body.date,
        delivery = req.body.delivery,
        payment = req.body.payment,
        time = req.body.time,
        address = req.body.address;
        [order].forEach((product, index, arr)=>{
                const q = quantity[index];
                let sql = "INSERT INTO foodorder.orders (" +
                    "food_id," +
                    " qty,"+ 
                    " customer_FName," + 
                    " customer_LName," +
                    " customer_address," +
                    " customer_number," +
                    " customer_email," +
                    " customer_facebook," +
                    " order_date," +
                    " delivery_option," +
                    " mode_of_payment," +
                    " delivery_time" +
                 ") VALUES (" + 
                     con.escape(product) + `,` +
                     con.escape(q) + `,` +
                     con.escape(first) + `,` +
                     con.escape(last) + `,` +
                     con.escape(address) + `,` +
                     con.escape(contact) + `,` +
                     con.escape(""+email) + `,` +
                     con.escape(fb) + `,` +
                     con.escape(date) + `,` +
                     con.escape(delivery) + `,` +
                     con.escape(payment) + `,` +
                     con.escape(time) +
                     `)`; 
                con.query(sql, (err,result) => {
                    if (!err){
                        res.redirect('thankyou.html');
                    }
                    else{
                        res.status(404).send('ERROR. Please Go back and Order Again');
                    }
                })
        })
    });

Для ответа Бармара MySQL таинственным образом добавляет VALUES

const dbconfig = require('../config/database');
const mysql = require('mysql2');
const con = mysql.createConnection(dbconfig.connection);
con.query('USE ' + dbconfig.database);
module.exports = function(app, passport) {

    app.use((req, res, next)=>{
        res.locals.filterdata;
        next();
    })
    // LOGIN =========================
    // ===============================
    app.get('/', (req,res) =>{
        res.redirect('/login');
    });
    app.get('/login', function(req, res) {
        res.render(process.cwd() + '/pages/login', { message: req.flash('loginMessage') });
    });
    app.post('/login', passport.authenticate('local-login', {
            successRedirect : '/profile', 
            failureRedirect : '/login', 
            failureFlash : true 
        }),
        function(req, res) {
            console.info("someone logged in");

            if (req.body.remember) {
              req.session.cookie.maxAge = 1000 * 60 * 3;
            } else {
              req.session.cookie.expires = false;
            }
        res.redirect('/');
    });

    // FORGOT PW =======================
    // =================================
    app.get('/forgot', function(req, res) {
        res.render(process.cwd() + '/pages/forgot');
    });

    // PAGE ROUTES =====================
    // =================================
    app.get('/profile', isLoggedIn, (req, res)=> {
        if (req.isAuthenticated() && (req.user.isAdmin === 1)) {
                res.redirect('/admin');
        }
        else{
            res.redirect('/cashier');
        }
    });

    // ADMIN ROUTES =====================
    // ==================================
    app.get('/admin', isLoggedIn, (req,res)=>{
        let sql = "SELECT * FROM orders"
        con.query(sql, (err,result)=>{
            if (!err){
                res.render(process.cwd() + '/pages/admin/history', {
                    data:result,
                    user: req.user,
                    message: req.flash('historyMessage')
                });
            }
            else{
                res.status(404).send(err);
            }
        }); 
    });
    app.get('/admin/history', isLoggedIn, (req,res)=>{
        let sql = "SELECT * FROM orders"
        con.query(sql, (err,result)=>{
            if (!err){
                res.render(process.cwd() + '/pages/admin/history', {
                    data:result, 
                    user: req.user,
                    message: req.flash('historyMessage')
                });
            }
            else{
                res.status(404).send(err);
            }
        }); 
    });
    app.get('/history/form', isLoggedIn,(req,res)=>{
        let sql = "SELECT * FROM receive"
        let sql2 = "SELECT * FROM orders"
        con.query(sql, (err,result)=>{
            con.query(sql2, (err2,result2)=>{
                if (!err){
                    res.render(process.cwd() + '/pages/admin/form', {data2:result2, data:result, user: req.user});
    
                }
                else{
                    res.status(404).send(err, err2);
                }
            })
        }); 
    });
    app.post('/history/form/confirm', isLoggedIn, (req,res)=>{
        let code = req.body.pcode,
        quanti = req.body.qty, 
        price = req.body.price, 
        cust = req.body.orderedBy, 
        oDate = req.body.orderDate; 
        [code].forEach((product, index, arr) =>{
            const q = quanti[index];
            let sql = `INSERT INTO inventory.orders (productCode, productName, unitPrice, quantity, totalPrice, customer, date)
            SELECT ?, productName, unitPrice, ?, ?, ?, ?
            FROM inventory.receive
            WHERE productCode = ?`;
            console.info(sql);
            con.query(sql,[product, q, price, cust, oDate], (err,result)=>{
                if (!err){
                    req.flash('historyMessage', 'Order Created')
                    res.redirect('/admin/history')
                }
                else{
                    console.info(sql);
                    res.status(404).send(err);
                }
            })
        })
    });
    app.post('/history/form/confirmPrint', isLoggedIn, (req,res)=>{
        let code = req.body.pcode, name = req.body.pname, unit = req.body.punit,
        qty = req.body.qty, price = req.body.price, cust = req.body.orderedBy, oDate = req.body.orderDate; 
        [code].forEach((product, index, arr) =>{
            const q = qty[index];
            let sql = "INSERT INTO inventory.orders (productCode, productName, unitPrice, quantity, totalPrice, customer, date) VALUES (?,?,?,?,?,?,?)"
            con.query(sql,[product, name, unit, q, price, cust, oDate], (err,result)=>{
                if (!err){
                    req.flash('historyMessage', 'Order Created')
                    res.redirect('/admin/history')
                }
                else{
                    res.status(404).send(err);
                }
            });
        })
    });
    
    app.get('/admin/stocks', isLoggedIn, (req,res)=>{
        let sql = "SELECT * FROM receive"
        con.query(sql, (err,result)=>{
            if (!err){
                res.render(process.cwd() + '/pages/admin/stocks', {data: result, user: req.user});
            }
            else{
                res.status(404).send(err);
            }
        }); 
    });
    app.get('/admin/receive', isLoggedIn, (req,res)=>{
        let date = ""+ new Date().getFullYear() + "-" + (new Date().getMonth()+1) + "-" + new Date().getDate() ;
        let sql = "SELECT * FROM receive WHERE date = ?";
        con.query(sql,[date], (err,result)=>{
            if (!err){
                req.flash('dateMessage', date)
                    res.render(process.cwd() + '/pages/admin/receive', {
                        data: result, 
                        user: req.user,
                        fltrdate: req.flash('dateMessage'),
                        message: req.flash('receiveMessage')
                    });
            }
            else{
                res.status(404).send(err);
            }
        });
    });
    app.get('/receive/edit', isLoggedIn, (req,res)=>{
        let date = ""+ new Date().getFullYear() + "-" + (new Date().getMonth()+1) + "-" + new Date().getDate() ;
        let sql = "SELECT * FROM receive WHERE date = ?";
        con.query(sql,[date], (err,result)=>{
            if (!err){
                req.flash('dateMessage', "" + date)
                    res.render(process.cwd() + '/pages/admin/editReceive', {
                        data: result, 
                        user: req.user,
                        fltrdate: req.flash('dateMessage')
                    });
            }
            else{
                res.status(404).send(err);
            }
        });
    });
    app.post('/receive/edit/delete', isLoggedIn, (req,res)=>{
        let date = ""+ new Date().getFullYear() + "-" + (new Date().getMonth()+1) + "-" + new Date().getDate() ;
        let sql = "DELETE FROM receive WHERE (date,productCode) = (?,?)";
        con.query(sql,[date, req.body.deleteProd], (err,result)=>{
            if (!err){
                req.flash('receiveMessage', 'Successfully deleted')
                res.redirect('/admin/receive')
            }
            else{
                res.status(404).send(err);
            }
        });
    });
    app.post('/receive/edit/save', isLoggedIn, (req,res)=>{
        let date = ""+ new Date().getFullYear() + "-" + (new Date().getMonth()+1) + "-" + new Date().getDate() ;
        let code = req.body.code;  let product = req.body.product;
        let unit = req.body.unit; let quantity = req.body.quantity;
        [code].forEach((p, index, arr)=>{
            const q = quantity[index];
            let sql = "INSERT INTO inventory.receive (productName, unitPrice, quantity, date) VALUES (?,?,?,?)";
            con.query(sql,[product, unit, q, date], (err,result)=>{
                if (!err){
                    req.flash('receiveMessage', 'Successfully saved')
                    res.redirect('/admin/receive')
                }
                else{
                    res.status(404).send(err);
                }
            });
        });
    });


    // FILTER ADMIN ROUTES =====================
    // =========================================
    app.post('/receive/filter', isLoggedIn, (req,res)=>{
        let date2 = req.body.date;
        filterdata = date2;
        let sql = "SELECT * FROM receive WHERE date = ?";
        con.query(sql,[date2], (err,result)=>{
            if (!err){
                req.flash('dateMessage', date2)
                res.render(process.cwd() + '/pages/admin/receiveFltr', {
                    data: result, 
                    user: req.user,
                    message: req.flash('receiveMessage'),
                    fltrdate: req.flash('dateMessage')
                });
            }
            else{
                res.status(404).send(err);
            }
        });
    });
    app.post('/filter/edit', isLoggedIn, (req,res)=>{
        let date3 = filterdata;
        let sql = "SELECT * FROM receive WHERE date = ?";
        con.query(sql,[date3], (err,result)=>{
            if (!err){
                req.flash('dateMessage', date3)
                res.render(process.cwd() + '/pages/admin/editReceiveFltr', {
                    data: result, 
                    user: req.user,
                    fltrdate: req.flash('dateMessage')
                });
            }
            else{
                res.status(404).send(err);
            }
        });
    });
    app.post('/filter/edit/delete', isLoggedIn, (req,res)=>{
        let date = filterdata;
        let sql = "DELETE FROM receive WHERE (date,productCode) = (?,?)";
        con.query(sql,[date, req.body.deleteProd], (err,result)=>{
            if (!err){
                req.flash('receiveMessage', 'Successfully deleted')
                res.redirect('/admin/receive')
            }
            else{
                res.status(404).send(err);
            }
        });
    });
    app.post('/filter/edit/save', isLoggedIn, (req,res)=>{
        let date = filterdata;
        let code = req.body.code;  let product = req.body.product;
        let unit = req.body.unit; let quantity = req.body.quantity;
        [code].forEach((p, index, arr)=>{
            const q = quantity[index];
            let sql = "INSERT INTO inventory.receive (productName, unitPrice, quantity, date) VALUES (?,?,?,?)";
            con.query(sql,[product, unit, q, date], (err,result)=>{
                if (!err){
                    req.flash('receiveMessage', 'Successfully saved')
                    res.redirect('/admin/receive')
                }
                else{
                    res.status(404).send(err);
                }
            });
        });
    });

    


    


    // CASHIER ROUTES =====================
    // =================================


    // LOGOUT =========================
    // ================================
    app.get('/logout', (req, res)=> {
        req.logout();
        res.redirect('/login');
    });


    function isLoggedIn(req, res, next) {
    if (req.isAuthenticated())
        return next();
        res.redirect('/');
    }
}

Используйте подготовленный оператор с заполнителями вместо объединения строк.

Barmar 31.03.2022 21:04

Какой смысл использовать [code].forEach()? Если у вас есть только один code, вам не нужна петля.

Barmar 31.03.2022 21:07

Мне нужен цикл, потому что в моем html-коде есть несколько значений, которые принимаются как pcode. Подумайте об OLTP

Carl-Valencia 31.03.2022 21:11

Совет: если у вас возникли проблемы с сопоставлением значений со столбцами, попробуйте альтернативный синтаксис INSERT: INSERT INTO inventory.orders SET productCode=?, productName=?, unitPrice=?, quantity=?, .... Этот синтаксис поддерживает вставку только одной строки за раз, но позволяет избежать путаницы при сопоставлении столбцов со значениями. И используйте параметры запроса.

Bill Karwin 31.03.2022 21:12
[code] не разбивается code на массив. Может быть, вы имеете в виду code.split(',').forEach(), если это список, разделенный запятыми? И если req.body.pcode — это массив, вам не нужно оборачивать его в [].
Barmar 31.03.2022 21:12

о, я не знал, что другой синтаксис я попробую. Что касается BarmarI, я делал этот код раньше (проверьте мой другой вопрос) и решил его, повторив первую переменную. Сейчас попробую другой синтаксис

Carl-Valencia 31.03.2022 21:16

Я не вижу никакой итерации в вашем другом вопросе stackoverflow.com/questions/70134269/…

Barmar 31.03.2022 21:17

Я также не понимаю, как показанный выше код может вызвать ошибку, что заставляет меня подозревать, что ошибка на самом деле вызвана каким-то другим кодом. Либо другая часть приложения, либо триггер, либо, возможно, вы развернули не тот код, который, как вы думали, развернули. Я бы попробовал console.info(sql)после отформатировать его (или какой-либо эквивалентный метод диагностического вывода), чтобы вы были уверены, что он использует синтаксис SQL, который, как вы думаете, когда вы получаете ошибку.

Bill Karwin 31.03.2022 21:36

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

Carl-Valencia 31.03.2022 21:47

У вас есть триггеры?

Bill Karwin 31.03.2022 21:51

добавил все мои маршруты на вопрос

Carl-Valencia 31.03.2022 22:26
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
2
11
44
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я не уверен, откуда берутся дополнительные значения, но вы можете упростить это, используя подготовленный оператор с параметрами. И запрос может использовать INSERT INTO ... SELECT ... вместо помещения подзапросов в список VALUES.

app.post('/history/form/confirm', isLoggedIn, (req,res)=>{
    let code = req.body.pcode,
        quanti = req.body.qty, 
        price = req.body.price, 
        cust = req.body.orderedBy, 
        oDate = req.body.orderDate; 
    [code].forEach(product => {
        let sql = `INSERT INTO inventory.orders (productCode, productName, unitPrice, quantity, totalPrice, customer, date)
                   SELECT ?, productName, unitPrice, ?, ?, ?, ?
                   FROM inventory.receive
                   WHERE productCode = ?`;
        con.query(sql, [product, q, price, cust, oDate, product], (err,result)=>{
            if (!err){
                req.flash('historyMessage', 'Order Created')
                res.redirect('/admin/history')
            }
            else{
                res.status(404).send(err);
            }
        });
    });
});

Пробовал это, как указано выше, без подзапроса он все равно добавляет эти дополнительные значения.

Carl-Valencia 31.03.2022 21:17

Вы уверены, что ошибка связана с этим запросом? Я не вижу никакого способа, которым это может произойти.

Barmar 31.03.2022 21:18

Должен ли я добавить свои ejs здесь? Может там?

Carl-Valencia 31.03.2022 21:20

Я не понимаю, какое значение имеет EJS. Это происходит полностью на сервере node.js.

Barmar 31.03.2022 21:21

Вы уверены, что перезагрузили сервер с обновленным кодом?

Barmar 31.03.2022 21:21

Да всегда перезагружал сервер. Подождите, попробуйте другой синтаксис из счета и снова прокомментируйте

Carl-Valencia 31.03.2022 21:21

Сообщение об ошибке по-прежнему говорит VALUES (...)?

Barmar 31.03.2022 21:22

Использовал это. По-прежнему добавляет еще 3 пустых ЗНАЧЕНИЯ после цены

Carl-Valencia 31.03.2022 21:53

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

Barmar 31.03.2022 21:54

Извините, я имею в виду Select. Привык пользоваться значениями. я могу добавить скриншот к вопросу

Carl-Valencia 31.03.2022 22:00

Я не вижу никакого способа, чтобы это могло исходить от любого из кодов. Есть ли у вас триггеры в базе данных?

Barmar 31.03.2022 22:05

Нет, не знаю. Могу добавить фото с триггеров на верстаке, если надо

Carl-Valencia 31.03.2022 22:07
Ответ принят как подходящий

Я решил проблему, и она находится в моем файле EJS. У меня есть итерация для просмотра результатов из моей таблицы и ввода цены. У цены не было отключенного атрибута, поэтому она продолжает принимать другие цены, даже если флажок не установлен.

Просто добавьте disabled и создайте JS-файл, который удаляет атрибут disabled, если флажок установлен == true.

Другие вопросы по теме