最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Node.js數(shù)據(jù)庫操作之查詢MySQL數(shù)據(jù)庫(二)

 更新時間:2017年03月04日 16:23:09   作者:Corner  
這篇文章主要介紹了Node.js數(shù)據(jù)庫操作之查詢MySQL數(shù)據(jù)庫的相關資料,文中介紹的非常詳細,對大家學習或者使用mysql能帶來一定的幫助,需要的朋友可以參考借鑒,下面來一起看看吧。

前言

我們在上一篇文章《Node.js數(shù)據(jù)庫操作之連接MySQL數(shù)據(jù)庫(一)》中已經學習了Nodejs連接MySQL數(shù)據(jù)庫的幾種方法,數(shù)據(jù)庫連接上了之后就需要對數(shù)據(jù)庫進行查詢。本篇文章介紹一下查詢MySQL數(shù)據(jù)庫的方法。下面話不多說,來看看詳細的介紹吧。

查詢方式

上一篇文章中,我們用到了一種查詢數(shù)據(jù)庫的最基本的方法:connection.query(sqlString, callback) 。

第一個參數(shù)是一個SQL語句,可以是任意的數(shù)據(jù)庫語句,而第二個參數(shù)是一個回調函數(shù),查詢結果通過回調參數(shù)的方式返回。

connection.query(
 'select * from book where author = "xyf" and country = "china"',
 function(err, result) {
 console.log(result);
 }
);

這是最簡單的查詢方式,但是存在著兩個問題,一個是需要拼接字符串,比較繁瑣;另一個是容易被sql注入攻擊,因此我們有了第二種查詢方式。

占位符注入查詢

第二種查詢方式是采用了占位符的形式connection.query(sqlString, values, callback) ,這樣就不需要進行惡心的字符串的拼接了。

connection.query(
 'select * from book where author = ? and country = ?',
 ['xyf', 'china'], 
 function(err, result) {
 console.log(result);
 }
);

使用對象查詢方式

第三種查詢方式我們將查詢語句和查詢值組合成一個對象來進行查詢。它的形式是這樣的:connection.query(object, callback) 。

connection.query(
 {
 sql: 'select * from book where author = ? and country = ?',
 values: ['xyf', 'china'], // 作為對象的屬性
 timeout: 40000,
 },
 function(err, result) {
 console.log(result);
 }
);

組合查詢方式

將第二種和第三種方式可以結合起來使用,查詢值作為query方法的一個參數(shù),而不是作為對象中的一個屬性。

connection.query(
 {
 sql: 'select * from book where author = ? and country = ?',
 timeout: 40000,
 // ['corner', 'us'] // 如果同時設置,那么此時不會生效
 },
 ['xyf', 'china'], // 作為query函數(shù)的一個參數(shù)
 function(err, result) {
 console.log(result);
 }
);

需要注意的是,如果我們既將查詢值作為對象的屬性,又將其作為query函數(shù)的參數(shù),這個時候函數(shù)中的參數(shù)將會覆蓋對象的屬性,也就是說此時只有參數(shù)的值生效。

解析查詢值

在進行數(shù)據(jù)庫查詢時,有一個重要的原則就是永遠不要相信用戶的輸入。為什么不能相信用戶的輸入呢,首先讓我們來了解一下SQL注入攻擊。

SQL注入攻擊

所謂的SQL注入攻擊,就是通過把SQL命令插入到Web表單遞交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器執(zhí)行惡意的SQL命令。由于筆者并不是從事數(shù)據(jù)庫方面的工作,也不是數(shù)據(jù)庫方面的磚家,所以只能通過一個簡單的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

如果讀者對SQL語句有一些基本了解,就會知道如果把這段查詢語句放到數(shù)據(jù)庫中進行查詢,那么所有用戶的信息都被查出來了,但是這并不是我們想要看到的結果。

避免SQL注入攻擊

那么怎么才能避免SQL注入攻擊呢?mysql提供了兩種方法給我們,第一種方法就是每次查詢時都把用戶輸入的數(shù)據(jù)都用escape()函數(shù)解析一下,有點類似預處理語句。

var authorname = 'user input';
connection.escape(authorname);
// 或者使用mysql.escape(authorname);
connection.query(
 'select * from book where author = "'+authorname+'"',
 function(err, result) {
 console.log(result);
 }
);

第二種方法就是在查詢時通過上面說到的占位符注入查詢的查詢方式來進行查詢。但它內部的實現(xiàn)也是通過上面所說的escape()方法將用戶輸入解析了一下。推薦使用第二種方法來得簡單快捷。

多語句查詢

