Node.js數(shù)據(jù)庫操作之查詢MySQL數(shù)據(jù)庫(二)
前言
我們?cè)谏弦黄恼隆?a target="_blank" href="http://www.dbjr.com.cn/article/107440.htm">Node.js數(shù)據(jù)庫操作之連接MySQL數(shù)據(jù)庫(一)》中已經(jīng)學(xué)習(xí)了Nodejs連接MySQL數(shù)據(jù)庫的幾種方法,數(shù)據(jù)庫連接上了之后就需要對(duì)數(shù)據(jù)庫進(jìn)行查詢。本篇文章介紹一下查詢MySQL數(shù)據(jù)庫的方法。下面話不多說,來看看詳細(xì)的介紹吧。
查詢方式
上一篇文章中,我們用到了一種查詢數(shù)據(jù)庫的最基本的方法:connection.query(sqlString, callback)
。
第一個(gè)參數(shù)是一個(gè)SQL語句,可以是任意的數(shù)據(jù)庫語句,而第二個(gè)參數(shù)是一個(gè)回調(diào)函數(shù),查詢結(jié)果通過回調(diào)參數(shù)的方式返回。
connection.query( 'select * from book where author = "xyf" and country = "china"', function(err, result) { console.log(result); } );
這是最簡(jiǎn)單的查詢方式,但是存在著兩個(gè)問題,一個(gè)是需要拼接字符串,比較繁瑣;另一個(gè)是容易被sql注入攻擊,因此我們有了第二種查詢方式。
占位符注入查詢
第二種查詢方式是采用了占位符的形式connection.query(sqlString, values, callback)
,這樣就不需要進(jìn)行惡心的字符串的拼接了。
connection.query( 'select * from book where author = ? and country = ?', ['xyf', 'china'], function(err, result) { console.log(result); } );
使用對(duì)象查詢方式
第三種查詢方式我們將查詢語句和查詢值組合成一個(gè)對(duì)象來進(jìn)行查詢。它的形式是這樣的:connection.query(object, callback)
。
connection.query( { sql: 'select * from book where author = ? and country = ?', values: ['xyf', 'china'], // 作為對(duì)象的屬性 timeout: 40000, }, function(err, result) { console.log(result); } );
組合查詢方式
將第二種和第三種方式可以結(jié)合起來使用,查詢值作為query方法的一個(gè)參數(shù),而不是作為對(duì)象中的一個(gè)屬性。
connection.query( { sql: 'select * from book where author = ? and country = ?', timeout: 40000, // ['corner', 'us'] // 如果同時(shí)設(shè)置,那么此時(shí)不會(huì)生效 }, ['xyf', 'china'], // 作為query函數(shù)的一個(gè)參數(shù) function(err, result) { console.log(result); } );
需要注意的是,如果我們既將查詢值作為對(duì)象的屬性,又將其作為query函數(shù)的參數(shù),這個(gè)時(shí)候函數(shù)中的參數(shù)將會(huì)覆蓋對(duì)象的屬性,也就是說此時(shí)只有參數(shù)的值生效。
解析查詢值
在進(jìn)行數(shù)據(jù)庫查詢時(shí),有一個(gè)重要的原則就是永遠(yuǎn)不要相信用戶的輸入。為什么不能相信用戶的輸入呢,首先讓我們來了解一下SQL注入攻擊。
SQL注入攻擊
所謂的SQL注入攻擊,就是通過把SQL命令插入到Web表單遞交或輸入域名或頁面請(qǐng)求的查詢字符串,最終達(dá)到欺騙服務(wù)器執(zhí)行惡意的SQL命令。由于筆者并不是從事數(shù)據(jù)庫方面的工作,也不是數(shù)據(jù)庫方面的磚家,所以只能通過一個(gè)簡(jiǎn)單的DEMO來演示一下SQL注入攻擊。
假如我們拼接的SQL語句是這樣的
var username = 'xyf'; var sql = 'select * from book where author = "'+username+'"';
這里我們期待用戶輸入的username是Jack或者LiLi之類的,但是用戶說我偏不,我就輸入一串惡意代碼:
var username = '"1 or 1=1'; var sql = 'select * from book where author = "'+username+'"';
最后我們拼接的查詢語句就變成了下面這樣的:
select * from book where author = "" or 1=1
如果讀者對(duì)SQL語句有一些基本了解,就會(huì)知道如果把這段查詢語句放到數(shù)據(jù)庫中進(jìn)行查詢,那么所有用戶的信息都被查出來了,但是這并不是我們想要看到的結(jié)果。
避免SQL注入攻擊
那么怎么才能避免SQL注入攻擊呢?mysql提供了兩種方法給我們,第一種方法就是每次查詢時(shí)都把用戶輸入的數(shù)據(jù)都用escape()函數(shù)解析一下,有點(diǎn)類似預(yù)處理語句。
var authorname = 'user input'; connection.escape(authorname); // 或者使用mysql.escape(authorname); connection.query( 'select * from book where author = "'+authorname+'"', function(err, result) { console.log(result); } );
第二種方法就是在查詢時(shí)通過上面說到的占位符注入查詢的查詢方式來進(jìn)行查詢。但它內(nèi)部的實(shí)現(xiàn)也是通過上面所說的escape()方法將用戶輸入解析了一下。推薦使用第二種方法來得簡(jiǎn)單快捷。
多語句查詢
mysql還支持多語句查詢,但是由于某些安全原因(官方解釋是因?yàn)槿绻禌]有正確解析會(huì)導(dǎo)致SQL注入攻擊)默認(rèn)是被禁止的。那么讓我們來打開這個(gè)“潘多拉魔盒”把。
在創(chuàng)建數(shù)據(jù)庫連接時(shí)首先把這個(gè)功能開啟。
let connection = mysql.createConnection({ // 其他配置 multipleStatements: true, });
然后我們就可以使用多語句查詢了。
connection.query( { sql: `select * from book where username = ?; select * from book where username = ?;`, }, ['ace','xyf'], function(err, rows, fields) { if (err) throw err; console.log('The solution is: ', rows); } );
查詢結(jié)果
通過查詢語句返回的結(jié)果以數(shù)組的形式返回,如果是單語句查詢,數(shù)組就是一個(gè)純對(duì)象數(shù)組[obj1,obj2,...],數(shù)組中的每一個(gè)對(duì)象都是數(shù)據(jù)庫中每一行的數(shù)據(jù),只是以對(duì)象的方式返回。如果沒有查詢到數(shù)據(jù),那么數(shù)組的長度就為0。
但是如果是多語句(m條語句)的方式查詢,雖然返回也是一個(gè)數(shù)組,但是數(shù)組中嵌套有n個(gè)數(shù)組,n的取值取決于你查詢語句的條數(shù)m(即n=m)。
總結(jié)
由于官方文檔比較零碎,因此整理得不是很到位,有問題的地方希望大家指正。以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。
- node.js 開發(fā)指南 – Node.js 連接 MySQL 并進(jìn)行數(shù)據(jù)庫操作
- Node.js下向MySQL數(shù)據(jù)庫插入批量數(shù)據(jù)的方法
- Node.js操作mysql數(shù)據(jù)庫增刪改查
- Node.js數(shù)據(jù)庫操作之連接MySQL數(shù)據(jù)庫(一)
- node.js平臺(tái)下的mysql數(shù)據(jù)庫配置及連接
- 從零學(xué)習(xí)node.js之mysql數(shù)據(jù)庫的操作(五)
- Linux下為Node.js程序配置MySQL或Oracle數(shù)據(jù)庫的方法
- Node.js實(shí)現(xiàn)連接mysql數(shù)據(jù)庫功能示例
- Node.js對(duì)MySQL數(shù)據(jù)庫的增刪改查實(shí)戰(zhàn)記錄
- node.js如何操作MySQL數(shù)據(jù)庫
- Node.js實(shí)現(xiàn)http請(qǐng)求服務(wù)與Mysql數(shù)據(jù)庫操作方法詳解
- node.js對(duì)于數(shù)據(jù)庫MySQL基本操作實(shí)例總結(jié)【增刪改查】
相關(guān)文章
Node.js調(diào)用fs.renameSync報(bào)錯(cuò)(Error: EXDEV, cross-device link not
這篇文章主要介紹了Node.js調(diào)用fs.renameSync報(bào)錯(cuò)(Error: EXDEV, cross-device link not permitted),非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-12-12在Node.js中將SVG圖像轉(zhuǎn)換為PNG,JPEG,TIFF,WEBP和HEIF格式的方法
這篇文章主要介紹了在Node.js中將SVG圖像轉(zhuǎn)換為PNG,JPEG,TIFF,WEBP和HEIF格式的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08node+socket實(shí)現(xiàn)簡(jiǎn)易聊天室功能
這篇文章主要為大家詳細(xì)介紹了node+socket實(shí)現(xiàn)簡(jiǎn)易聊天室功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07基于Node.js模板引擎教程-jade速學(xué)與實(shí)戰(zhàn)1
下面小編就為大家?guī)硪黄贜ode.js模板引擎教程-jade速學(xué)與實(shí)戰(zhàn)1。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-09-09