这是我的第一个问题,对于任何错误,我们深表歉意。 我正在构建一个测试,用户可以登录并重新参加测试。但是,我不确定当用户提交表单时如何检查电子邮件是否已在我的 mariaDB 中。
我见过一些类似的例子,使用嵌套查询,不确定这是否适用于这里或者是否是一个好的实践。
/*User info POST*/
app.use(bodyParser.urlencoded({ extended: true }));
app.post('/user-info', (req, res) => {
var first_name = req.body.first_name;
var last_name = req.body.last_name;
var email = req.body.email;
var sql = `INSERT INTO Govt_profiles
(
First_Name, Last_Name, Email
)
VALUES
(
?,?,?
)`;
pool.query(sql, [first_name, last_name, email], (err, data) => {
if (err) throw err;
console.log("User submition success!");
});
res.redirect('/questions');
});
我尝试了蒂姆的建议(谢谢!)。然而我现在遇到了错误,我确信我忘记了一些事情。这是我的错误:
UnhandledPromiseRejectionWarning:错误:位置 4 处的参数未设置 sql:插入 Govt_profiles(名字、姓氏、电子邮件) 选择 ?, ?, ? 不存在的地方(从 Govt_profiles 中选择 1,其中电子邮件 = ?)
这是我更新的代码:
app.use(bodyParser.urlencoded({ extended: true }));
app.post('/user-info', (req, res) => {
var first_name = req.body.first_name;
var last_name = req.body.last_name;
var email = req.body.email;
var sql = `INSERT INTO Govt_profiles (First_Name, Last_Name, Email)
SELECT ?, ?, ?
WHERE NOT EXISTS (SELECT 1 FROM Govt_profiles WHERE Email = ?)`;
pool.query(sql, [first_name, last_name, email], (err, data) => {
if (err) throw err;
console.log("User submition success!");
});
res.redirect('/questions');
});
最佳答案
一种选择是使用 INSERT INTO ... SELECT
在实际插入之前检查电子邮件是否存在:
INSERT INTO Govt_profiles (First_Name, Last_Name, Email)
SELECT ?, ?, ?
WHERE NOT EXISTS (SELECT 1 FROM Govt_profiles WHERE Email = ?);
然后您可以检查受影响的行数,如果为零,那么您就会知道出了问题。
如果您可以更改数据库结构,您还可以尝试在 Email
列上添加唯一索引:
ALTER TABLE Govt_profiles ADD CONSTRAINT email_unique UNIQUE (Email);
使用这种方法,尝试插入包含已存在电子邮件的记录可能会导致 Node.js 代码出现错误。
更新您最近的编辑:
您需要绑定(bind)电子邮件两次,因为它在两个 ?
占位符中出现两次:
var sql = `INSERT INTO Govt_profiles (First_Name, Last_Name, Email)
SELECT ?, ?, ?
WHERE NOT EXISTS (SELECT 1 FROM Govt_profiles WHERE Email = ?)`;
pool.query(sql, [first_name, last_name, email, email], (err, data) => {
if (err) throw err;
console.log("User submition success!");
});
关于javascript - 提交表单时,如何检查用户的电子邮件是否已在我的数据库中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57139401/