【问题标题】:Unknown column "something" in `Field list`, What's wrong?`字段列表`中的未知列“某事”,出了什么问题?
【发布时间】:2018-08-23 13:16:01
【问题描述】:

我正在端口 3000 上编写一个服务器,它的工作是从“Signup.ejs”输入的值中获取数据,然后将它们插入到数据库中。

一切都很好,但有一个问题,它告诉我 TechnoBoy 是 Field list 中的未知列

我尝试在 ${} 周围插入 "" 甚至 ``,但由于出现了新错误,因此效果不佳。

这是我的 Connection.js 文件,我使用它来创建连接,然后将其导出以将其连接到我的应用程序文件中:

let mysql = require("mysql");
let connection = mysql.createConnection({
  host: "localhost",
  user: "root",
  password: "something",
  database: "test"
});

module.exports = connection;

这是我的 Server.js,我用它来创建服务器并连接到数据库,将数据插入其中:

let connection = require("./Connection.js");
let bodyParser = require("body-parser");
let express = require("express");
let app = express();
let urlencodedParser = bodyParser.urlencoded({ extended: false });
app.listen(3000, function() {
  console.log("The server at port 3000 is open!");
});
app.set("view engine", "ejs");
app.get("/Signup", (req, res) => {
  res.render("Register");
});
connection.connect();
app.post("/Signup", urlencodedParser, function(req, res) {
  console.log(req.body);
  res.render("Register");
  connection.query(
    `insert into users (Username, User_Password) values (${
      req.body.Username
    }, ${req.body.Password})`
  );
});

我在输入字段中插入一些数据时收到错误:

Error: ER_BAD_FIELD_ERROR: Unknown column 'TechnoBoy' in 'field list'
    at Query.Sequence._packetToError (C:\Users\ha\node_modules\mysql\lib\protocol\sequences\Sequence.js:47:14)
    at Query.ErrorPacket (C:\Users\ha\node_modules\mysql\lib\protocol\sequences\Query.js:77:18)
    at Protocol._parsePacket (C:\Users\ha\node_modules\mysql\lib\protocol\Protocol.js:278:23)
    at Parser.write (C:\Users\ha\node_modules\mysql\lib\protocol\Parser.js:76:12)
    at Protocol.write (C:\Users\ha\node_modules\mysql\lib\protocol\Protocol.js:38:16)
    at Socket.<anonymous> (C:\Users\ha\node_modules\mysql\lib\Connection.js:91:28)
    at Socket.<anonymous> (C:\Users\ha\node_modules\mysql\lib\Connection.js:502:10)
    at Socket.emit (events.js:182:13)
    at addChunk (_stream_readable.js:283:12)
    at readableAddChunk (_stream_readable.js:264:11)
    --------------------
    at Protocol._enqueue (C:\Users\ha\node_modules\mysql\lib\protocol\Protocol.js:144:48)
    at Connection.query (C:\Users\ha\node_modules\mysql\lib\Connection.js:200:25)
    at C:\Users\ha\OneDrive\Images\Documents\Projects\UI-Server\Server.js:17:14
    at Layer.handle [as handle_request] (C:\Users\ha\node_modules\express\lib\router\layer.js:95:5)
    at next (C:\Users\ha\node_modules\express\lib\router\route.js:137:13)
    at C:\Users\ha\node_modules\body-parser\lib\read.js:130:5
    at invokeCallback (C:\Users\ha\node_modules\raw-body\index.js:224:16)
    at done (C:\Users\ha\node_modules\raw-body\index.js:213:7)
    at IncomingMessage.onEnd (C:\Users\ha\node_modules\raw-body\index.js:273:7)
    at IncomingMessage.emit (events.js:182:13)
Emitted 'error' event at:
    at Connection._handleProtocolError (C:\Users\ha\node_modules\mysql\lib\Connection.js:425:8)
    at Protocol.emit (events.js:182:13)
    at Protocol._delegateError (C:\Users\ha\node_modules\mysql\lib\protocol\Protocol.js:390:10)
    at Query.<anonymous> (C:\Users\ha\node_modules\mysql\lib\protocol\Protocol.js:153:12)
    at Query.emit (events.js:182:13)
    at Query.Sequence.end (C:\Users\ha\node_modules\mysql\lib\protocol\sequences\Sequence.js:78:12)
    at Query.ErrorPacket (C:\Users\ha\node_modules\mysql\lib\protocol\sequences\Query.js:90:8)
    at Protocol._parsePacket (C:\Users\ha\node_modules\mysql\lib\protocol\Protocol.js:278:23)
    at Parser.write (C:\Users\ha\node_modules\mysql\lib\protocol\Parser.js:76:12)
    at Protocol.write (C:\Users\ha\node_modules\mysql\lib\protocol\Protocol.js:38:16)

我使用的查询(在 connection.query btw 中):

insert into users (Username, User_Password) values (${
          req.body.Username
        }, ${req.body.Password})

如果这是一个愚蠢的问题或其他问题,请原谅,我对后端很陌生,这是我第一次尝试。

【问题讨论】:

  • 您能否提供导致此问题的 SQL 查询?我有一种奇怪的感觉,TechnoBoy 是用于Username 列的值,您可能会遇到输入数据的 SQL 注入或错误处理。
  • 我猜这是关于 #nodejs 的?然后请删除#javascript标签并添加#nodejs。
  • @Roland 哦,我已经写了我使用的查询是:插入用户(用户名,User_Password)值(${req.body.Username},${req.body.Password})是的, TechnoBoy 是一个用于 Username 列的值,我希望它记录在该列中。您对输入数据的错误处理是什么意思?对不起先生,我对服务器和数据库很陌生。
  • 抱歉监督。对于“错误处理”,我的意思是不逃避来自互联网等不受信任来源的数据。因此,一般的好建议是在用户的输入数据到达任何敏感部分(如 SQL 查询)之前转义(“保护”)用户的输入数据,在这些部分中潜在的攻击者可以插入像 `OR 1=1` 这样的恶意代码。
  • 我猜测这个的简单原因(不知道 NodeJS)是错误消息的状态:Unknown column TechnoBoy in field list。这可能意味着您在 SQL 查询中缺少单个撇号。因为当您将它们排除在外并且 NodeJS 代码没有将其“智能”添加到其中时,值 TechnoBoy 将被插入到您的 SQL 语句中,从而导致 INSERT INTO users (Username, User_password) VALUES (TechnoBoy, abc123#)。如果您在值周围使用',则TechnoBoy 会被SQL 引擎解释为值,这就是您想要的。

标签: mysql sql node.js express


【解决方案1】:

我是个白痴。我将密码字段配置为 int,所以它不能输入字符串,但我传递了一个字符串,这就是为什么当我传递它时,它说的是错误的语法和内容。

哦,还有,我忘了用 "" 包裹用户名,虽然我仍然不知道当属性本身是一个字符串时这是怎么回事。

问题解决了,可以关闭了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-06
    • 2020-02-19
    • 1970-01-01
    • 1970-01-01
    • 2019-12-09
    • 2023-03-14
    相关资源
    最近更新 更多