写在前面: 本文不介绍用mysql存储session的相关操作,该过程在登陆验证一节中再进行介绍。
本文主要是介绍自己在开发部署个人网站时关于mysql的一些使用心得。
本文的前情介绍页:网站搭建
该网站采用mysql.js作为本文的数据库连接库,由于使用express故先介绍express下的数据库配置,关于mysql的安装这里不作介绍,可以参考:mac安装mysql的两种方法。当然这个过程并非是一番丰顺的,出现过很多错误,如:
总之,一般都可以在stackoverflow上找到答案。
mysql的配置很简单,基本都是根据mysql.js文档的文档进行配置的,主要代码如:
var mysql=require("mysql");
var pool = mysql.createPool({
host: '127.0.0.1',
user: '**',
multipleStatements:true, //配置true一次可以执行多条语句
password: '**',
database: '**',
port: 3306
});
var query=function(sql,callback){
pool.getConnection(function(err,conn){
if(err){
callback(err,null,null);
}else{
conn.query(sql,function(qerr,vals,fields){
//释放连接
conn.release();
//事件驱动回调
callback(qerr,vals,fields);
});
}
});
};
module.exports=query;
这段代码起初部署在本地,所以才采取的是127.0.0.1
但是实际部署在服务器上时,由于本站的文件和数据库服务都是部署在同一个服务器上的,因此无需更改相应的设置。不过如果改变了数据库的位置,必须要对更改相应的配置。
SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。
——百度百科*sql注入
在上面介绍的代码中,sql语句采用的是拼接字符串的形式组成的,所以极大可能存在sql注入的危险。此处有两个解决办法:
var post = {id: 1, title: 'Hello MySQL'};
var query = connection.query('INSERT INTO posts SET ?', post, function (error, results, fields) {
if (error) throw error;
// Neat!
});
mysql.escape
、connection.escapeId
、pool.escapeId
来对用户输入字符进行处理,本站采用的是滴一种mysql.escape:var sorter = 'date';
var sql = 'SELECT * FROM posts ORDER BY ' + connection.escapeId('posts.' + sorter);
由于本网站在更新标签信息时,势必会存在一种情况是否存在需要检查是否该种标签并没有任何博客引用,即不存在任何博客使用该标签,此时对这种标签该予以删除。这里并没有采用触发器检查,而是在删除一组标签和博客的对应关系时,检查该标签是否不存在博客的引用。 每次统计该标签的对应关系是否为0,若为0时则需要删除该标签,故sql语句为:
delete from tag where tagId = "+mysql.escape(delCateArr[i].tagId)+" and (select count(*) from addTags where tagId="+mysql.escape(delCateArr[i].tagId)+")=0;
由于博客存在更改的情况,故在博客更新时应该将其与新创建的博客放置在一起,同时排序。常见的排序方法如下:
select * from data order by updateTime desc, writeTime desc;
//缺点:呆板的按照按照updateTime排序,再在排序结果中按照writeTime排序,
目前没有找到更好的办法
这一功能随处可见,一般为用户输入的联想词查询。在本站中,由于输入的标签数据必须保证不重复,因此,使用联想词提示查询数据库已有结果,同时将结果反馈给用户。这里的联想词查询使用的就是数据库模糊查询。关于数据库模糊查询,网络上有很多介绍,如:
以下来自http://www.jb51.net/article/48315.htm
1,%:表示任意0个或多个字符。可匹配任意类型和长度的字符,有些情况下若是中文,请使用两个百分号(%%)表示。
比如 SELECT * FROM [user] WHERE u_name LIKE ‘%三%’
将会把u_name为“张三”,“张猫三”、“三脚猫”,“唐三藏”等等有“三”的记录全找出来。
另外,如果需要找出u_name中既有“三”又有“猫”的记录,请使用and条件
SELECT * FROM [user] WHERE u_name LIKE ‘%三%’ AND u_name LIKE ‘%猫%’
若使用 SELECT * FROM [user] WHERE u_name LIKE ‘%三%猫%’虽然能搜索出“三脚猫”,但不能搜索出符合条件的“张猫三”。
2,_: 表示任意单个字符。匹配单个任意字符,它常用来限制表达式的字符长度语句:
比如 SELECT * FROM [user] WHERE u_name LIKE ‘三’
只找出“唐三藏”这样u_name为三个字且中间一个字是“三”的;再比如 SELECT * FROM [user] WHERE u_name LIKE ‘三__’; 只找出“三脚猫”这样name为三个字且第一个字是“三”的;
3,[ ]:表示括号内所列字符中的一个(类似正则表达式)。指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。
比如 SELECT * FROM [user] WHERE u_name LIKE ‘[张李王]三’ 将找出“张三”、“李三”、“王三”(而不是“张李王三”);
如 [ ] 内有一系列字符(01234、abcde之类的)则可略写为“0-4”、“a-e”
SELECT * FROM [user] WHERE u_name LIKE ‘老[1-9]’ 将找出“老1”、“老2”、……、“老9”;4,[^ ] :表示不在括号所列之内的单个字符。其取值和 [] 相同,但它要求所匹配对象为指定字符以外的任一个字符。
比如 SELECT * FROM [user] WHERE u_name LIKE ‘[^张李王]三’ 将找出不姓“张”、“李”、“王”的“赵三”、“孙三”等;
SELECT * FROM [user] WHERE u_name LIKE ‘老[^1-4]’; 将排除“老1”到“老4”,寻找“老5”、“老6”、……5,查询内容包含通配符时
由于通配符的缘故,导致我们查询特殊字符“%”、“_”、“[”的语句无法正常实现,而把特殊字符用“[ ]”括起便可正常查询。据此我们写出以下函数:
function sqlencode(str) str=replace(str,”’;”,”’;’;”)
str=replace(str,”[“,”[[]”) ‘;此句一定要在最先 str=replace(str,”“,”[]”) str=replace(str,”%”,”[%]”) sqlencode=str end function
本文没有太多考虑联想词的用户体验,因此直接采用第一种,提示所有与用户有关的输入的词,而实际在云联想词时应该把与用户相似度最高的或者预测用户输入的结果放置在前面,而将其他结果放置在后面(如用户输入有误时)。
网站在测试初期,数据库的创建都是在本地数据库中的,因此这里需要将创建的数据库结构、数据,特别是结构及设置导出到sql文件中,再在服务器中导入。
在数据库导出的过程中,由于mysql管理在mysqlworkbench中,因此只需要操作workbench就好了,这里不做介绍。
在服务器中,在mysql环境中,输入以下命令执行sql文件:
source /var/ftp/pub/sogoodsoft.sql(文件位置);
由于本网站是中文的,因此在创建数据库中最麻烦的事是设置字段为中文编码格式,这里便于与其它的兼容,统一设置为utf8,最初默认为latin1。
在未创建任何表和数据库时,更改全局数据库配置后在创建数据库和表格可以使用utf8的中文编码。但是若已经创建了,但是不想删除时,这时候还需要修改数据库某些字段的编码格式。
mysql 更改库表字段的编码
1.创建库时指定编码:create database testdb default charset GBK2.修改库的编码: ALTER DATABASE
testtable
DEFAULT CHARACTER SET utf8 COLLATE utf8_bin3.修改表的编码:ALTER TABLE
testtable
DEFAULT CHARACTER SET utf8 COLLATE utf8_bin 44.修改字段的编码:
ALTER TABLEtablename
CHANGEdd
dd
VARCHAR( 45 ) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL
是将MYSQL数据库tablename表中 dd的字段编码改能够该为utf8