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 相关文章推荐
IE网页js语法错误2行字符1、FF中正常的解决方法
Sep 09 Javascript
javascript 用函数语句和表达式定义函数的区别详解
Jan 06 Javascript
web前端开发JQuery常用实例代码片段(50个)
Aug 28 Javascript
JS+CSS实现的经典tab选项卡效果代码
Sep 16 Javascript
JavaScript mixin实现多继承的方法详解
Mar 30 Javascript
Vue2.0用 watch 观察 prop 变化(不触发)
Sep 08 Javascript
轻量级JS Cookie插件js-cookie的使用方法
Mar 22 Javascript
对vue 键盘回车事件的实例讲解
Aug 25 Javascript
20道JS原理题助你面试一臂之力(必看)
Jul 22 Javascript
swiper Scrollbar滚动条组件详解
Sep 08 Javascript
Vuex中的Mutations的具体使用方法
Jun 01 Javascript
Nest.js 授权验证的方法示例
Feb 22 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
PHP高级OOP技术演示
2009/08/27 PHP
2014年最新推荐的10款 PHP 开发框架
2014/08/01 PHP
php导出生成word的方法
2015/12/25 PHP
Thinkphp连表查询及数据导出方法示例
2016/10/15 PHP
Yii2选项卡的简单使用
2017/05/26 PHP
PHP memcache在微信公众平台的应用方法示例
2017/09/13 PHP
javascript 复杂的嵌套环境中输出单引号和双引号
2009/05/26 Javascript
jQuery实现企业网站横幅焦点图切换功能实例
2015/04/30 Javascript
JQuery实现的按钮倒计时效果
2015/12/23 Javascript
纯js实现手风琴效果代码
2020/04/17 Javascript
AngularJS中的Promise详细介绍及实例代码
2016/12/13 Javascript
深入理解JS继承和原型链的问题
2016/12/17 Javascript
vue.js移动端tab组件的封装实践实例
2017/06/30 Javascript
用vue的双向绑定简单实现一个todo-list的示例代码
2017/08/03 Javascript
浅谈angular4生命周期钩子
2017/09/05 Javascript
微信小程序支付之c#后台实现方法
2017/10/19 Javascript
深入理解node.js http模块
2018/01/24 Javascript
JS实现键值对遍历json数组功能示例
2018/05/30 Javascript
JavaScript实现烟花绽放动画效果
2020/08/04 Javascript
解决vue使用vant下拉框van-dropdown-item 绑定title值不变问题
2020/08/05 Javascript
[58:59]完美世界DOTA2联赛PWL S3 access vs CPG 第一场 12.13
2020/12/16 DOTA
python处理大数字的方法
2015/05/27 Python
Python基于动态规划算法解决01背包问题实例
2017/12/06 Python
python使用锁访问共享变量实例解析
2018/02/08 Python
Tensorflow之Saver的用法详解
2018/04/23 Python
Python 一句话生成字母表的方法
2019/01/02 Python
python 图片去噪的方法示例
2019/07/09 Python
python实现简单的学生管理系统
2021/02/22 Python
html5 canvas fillRect坐标和大小的问题解决方法
2014/03/26 HTML / CSS
机械系大学毕业生推荐信
2013/11/27 职场文书
小学毕业感言300字
2014/02/19 职场文书
挂牌仪式主持词
2014/03/20 职场文书
新闻传媒系求职信范文
2014/04/19 职场文书
全国税务系统先进集体事迹材料
2014/05/19 职场文书
新闻专业毕业生求职信
2014/08/08 职场文书
暑假社会实践心得体会
2014/09/02 职场文书