我希望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);
});
});
};
答案 0 :(得分:1)
我之前的回答是基于较旧的代码,不再准确,所以我将其删除了。
您在,
和password
之间错过了逗号CURRENT_TIMESTAMP
。
我建议您使用parameterized queries而不是像这样自己构建它们。
答案 1 :(得分:1)
密码后缺少逗号,current_Timestamp
周围没有抽搐"INSERT INTO users (username, email, userpass, datecreated) VALUES" +
//4 parameters
"(" + "'" + username + "'" + "," + "'" + email + "'" + "," + "'" + password + "," + "'CURRENT_TIMESTAMP)"
---虽然这可能是解决当前问题的公认答案, 我强烈建议评估Craig和Lars的答案 。使用参数是一种更好的长期方法,因为它更安全;一旦你了解了如何以及正确的现代范式,实际上更容易编码。
答案 2 :(得分:1)
`"(" + "'" + username + "'" + "," + "'" + email + "'" + "," + "'" + password + "'" + "'CURRENT_TIMESTAMP')"`
Nonononono!
这不是你传递参数的方式,也可能是因为你遇到了问题。 (xQbert指出你也错过了一个逗号)。
想象一下,如果我输入了用户名
');--DROP TABLE users;--
啪。 There goes your application
将绑定参数parameterized queries用于占位符。这通常被称为准备好的陈述"虽然他们确实有所不同。
e.g。
client.query(
"INSERT INTO users (username, email, userpass, datecreated) VALUES ($1, $2, $3, current_timestamp)",
[username, email, password])
你的问题会消失。
请注意,此不仅仅是一个安全问题,它也是错误,即使是来自非恶意用户也会导致错误。我输入了一个安全可靠的密码,如94/Ql@$'B'wC
。 Boom,您的应用程序因数据库错误而崩溃。