Node.JS Prepared Statement with (INSERT INTO ... VALUES ...



我想添加一个mySQL事件。首先,在下面你会看到我的初始设置值。

payload.TierKeys.forEach(t => {
queryArrays.push([
CREATE_KEY(),
t,
payload.PageKey,
payload.StoryKey,
'NOW()',
`(SELECT Chapters.ChapterKey FROM Chapters INNER JOIN PublishingQueue ON Chapters.ChapterKey = PublishingQueue.ChapterKey WHERE Chapters.StoryKey = ${escape(payload.StoryKey)} ORDER BY Chapters.ChapterOrder ASC LIMIT 1)`,
]);
});

设置好这些值后,在下面的查询中使用它们。

pool.query(`
CREATE EVENT ${queryData.ScheduleKey + i}
ON SCHEDULE EVERY 1 WEEK STARTS ?
DO
INSERT INTO PublishRecord (PublishRecordKey, TierKey, PageKey, StoryKey, PublishDate, ChapterKey) VALUES ?
`, [dateISO, queryArrays], (err, rows, fields) => {

那么问题是语句只准备为字符串。您可以在这里看到node准备的实际DO子句:

(INSERT INTO PublishRecord (PublishRecordKey, TierKey, PageKey, StoryKey, PublishDate, ChapterKey) VALUES ('lc0qgw7uly', 'lbz602e5js', 'lbz527cfjm', 'lbz74fw5zl', 'NOW()', '(SELECT Chapters.ChapterKey FROM Chapters INNER JOIN PublishingQueue ON Chapters.ChapterKey = PublishingQueue.ChapterKey WHERE Chapters.StoryKey = 'lbz74fw5zl' ORDER BY Chapters.ChapterOrder ASC LIMIT 1)')

看到(SELECT...是如何用单引号括起来的吗?NOW()也用单引号括起来。情况不应该是这样。我该如何解决这个问题?

我的查询还有其他问题,但我修复了准备好的语句…不使用预处理语句:-)

相反,我事先创建字符串,插入值并在插入时转义它们。这成功。所以它仍然是一个准备好的声明,但是我自己的解决方案。

最新更新