[英]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.