javascript - 提交表单时,如何检查用户的电子邮件是否已在我的数据库中?

标签 javascript mysql node.js express mariadb

这是我的第一个问题,对于任何错误,我们深表歉意。 我正在构建一个测试,用户可以登录并重新参加测试。但是,我不确定当用户提交表单时如何检查电子邮件是否已在我的 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/

相关文章:

node.js - 尝试在 OSX 上全局安装 ESlint 时出现 "Permission Denied"

javascript - 如何使用 JQuery 制作基于滚动的动画与 Bootstrap 3 模态一起工作?

javascript - 动态创建的元素上的事件绑定(bind)?

mysql - 自动删除主键序列中的间隙

javascript - 如何处理 nodejs 上的窗口对象以用于 reactjs 应用程序的服务器端渲染

node.js - 如何知道客户端已连接Eventhub

javascript - 输入中带有 base64 编码图像的 POST 导致 Chrome 内存泄漏 - 如何解决?

javascript - 使用 CSV 或 JS 文件填充 HTML 表中的特定 TD

mysql - 安装多个服务器

php - 无法从 mysql 存储过程中看到任何值