mysql還支持多語句查詢,但是由于某些安全原因(官方解釋是因為如果值沒有正確解析會導致SQL注入攻擊)默認是被禁止的。那么讓我們來打開這個“潘多拉魔盒”把。

在創(chuàng)建數(shù)據(jù)庫連接時首先把這個功能開啟。

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);
 }
);

查詢結果

通過查詢語句返回的結果以數(shù)組的形式返回,如果是單語句查詢,數(shù)組就是一個純對象數(shù)組[obj1,obj2,...],數(shù)組中的每一個對象都是數(shù)據(jù)庫中每一行的數(shù)據(jù),只是以對象的方式返回。如果沒有查詢到數(shù)據(jù),那么數(shù)組的長度就為0。

但是如果是多語句(m條語句)的方式查詢,雖然返回也是一個數(shù)組,但是數(shù)組中嵌套有n個數(shù)組,n的取值取決于你查詢語句的條數(shù)m(即n=m)。

總結

由于官方文檔比較零碎,因此整理得不是很到位,有問題的地方希望大家指正。以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。

相關文章

  • nodejs調用cmd命令實現(xiàn)復制目錄

    nodejs調用cmd命令實現(xiàn)復制目錄

    本文給大家介紹的是如何在nodejs中調用CMD命令,從而實現(xiàn)目錄的復制,非常的實用,有需要的小伙伴可以參考下。
    2015-05-05
  • socket.io學習教程之深入學習篇(三)

    socket.io學習教程之深入學習篇(三)

    這篇文章更加深入的給大家介紹了socket.io的相關資料,之前已經介紹了socket.io的基本教程和應用,本文更為深入的來介紹下socket.io的使用,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-04-04
  • CentOS7中源碼編譯安裝NodeJS的完整步驟

    CentOS7中源碼編譯安裝NodeJS的完整步驟

    這篇文章主要給大家介紹了關于CentOS7中源碼編譯安裝NodeJS的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用nodejs具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-10-10
  • npm?install安裝失敗常見問題的解決辦法小結

    npm?install安裝失敗常見問題的解決辦法小結

    有時候前端安裝npm install 安裝包總是安裝不上,下面這篇文章主要給大家介紹了關于npm?install安裝失敗常見問題的解決辦法,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-05-05
  • npm?install?-g?@vue/cli常見問題解決匯總

    npm?install?-g?@vue/cli常見問題解決匯總

    這篇文章主要給大家介紹了關于npm?install?-g?@vue/cli常見問題解決的相關資料,文中通過實例代碼將解決的方式介紹的非常詳細,對遇到這個問題的朋友具有一定的參考學習價值,需要的朋友可以參考下
    2022-08-08
  • Node.js的Mongodb使用實例

    Node.js的Mongodb使用實例

    本篇文章主要介紹了Node.js的Mongodb使用實例,具有一定的參考價值,有興趣的可以了解一下。
    2016-12-12
  • Node.js中SerialPort(串口)模塊使用

    Node.js中SerialPort(串口)模塊使用

    本文主要介紹了Node.js中SerialPort(串口)模塊使用,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • Node.js的項目構建工具Grunt的安裝與配置教程

    Node.js的項目構建工具Grunt的安裝與配置教程

    Grunt是為Node打造的項目構建工具,相當于C/C++世界中的makefile,可以執(zhí)行像壓縮、編譯、單元測試、代碼檢查以及打包發(fā)布的任務,下面我們就來一起看一下Node.js的項目構建工具Grunt的安裝與配置教程:
    2016-05-05
  • NodeJs 模仿SIP話機注冊的方法

    NodeJs 模仿SIP話機注冊的方法

    這篇文章主要介紹了NodeJs 模仿SIP話機注冊的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-06-06
  • HTTP JSON接口模擬工具Interfake快速入門教程

    HTTP JSON接口模擬工具Interfake快速入門教程

    這篇文章主要為大家介紹了HTTP JSON接口模擬工具Interfake快速入門教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-06-06

最新評論

周至县| 广汉市| 绩溪县| 保康县| 禹州市| 府谷县| 油尖旺区| 应用必备| 大方县| 钟祥市| 海门市| 达州市| 德惠市| 鄂州市| 双峰县| 稷山县| 公主岭市| 略阳县| 太康县| 和平县| 太谷县| 钟祥市| 建德市| 子长县| 手游| 鹿邑县| 盈江县| 高雄市| 汉寿县| 内江市| 武穴市| 安康市| 安康市| 宣恩县| 开原市| 济源市| 五峰| 忻州市| 尚志市| 英山县| 弥勒县|