Node.js数据库操作之查询MySQL数据库(二)


Posted in Javascript onMarch 04, 2017

前言

我们在上一篇文章《Node.js数据库操作之连接MySQL数据库(一)》中已经学习了Nodejs连接MySQL数据库的几种方法,数据库连接上了之后就需要对数据库进行查询。本篇文章介绍一下查询MySQL数据库的方法。下面话不多说,来看看详细的介绍吧。

查询方式

上一篇文章中,我们用到了一种查询数据库的最基本的方法:connection.query(sqlString, callback)

第一个参数是一个SQL语句,可以是任意的数据库语句,而第二个参数是一个回调函数,查询结果通过回调参数的方式返回。

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方法的一个参数,而不是作为对象中的一个属性。

connection.query(
 {
 sql: 'select * from book where author = ? and country = ?',
 timeout: 40000,
 // ['corner', 'us'] // 如果同时设置,那么此时不会生效
 },
 ['xyf', 'china'], // 作为query函数的一个参数
 function(err, result) {
 console.log(result);
 }
);

需要注意的是,如果我们既将查询值作为对象的属性,又将其作为query函数的参数,这个时候函数中的参数将会覆盖对象的属性,也就是说此时只有参数的值生效。

解析查询值

在进行数据库查询时,有一个重要的原则就是永远不要相信用户的输入。为什么不能相信用户的输入呢,首先让我们来了解一下SQL注入攻击。

SQL注入攻击

所谓的SQL注入攻击,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。由于笔者并不是从事数据库方面的工作,也不是数据库方面的砖家,所以只能通过一个简单的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语句有一些基本了解,就会知道如果把这段查询语句放到数据库中进行查询,那么所有用户的信息都被查出来了,但是这并不是我们想要看到的结果。

避免SQL注入攻击

那么怎么才能避免SQL注入攻击呢?mysql提供了两种方法给我们,第一种方法就是每次查询时都把用户输入的数据都用escape()函数解析一下,有点类似预处理语句。

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

第二种方法就是在查询时通过上面说到的占位符注入查询的查询方式来进行查询。但它内部的实现也是通过上面所说的escape()方法将用户输入解析了一下。推荐使用第二种方法来得简单快捷。

多语句查询

mysql还支持多语句查询,但是由于某些安全原因(官方解释是因为如果值没有正确解析会导致SQL注入攻击)默认是被禁止的。那么让我们来打开这个“潘多拉魔盒”把。

在创建数据库连接时首先把这个功能开启。

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

查询结果

通过查询语句返回的结果以数组的形式返回,如果是单语句查询,数组就是一个纯对象数组[obj1,obj2,...],数组中的每一个对象都是数据库中每一行的数据,只是以对象的方式返回。如果没有查询到数据,那么数组的长度就为0。

但是如果是多语句(m条语句)的方式查询,虽然返回也是一个数组,但是数组中嵌套有n个数组,n的取值取决于你查询语句的条数m(即n=m)。

总结

由于官方文档比较零碎,因此整理得不是很到位,有问题的地方希望大家指正。以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

Javascript 相关文章推荐
JavaScript For Beginners(转载)
Jan 05 Javascript
JavaScript创建对象的写法
Aug 29 Javascript
Jquery ajaxStart()与ajaxStop()方法(实例讲解)
Dec 18 Javascript
JavaScript文本框脚本编写的注意事项
Jan 25 Javascript
详解webpack 入门总结和实践(按需异步加载,css单独打包,生成多个入口文件)
Jun 20 Javascript
简单实现js放大镜效果
Jul 24 Javascript
详谈表单重复提交的三种情况及解决方法
Aug 16 Javascript
JavaScript中各数制转换全面总结
Aug 21 Javascript
JavaScript定义函数的三种实现方法
Sep 23 Javascript
vue中使用 pako.js 解密 gzip加密字符串的方法
Jun 10 Javascript
Vue实现返回顶部按钮实例代码
Oct 21 Javascript
如何使JavaScript休眠或等待
Apr 27 Javascript
Node.js数据库操作之连接MySQL数据库(一)
Mar 04 #Javascript
jQuery实现贪吃蛇小游戏(附源码下载)
Mar 04 #Javascript
详解vue父子模版嵌套案例
Mar 04 #Javascript
vue指令以及dom操作详解
Mar 04 #Javascript
JS如何判断浏览器类型和详细区分IE各版本浏览器
Mar 04 #Javascript
详解在Vue中通过自定义指令获取dom元素
Mar 04 #Javascript
在javaScript中检测数据类型的几种方式小结
Mar 04 #Javascript
You might like
JS与PHP向函数传递可变参数的区别实例代码
2011/05/18 PHP
PHP7新特性foreach 修改示例介绍
2016/08/26 PHP
PHP 实现页面静态化的几种方法
2017/07/23 PHP
JavaScript asp.net 获取当前超链接中的文本
2009/04/14 Javascript
javaScript Array(数组)相关方法简述
2009/07/25 Javascript
jQuery对表单的操作代码集合
2011/04/06 Javascript
angular.foreach 循环方法使用指南
2015/01/06 Javascript
jQuery的css() 方法使用指南
2015/05/03 Javascript
浅谈JavaScript 执行环境、作用域及垃圾回收
2016/05/31 Javascript
AngularJS入门教程之 XMLHttpRequest实例讲解
2016/07/27 Javascript
JS数组返回去重后数据的方法解析
2017/01/03 Javascript
浅谈react前后端同构渲染
2017/09/20 Javascript
mpvue微信小程序多列选择器用法之省份城市选择的实现
2019/03/07 Javascript
JavaScript实现的联动菜单特效示例
2019/07/08 Javascript
jQuery--遍历操作实例小结【后代、同胞及过滤】
2020/05/22 jQuery
[00:36]DOTA2上海特级锦标赛 Archon战队宣传片
2016/03/04 DOTA
[04:52]第二届DOTA2亚洲邀请赛主赛事第一天比赛集锦:OG娜迦海妖放大配合谜团大中3人
2017/04/02 DOTA
[38:54]完美世界DOTA2联赛PWL S2 Rebirth vs LBZS 第一场 11.28
2020/12/01 DOTA
[01:05:07]DOTA2-DPC中国联赛 正赛 DLG vs Dragon BO3 第一场2月1日
2021/03/11 DOTA
在Python中使用Neo4j数据库的教程
2015/04/16 Python
python实现斐波那契数列的方法示例
2017/01/12 Python
Python编程实现及时获取新邮件的方法示例
2017/08/10 Python
python中pip的安装与使用教程
2018/08/10 Python
在python中,使用scatter绘制散点图的实例
2019/07/03 Python
python搜索包的路径的实现方法
2019/07/19 Python
Python PIL图片添加字体的例子
2019/08/22 Python
Python 找出出现次数超过数组长度一半的元素实例
2020/05/11 Python
为什么是 Python -m
2020/06/19 Python
Python基础教程(一)——Windows搭建开发Python开发环境
2020/07/20 Python
canvas离屏技术与放大镜实现代码示例
2018/08/31 HTML / CSS
彪马美国官网:PUMA美国
2017/03/09 全球购物
.net面试题
2016/09/17 面试题
党员四风问题对照检查材料思想汇报
2014/09/16 职场文书
庐山导游词
2015/02/03 职场文书
员工自我工作评价
2015/03/06 职场文书
公司酒会致辞
2015/07/30 职场文书