如何在JavaScript中正确编写MySQL BETWEEN日期间隔查询语句
问题原因与解决方法
错误提示指向日期附近的语法问题,根本原因是直接拼接SQL字符串时,没有给日期类型的字符串值加单引号,MySQL无法识别未被包裹的日期时间文本为合法的字段值。
错误修复方案(存在SQL注入风险,禁止在生产环境使用):
直接给拼接的日期加单引号,代码如下:period = ` created_datetime BETWEEN '${fromdate}' AND '${todate}' `;这种写法如果
fromdate或todate来自用户输入,攻击者可以构造恶意内容执行SQL注入,窃取或篡改数据。正确方案:使用参数化查询(预编译语句)
Node.js的MySQL相关驱动(mysql、mysql2等)都支持参数化查询,驱动会自动处理值的转义、类型适配和引号包裹,完全避免SQL注入风险,也不会出现日期语法问题。
示例代码(基于mysql2/promise的Express项目示例):const express = require('express'); const mysql = require('mysql2/promise'); const app = express(); // 初始化数据库连接池 const pool = mysql.createPool({ host: '127.0.0.1', user: '你的数据库用户名', password: '你的数据库密码', database: '你的数据库名' }); app.get('/query-by-date', async (req, res) => { const { fromdate, todate } = req.query; // 可选:先校验fromdate、todate的日期格式合法性 try { // 编写带占位符?的SQL语句,查询参数单独传入 const [rows] = await pool.execute( 'SELECT * FROM 你的表名 WHERE created_datetime BETWEEN ? AND ?', [fromdate, todate] ); res.json({ success: true, data: rows }); } catch (err) { res.json({ success: false, message: err.message }); } }); app.listen(3000);
- 如果你拿到的
fromdate和todate只有日期部分(比如2021-02-01),需要补全时间避免漏数据,可以在传参前拼接时间:fromdate = fromdate + ' 00:00:00'、todate = todate + ' 23:59:59',直接把拼接后的字符串传入参数数组即可,不需要额外加引号。
内容的提问来源于stack exchange,提问作者Sairam Gouni
相关产品推荐
相关产品推荐

