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 相关文章推荐
js控制iframe的高度/宽度让其自适应内容
Apr 09 Javascript
如何用JavaScript定义一个类
Sep 12 Javascript
node.js中的http.createClient方法使用说明
Dec 15 Javascript
JS实现动态移动层及拖动浮层关闭的方法
Apr 30 Javascript
分分钟玩转Vue.js组件(二)
Mar 01 Javascript
详谈js遍历集合(Array,Map,Set)
Apr 06 Javascript
JavaScript操作文件_动力节点Java学院整理
Jun 30 Javascript
cocos creator Touch事件应用(触控选择多个子节点的实例)
Sep 10 Javascript
微信小程序实现聊天对话(文本、图片)功能
Jul 06 Javascript
vue-quill-editor富文本编辑器简单使用方法
Sep 21 Javascript
微信小程序实现原生步骤条
Jul 25 Javascript
JavaScript实现网页tab栏效果制作
Nov 20 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
融入意大利的咖啡文化
2021/03/03 咖啡文化
PHP分页显示制作详细讲解
2006/10/09 PHP
PHP 简单日历实现代码
2009/10/28 PHP
通过5个php实例细致说明传值与传引用的区别
2012/08/08 PHP
浅谈PHP调用Webservice思路及源码分享
2014/06/04 PHP
PHP制作图形验证码代码分享
2014/10/23 PHP
php中filter_input函数用法分析
2014/11/15 PHP
php实现面包屑导航例子分享
2015/12/19 PHP
从性能方面考虑PHP下载远程文件的3种方法
2015/12/29 PHP
Zend Framework教程之连接数据库并执行增删查的方法(附demo源码下载)
2016/03/21 PHP
php无法连接mysql数据库的正确解决方法
2016/07/01 PHP
基于jQuery的简单的列表导航菜单
2011/03/02 Javascript
基于jQuery+HttpHandler实现图片裁剪效果代码(适用于论坛, SNS)
2011/09/02 Javascript
面向对象继承实例(a如何继承b问题)(自写)
2013/07/01 Javascript
jQuery响应enter键的实现思路
2014/04/18 Javascript
JavaScript实现的经典文件树菜单效果
2015/09/08 Javascript
使用Sticky组件实现带sticky效果的tab导航和滚动导航的方法
2016/03/22 Javascript
Bootstrap table分页问题汇总
2016/05/30 Javascript
基于AngularJs + Bootstrap + AngularStrap相结合实现省市区联动代码
2016/05/30 Javascript
基于jQuery实现点击列表加载更多效果
2016/05/31 Javascript
JS中作用域和变量提升(hoisting)的深入理解
2016/10/31 Javascript
ES6学习教程之对象的扩展详解
2017/05/02 Javascript
基于 Vue 实现一个酷炫的 menu插件
2017/11/14 Javascript
layui获取多选框中的值方法
2018/08/15 Javascript
vue 中基于html5 drag drap的拖放效果案例分析
2018/11/01 Javascript
从0到1搭建Element的后台框架的方法步骤
2019/04/10 Javascript
微信接入之获取用户头像的方法步骤
2019/09/23 Javascript
python requests 使用快速入门
2017/08/31 Python
Python实现微信自动好友验证,自动回复,发送群聊链接方法
2019/02/21 Python
python使用梯度下降和牛顿法寻找Rosenbrock函数最小值实例
2020/04/02 Python
python中的插入排序的简单用法
2021/01/19 Python
amazeui 验证按钮扩展的实现
2020/08/21 HTML / CSS
Levi’s美国官网:美国著名的牛仔裤品牌
2016/08/19 全球购物
疾病防治方案
2014/05/31 职场文书
小学英语教学反思范文
2016/02/15 职场文书
Python使用pandas导入xlsx格式的excel文件内容操作代码
2022/12/24 Python