我想INSERT
每个新用户注册时CURRENT_TIMESTAMP
的当前时间戳。列号等于 VALUES
中的参数数。然而我得到INSERT has more target columns than expressions
.使用 node-postgres
npm 模块作为控制器。
//Just 3 parameters, timestamp is hardcoded in the query
exports.create = function (username, email, password) {
DB.connect(connection, function (err, client, done) {
var query = client.query(
//4 columns
"INSERT INTO users (username, email, userpass, datecreated) VALUES" +
//4 parameters
"(" + "'" + username + "'" + "," + "'" + email + "'" + "," + "'" + password + "'" + "'CURRENT_TIMESTAMP')");
query.on('error', function (error) {
console.log("query returned an " + error);
});
query.on('row', function (row, result) {
result.addRow(row);
});
});
};
密码后缺少逗号,周围没有current_Timestamp抽动
"INSERT INTO users (username, email, userpass, datecreated) VALUES" +
//4 parameters
"(" + "'" + username + "'" + "," + "'" + email + "'" + "," + "'" + password + "," + "'CURRENT_TIMESTAMP)"
--- 虽然这可能是解决当前问题的公认答案,但我强烈建议评估克雷格和拉尔斯的答案。 使用参数是一种更好的长期方法,因为它更安全;实际上,一旦您了解了如何编码,以及正确的现代范式,就更容易编码。
我之前的答案是基于旧提供的代码,它不再准确,所以我删除了它。
您在 password
和 CURRENT_TIMESTAMP
之间缺少逗号,
。
我建议您使用参数化查询,而不是像这样自己构建它们。
`"(" + "'" + username + "'" + "," + "'" + email + "'" + "," + "'" + password + "'" + "'CURRENT_TIMESTAMP')"`
诺诺!
这不是您传递参数的方式,也可能是您遇到问题的原因。(xQbert指出你也缺少一个逗号)。
想象一下,如果我输入用户名
');--DROP TABLE users;--
啪。您的应用程序在那里。
通过将参数绑定到占位符来使用参数化查询。这通常被称为"预处理语句",尽管它们实际上是不同的东西。
例如
client.query(
"INSERT INTO users (username, email, userpass, datecreated) VALUES ($1, $2, $3, current_timestamp)",
[username, email, password])
你的问题会消失。
现在阅读此内容。
请注意,这不仅是一个安全问题,也是一个错误,即使来自非恶意用户也会导致错误。我输入了一个看起来很安全的密码,例如94/Ql@$'B'wC
。繁荣,您的应用程序因数据库错误而崩溃。