【问题标题】:Storing mysql query rows in variable for later use in another mysql query将mysql查询行存储在变量中以供以后在另一个mysql查询中使用
【发布时间】:2021-07-13 16:21:50
【问题描述】:

我有 2 个不同的表,其中第一个表用于检索要存储在第二个表中的数据,例如,如果第一个表中有 3 个项目,则运行 for 循环 3 次以检索信息并将其逐行存储在第二个表中,我还必须为第二个表的主键使用唯一 ID,因此我必须运行另一个 mysql 查询来检索第二个表中的所有 ID 并将 1 添加到id 来生成一个新的 ID,但对我来说问题是当我尝试将一个 connection.query 放在另一个 connection.query 中时,外部 connection.query 在运行内部 connection.query 之前运行 3 次,因此项目不会得到存储并且id没有更新,给我一个重复的主键错误,我尝试使用函数但它没有帮助,这里是

app.get('/submit-check', function (request, response) {
  function insert(sql2) {
    connection.query(sql2, function (err, result1) {
      if (err) throw err;
    });
  }
  function other(value, index) {
    let sql = "SELECT * FROM ORDERS"
    connection.query(sql, function (err, results) {
      var id;
      if (results.length == 0) {
        id = 0
      } else {
        id = results[results.length - 1].orderID;
      }
      // for (let j = 0; j < results.length; j++) {
      //   list.push(results[j].orderID)
      // }
      // if (list.length == 0) {
      //   id = 0
      // }
      // else {
      //   var largest = 0;
      //   for (let i = 0; i <= list.length; i++) {
      //     if (parseInt(list[i]) > largest) {
      //       var largest = parseInt(list[i]);
      //     }
      //   }
      //   id = largest + 1
      // }
      id = id + 1;
      var add = request.query.state + " " + request.query.address + " " + request.query.Unumber + " " + request.query.zip
      var custID = value[index].custID
      var bookID = value[index].bookID
      var Email = request.query.email
      var CardName = request.query.cardname
      var CardNumber = request.query.cardnumber
      var ExDate = request.query.expmonth + "/" + request.query.expyear
      var CVV = request.query.cvv
      var qty = 1
      var sql2 = "INSERT INTO orders (orderID,custID, bookID, QTY, CardName, CardNumber, ExDate, CVV, Email, Address, createdAt, updatedAt) VALUES('" + id + "','" + custID + "', '" + bookID + "', '" + qty + "', '" + CardName + "', '" + CardNumber + "', '" + ExDate + "', '" + CVV + "', '" + Email + "', '" + add + "', CURDATE(), CURDATE() )"
      insert(sql2)
    })
  }
  function setValue(value) {
    for (let index = 0; index < value.length; index++) {
      other(value, index)
    }
  }
  let sql3 = "SELECT * FROM carts"
  var cart_db;
  connection.query(sql3, function (err, result) {
    cart_db = result
    setValue(cart_db)
  })
  // console.log(cart_db)
  response.render("aftercheck", { attributes: request.query, cardno: "****-****-****" + request.query.cardnumber.slice(-5,) });
})

提前谢谢你

【问题讨论】:

  • 您的代码容易受到 SQL 注入攻击。此外,除非这只是一个测试应用程序,否则您真的,REALLYREALLY 不能像那样将信用卡信息存储在您的数据库中(查找 PCI DSS)。
  • 您为什么要在没有 WHEREORDER 子句的情况下进行 SELECT * FROM table 查询?不能保证你会得到你想要的。
  • 是的,这只是一个测试应用,但将来可能会对信用卡信息进行加密
  • 不,您不想自己加密数据。您需要使用可以代表您对卡进行标记的信用卡处理器。
  • 知道了,不好用了

标签: javascript mysql node.js node-mysql


【解决方案1】:

您的代码有很多很多问题。我已经使用 TODO cmets 对这种基于等待/异步的重写进行了补充,您可能需要在其中修复问题。由于我没有您的数据库,所以自然无法对此进行测试。

async function queryP(connection, sql, parameters = undefined) {
  return new Promise((resolve, reject) => {
    connection.query(sql, parameters, function (err, results) {
      if (err) return reject(err);
      resolve(results);
    });
  });
}

app.get("/submit-check", async function (request, response) {
  // TODO: these need to be validated
  const {
    address,
    Unumber,
    zip,
    expyear,
    state,
    expmonth,
    email: Email,
    cardname: CardName,
    cardnumber: CardNumber,
    cvv: CVV,
  } = request.query;
  const add = `${state} ${address} ${Unumber} ${zip}`;
  const ExDate = `${expmonth}/${expyear}`;

  const cartData = await queryP(connection, "SELECT * FROM carts"); // TODO: this is not safe with multiple customers
  const [maxOrderIdRow] = await queryP(connection, "SELECT MAX(id) as maxid FROM orders");
  const orderId = (maxOrderIdRow.maxid || 0) + 1; // TODO: this is not safe in the face of concurrent requests
  // Using a for loop rather than .map and await and so on is simpler here
  for (let i = 0; i < cartData.length; i++) {
    const cartRow = cartData[i];
    const custID = cartRow.custID;
    const bookID = cartRow.bookID;
    const qty = 1;
    // TODO: rethink how credit cards are saved – we can't save them in the database like this or we'll be out of business
    await queryP(
      connection,
      `INSERT INTO orders (orderID, custID, bookID, QTY, CardName, CardNumber, ExDate, CVV, Email, Address, createdAt, updatedAt) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, CURDATE(), CURDATE() )`,
      [orderId, custID, bookID, qty, CardName, CardNumber, ExDate, CVV, Email, add],
    );
  }

  response.render("aftercheck", {
    attributes: request.query,
    cardno: "****-****-****" + CardNumber.slice(-5),
  });
});

【讨论】:

  • 您好,非常感谢您的回复,我计划在未来进行数据验证以及数据加密,这个解决方案帮助解决了我面临的问题,非常感谢!
猜你喜欢
  • 2017-12-10
  • 2016-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多