前言

我们在上一篇文章《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)。
总结
由于官方文档比较零碎,因此整理得不是很到位,有问题的地方希望大家指正。以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。
# nodejs查询mysql
# nodejs
# mysql数据库
# mysql查询语句
# node.js 开发指南 – Node.js 连接 MySQL 并进行数据库操作
# Node.js下向MySQL数据库插入批量数据的方法
# Node.js操作mysql数据库增删改查
# Node.js数据库操作之连接MySQL数据库(一)
# node.js平台下的mysql数据库配置及连接
# 从零学习node.js之mysql数据库的操作(五)
# Linux下为Node.js程序配置MySQL或Oracle数据库的方法
# Node.js实现连接mysql数据库功能示例
# Node.js对MySQL数据库的增删改查实战记录
# node.js如何操作MySQL数据库
# Node.js实现http请求服务与Mysql数据库操作方法详解
# node.js对于数据库MySQL基本操作实例总结【增删改查】
# 种方法
# 是一个
# 第二种
# 让我们
# 是这样
# 数据库中
# 查询结果
# 回调
# 潘多拉
# 第三种
# 的是
# 组中
# 都是
# 这是
# 我就
# 就会
# 来了
# 是因为
# 第一个
# 将会
相关文章:
网站制作公司,橙子建站是合法的吗?
如何选择可靠的免备案建站服务器?
专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?
广州顶尖建站服务:企业官网建设与SEO优化一体化方案
c++怎么使用类型萃取type_traits_c++ 模板元编程类型判断【方法】
建站之星ASP如何实现CMS高效搭建与安全管理?
移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?
如何通过网站建站时间优化SEO与用户体验?
建站主机服务器选型指南与性能优化方案解析
如何批量查询域名的建站时间记录?
代刷网站制作软件,别人代刷火车票靠谱吗?
安云自助建站系统如何快速提升SEO排名?
如何在自有机房高效搭建专业网站?
如何快速生成ASP一键建站模板并优化安全性?
,石家庄四十八中学官网?
定制建站流程解析:需求评估与SEO优化功能开发指南
建站之星代理费用多少?最新价格详情介绍
如何选择高效稳定的ISP建站解决方案?
七夕网站制作视频,七夕大促活动怎么报名?
建站主机解析:虚拟主机配置与服务器选择指南
如何解决ASP生成WAP建站中文乱码问题?
如何通过宝塔面板实现本地网站访问?
青岛网站建设如何选择本地服务器?
建站之星如何快速解决建站难题?
如何规划企业建站流程的关键步骤?
如何在阿里云完成域名注册与建站?
在线流程图制作网站手机版,谁能推荐几个好的CG原画资源网站么?
如何通过商城免费建站系统源码自定义网站主题?
如何在万网ECS上快速搭建专属网站?
公众号网站制作网页,微信公众号怎么制作?
如何通过可视化优化提升建站效果?
猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?
香港服务器选型指南:免备案配置与高效建站方案解析
清单制作人网站有哪些,近日“兴风作浪的姑奶奶”引起很多人的关注这是什么事情?
建站之星安装后界面空白如何解决?
,想在网上投简历,哪几个网站比较好?
济南网站制作的价格,历城一职专官方网站?
网站代码制作软件有哪些,如何生成自己网站的代码?
制作旅游网站html,怎样注册旅游网站?
建站之星2.7模板快速切换与批量管理功能操作指南
免费网站制作模板下载,除了易企秀之外还有什么H5平台可以制作H5长页面,最好是免费的?
制作宣传网站的软件,小红书可以宣传网站吗?
建站之星微信建站一键生成小程序+多端营销系统
海南网站制作公司有哪些,海口网是哪家的?
nginx修改上传文件大小限制的方法
制作证书网站有哪些,全国城建培训中心证书查询官网?
建站之星展会模板:智能建站与自助搭建高效解决方案
如何快速选择适合个人网站的云服务器配置?
北京网站制作公司哪家好一点,北京租房网站有哪些?
如何在阿里云香港服务器快速搭建网站?
*请认真填写需求信息,我们会在24小时内与您取得联系。