使用用户 ID 更新列字段的 Mysql 语法

Posted

技术标签:

【中文标题】使用用户 ID 更新列字段的 Mysql 语法【英文标题】:Mysql syntax to update a column field using user id 【发布时间】:2021-07-10 08:20:53 【问题描述】:

我需要为我的大学课程使用 node js 和 mysql 开发一个电子商务网站。 在结帐过程中,我被要求允许用户输入收货地址并更新用户表的对应字段。 以下代码在我在查询中设置特定 id (ex id=100) 时有效,但如果我不想指定值怎么办?

我尝试过类似 id=? (请参阅我的代码)但我收到错误语法。 提前感谢您的帮助。

玛拉

app.post('/submitaddress', function (req, res) 
    
    // catching the variables
    var address = req.body.address;
    
    // put the data in the database
    // pulling in mysql
    var mysql = require('mysql');

  
    // set up a connection  
    var con = mysql.createConnection(
    host: "localhost",
    user: "root",
    database: "test",
    password: ""
    );
    
      con.connect(function(err) 
  if (err) throw err;
  console.log("Connected!");
  var sql = "UPDATE `test`.`users` SET `address`='"+address+"' WHERE  id=100;";
  console.log(sql);
  con.query(sql, function (err, result) 
    if (err) throw err;
    console.log("1 record inserted");
  );
);
        
    res.send('address added');
  
)
<!--CHECKOUT PAGE-->
<div data-role="page" id="checkout">

    <div data-role="header">
        <div class="flex-container">
            <img class="responsive-2" src="images/logo_yes.png">
        </div>
    </div>

    <div role="main" class="ui-content">
         
        <h1>Delivery address</h1>
        
        Delivery address <input type="text" id="address"/> <br>
        <button id="submitorder">Submit order</button>
    
    </div><!-- /content -->

    <div data-role="footer">        
        <div data-role="navbar">
            <ul>
                <li><a href="#homepage" data-icon="home"></a></li>
                <li><a href="#" data-icon="shop"></a></li>
                <li><a href="#" data-icon="phone"></a></li>
            </ul>
        </div>
    </div>
    
</div><!-- /page -->

app.post('/submitaddress', function (req, res) 
    
    // catching the variables
    var address = req.body.address;
    
    // put the data in the database
    // pulling in mysql
    var mysql = require('mysql');

  
    // set up a connection  
    var con = mysql.createConnection(
    host: "localhost",
    user: "root",
    database: "test",
    password: ""
    );
    
      con.connect(function(err) 
  if (err) throw err;
  console.log("Connected!");
  var sql = "UPDATE `test`.`users` SET `address`='"+address+"' WHERE  `id`=?;";
  console.log(sql);
  con.query(sql, function (err, result) 
    if (err) throw err;
    console.log("1 record inserted");
  );
);
        
    res.send('address added');
  
)

【问题讨论】:

【参考方案1】:

使用节点运行以下代码,然后您将了解将身份验证代码放置在何处,并在要更新地址的 API 中使用结果用户 ID。

通过使用中间件,您可以为所有路由添加一个通用的身份验证方法,并且可以使用 res.locals 对象将结果传递给 API 方法,这在许多场景中都非常有用。

var express = require('express');
const http = require("http");
const debug = require("debug")("node-angular");

let app = express();

console.log("Server Started");

const auth = (req, res, next) => 
    // Process the authorization header of the Request here and determine the logged in user
    res.locals.userID = 100;
    next();
;


app.get('/get', auth, async (req, res) => 
    try 
        res.status(201).json(
            details: "Secret User ID: "+res.locals.userID
        );

     catch (err) 
        console.log(err);
        res.status(500).json(
            details: "Internal Error!"
        );
    
);


// Server Start


const normalizePort = val => 
    var port = parseInt(val, 10);

    if (isNaN(port)) 
        // named pipe
        return val;
    

    if (port >= 0) 
        // port number
        return port;
    

    return false;
;

const onError = error => 
    if (error.syscall !== "listen") 
        throw error;
    
    const bind = typeof addr === "string" ? "pipe " + addr : "port " + port;
    switch (error.code) 
        case "EACCES":
            console.error(bind + " requires elevated privileges");
            process.exit(1);
            break;
        case "EADDRINUSE":
            console.error(bind + " is already in use");
            process.exit(1);
            break;
        default:
            throw error;
    
;

const onListening = () => 
    const addr = server.address();
    const bind = typeof addr === "string" ? "pipe " + addr : "port " + port;
    debug("Listening on " + bind);
;

const port = normalizePort(process.env.PORT || "3000");
app.set("port", port);

const server = http.createServer(app);
server.on("error", onError);
server.on("listening", onListening);
server.listen(port);

【讨论】:

感谢 SaiSurya 的帮助。不幸的是,这不是我要找的。如果我为 id 传递参数“100”,那么无论哪个用户登录,系统都会更新用户 100 的地址。我希望我的程序能够识别登录的用户并更新正确的地址字段。跨度> 哦,那么您应该使用中间件来处理当前用户的详细信息,然后您可以更新登录用户的记录。你能告诉我你在这个应用程序中使用什么样的身份验证,比如 JWT。 请检查更新。如果您想在您的应用程序中使用 JWT 或 JSON Web 令牌身份验证,那么您可以参考我的公共 MEAN 登录存储库来执行此操作。谢谢,链接:github.com/SaiSurya9999/MEAN-Login-System 您的解决方案比我的水平要先进得多,但感谢一百万花时间回复。

以上是关于使用用户 ID 更新列字段的 Mysql 语法的主要内容,如果未能解决你的问题,请参考以下文章

MySQL更新列的序列号按具有相同值的字段分组

mysql中一个数据表只可以定一个非空字段吗

两个mysql数据表中的字段相对应,如何调出

MySQL:SELECT语法

根据mysql中其他表中的匹配值更新列

mysql 中如何把查询出来的一列数据当成条件(字段)来使用?