簡體   English   中英

如果在 JavaScript 中的字符串中大小寫帶有引號內的變量或 NULL?

[英]If case within string in JavaScript with variable either inside quotation marks or NULL?

此題難出題,易出題。 我想將多組值添加到 SQL 插入,例如

var sqlInsertString = `INSERT INTO events (url) VALUES`
var sqlInsertValuesString = `(`('${event.url ? event.url : null}'), null, 1, 2, 3)`

pg_client.query(sqlInsertString + sqlInsertValuesString)

這發生在一個循環中,因此插入字符串和值字符串的分離。 現在,我想要發生的是,如果 event.url 包含 url,它應該將 url 插入為'https://www.example.com' (帶引號),但如果 event.url 為空,則應該插入 null .

我上面的代碼將在數據庫中插入“null”(帶引號)而不是實際的 null。 去掉引號會因為url中的':'而出錯。

我如何在sqlInsertValuesString中使用此方法提供有效的 url 字符串或“真實” null (不帶引號)?

除非你特別想使用反引號,否則你可以這樣做

 var event = {}; event.url = 'http://someurl.com'; var sqlInsertString = "INSERT INTO events (url, a, b, c, d) VALUES "; var sqlInsertValuesString = "('" + (event.url? event.url + "'": null) + ", null, 1, 2, 3)"; console.log(sqlInsertString + sqlInsertValuesString); var event = {}; var sqlInsertString = "INSERT INTO events (url, a, b, c, d) VALUES "; var sqlInsertValuesString = "(" + (event.url? "'" + event.url + "'": null) + ", null, 1, 2, 3)"; console.log(sqlInsertString + sqlInsertValuesString);

為了清楚起見,拆分作業可能是有意義的:

let eventUrl = event.url ?? null;
const sqlInsertString = `INSERT INTO events (url) VALUES (${eventUrl}, null, 1, 2, 3)`

我為eventUrl使用了合並運算符

使用參數化查詢的原因不止一個,而不僅僅是防止注入攻擊。 他們讓它變得如此簡單

pg_client.query(
  "INSERT INTO events (url, nothing, one, two, three) VALUES ($1, $2, $3, $4, $5)",
  [event.url || null, null, 1, 2, 3]
)
.then(res => ...)
.catch(err => ...)

無需報價,司機會在幕后處理所有的機械工作。

所以即使你沒有讓你的程序更安全,至少為了易讀性和實踐,使用參數化查詢仍然是好的:如果你養成了總是使用參數化查詢的習慣,你就不需要考慮是否是注入是可能的,你永遠不會誤判它而在你的程序中留下安全漏洞。

你可以試試

`(${event.url ? `'${event.url}'` : `null`})`

因此,如果 url 存在,則只有單引號,而不是空值。

如果有人通過谷歌找到這個,我還發現 escaping 反引號也有效:

${event.url ? (`\'` + event.url + `\'`) : null},

但選擇的答案更好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM