首页 > 解决方案 > 提交表单时如何检查用户电子邮件是否已在我的数据库中?

问题描述

这是我在这里的第一个问题,因此对任何错误表示歉意。我正在构建一个测试,用户可以在其中登录并重新参加测试。但是,当用户提交表单时,我不确定如何检查电子邮件是否已经在我的 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: INSERT INTO Govt_profiles (First_Name, Last_Name, Email) SELECT ?, ?, ? 不存在的地方(从 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');
});

标签: javascriptmysqlnode.jsexpressmariadb

解决方案


一种选择是在实际插入之前使用INSERT INTO ... SELECTwhich 检查电子邮件是否存在:

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 代码出错。

更新您最近的编辑:

您需要将电子邮件绑定两次,因为它在两个?占位符中出现两次:

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!");
});

推荐阅读