Как вставить динамическую c информацию в таблицу MySQL с помощью узла / Express JS - PullRequest
0 голосов
/ 29 апреля 2020

Я работаю над приложением реагирования с бэкэндом Node / Express JS. Я пытаюсь вставить значение, основанное на вводе пользователя, в MySQL базу данных. Вот мой запрос поста Node:

// To create a new user account
app.post('/createUser', function(req, res) {
    console.log('in createUser');
    const {firstName, lastName, username, passcode, email} = req.query;
    const CreateUser = `CALL CreateUser('${firstName}', '${lastName}', 
        '${username}', '${passcode}', '${email}')`;
    mysqlConnection.query(CreateUser, (error, result) => {
        if(error) {
            res.status(500)
            res.send("Could not create user account.")
        } else {
            console.log('create user cart');
            console.log(`${req.query.username}`);
            const CreateUserCart = `CALL CreateUserCart('${req.query.username}')`;
            mysqlConnection.query(CreateUserCart, (error1, result1) => {
                if(error1) {
                    res.status(500)
                    res.send("Could not create user account.")
                } else {
                    res.status(201)
                    res.send("Account successfully created!")
                }
            })  
        }
    })
});

Первая хранимая процедура, CreateUser, работает нормально. Что я хочу сделать, это взять значение в req.query имени пользователя и передать его в хранимую процедуру с именем CreateUserCart. Вот эта хранимая процедура:

CREATE DEFINER=`lsharon`@`%` PROCEDURE `CreateUserCart`(IN
username VARCHAR(45)
)
BEGIN 
INSERT INTO SHOPPING_CART(CustomerID) 
SELECT CustomerID 
FROM CUSTOMER 
WHERE Username = username;  
END

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

1 Ответ

0 голосов
/ 30 апреля 2020

Запрос в вашем sp говорит:

    WHERE Username = username;  

В именах столбцов регистр не учитывается. Таким образом, Username = username соответствует каждой строке в вашем CUSTOMER. Это версия WHERE 1 = 1 - всегда верно.

Попробуйте изменить имя вашего параметра, например, так:

  CREATE PROCEDURE `CreateUserCart` (IN newUsername VARCHAR(45) )
  BEGIN 
     INSERT INTO SHOPPING_CART(CustomerID) 
     SELECT CustomerID 
      FROM CUSTOMER 
  WHERE Username = newUsername;  
END

MySQL хранимых программ - огромное удовольствие для устранения неполадок а? Многие люди избегают их по этой причине. С другой стороны, многие крупные предприятия используют множество хранимых программ для взаимодействия со своими данными. Но эти предприятия обычно платят довольно большие лицензионные сборы за сервер Oracle или SQL. В этих базах данных лучше хранятся языки программирования и инструменты. Поэтому, если вы работаете в одном из этих мест, вы по достоинству оцените небольшую экспозицию хранимых программ.

Pro tip есть гораздо более надежный способ справиться с этим рабочим процессом. Получите, чтобы ваша первая хранимая процедура заканчивалась чем-то вроде

  SELECT LAST_INSERT_ID() CustomerID;

Это заставит процедуру возвращать набор результатов, который вы можете обработать так же, как если бы это был запрос SELECT. LAST_INSERT_ID () получает значение автоинкремента из самой последней INSERT.

Затем считайте этот идентификатор клиента из набора результатов и передайте его в качестве параметра CreateUserCart, а не имя клиента.

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