设为首页 加入收藏

TOP

nodemysql部分中文文档(二)
2015-07-24 11:54:00 来源: 作者: 【 】 浏览:14
Tags:nodemysql 部分 中文 文档
});

注意当占位符作为参数传递而不是对象时,第二跟第三种形式可以结合来使用。

values 参数会覆盖掉选项对象中的 values

connection.query({
    sql: 'SELECT * FROM `books` WHERE `author` = ?',
    timeout: 40000, // 40s
  },
  ['David'],
  function (error, results, fields) {
    // error will be an Error if one occurred during the query
    // results will contain the results of the query
    // fields will contain information about the returned results fields (if any)
  }
);

编码查询值

为了防止SQL注入, 你在对用户提供的数据插入查询语句前应该总是对其进行编码 。
你可以这样做:
mysql.escape(), connection.escape() 或者pool.escape() 方法:

var userId = 'some user provided value';
var sql    = 'SELECT * FROM users WHERE id = ' + connection.escape(userId);
connection.query(sql, function(err, results) {
  // ...
});

你可以使用 ? 作为占位符给你想要编码的值,如下:

connection.query('SELECT * FROM users WHERE id = ?', [userId], function(err, results) {
  // ...
});

这里本质上其实使用了同样的 connection.escape() 方法

如果你留意的话, 你可能会注意到这可以使得你的语句变得简洁:

var post  = {id: 1, title: 'Hello MySQL'};
var query = connection.query('INSERT INTO posts SET ?', post, function(err, result) {
  // Neat!
});
console.log(query.sql); // INSERT INTO posts SET `id` = 1, `title` = 'Hello MySQL'

如果你想自己进行编码,你也可以直接使用 escaping 函数:

var query = "SELECT * FROM posts WHERE title=" + mysql.escape("Hello MySQL");

console.log(query); // SELECT * FROM posts WHERE title="Hello MySQL"

编码查询标志符

如果你不相信用户提供的查询标志符 (database / table / column name) , 你可以使用 mysql.escapeId(identifier),
connection.escapeId(identifier) 或pool.escapeId(identifier) 对其进行编码:

var sorter = 'date';
var sql    = 'SELECT * FROM posts ORDER BY ' + connection.escapeId(sorter);
connection.query(sql, function(err, results) {
  // ...
});

也可以加入合适的标识符,这都会编码.

var sorter = 'date';
var sql    = 'SELECT * FROM posts ORDER BY ' + connection.escapeId('posts.' + sorter);
connection.query(sql, function(err, results) {
  // ...
});

此外, 你可以使用 ?? 字符 作为占位符给你想要编码的标志符如下:

var userId = 1;
var columns = ['username', 'email'];
var query = connection.query('SELECT ?? FROM ?? WHERE id = ?', [columns, 'users', userId], function(err, results) {
  // ...
});

console.log(query.sql); // SELECT `username`, `email` FROM `users` WHERE id = 1

你可以传递一个对象给 .escape() or .query(), .escapeId() 来避免SQL注入。

创建查询语句

你可以使用 mysql.format 来创建一个多插入点的查询语句,对id和值适当的编码 。一个简单的例子:

var sql = "SELECT * FROM ?? WHERE ?? = ?";
var inserts = ['users', 'id', userId];
sql = mysql.format(sql, inserts);

这样你可以获得一个有效并且安全的查询语句

自定义格式

如果你喜欢另外一个查询编码格式, 有一个连接选项可以让你定义一个自定义的格式。
一个实现自定义格式的例子:

connection.config.queryFormat = function (query, values) {
  if (!values) return query;
  return query.replace(/\:(\w+)/g, function (txt, key) {
    if (values.hasOwnProperty(key)) {
      return this.escape(values[key]);
    }
    return txt;
  }.bind(this));
};

connection.query("UPDATE posts SET title = :title", { title: "Hello MySQL" });

获取插入行的id

如果你把一行插入有自增主键的表,可以这样获得插入的ID:

connection.query('INSERT INTO posts SET ?', {title: 'test'}, function(err, result) {
  if (err) throw err;

  console.log(result.insertId);
});

当处理大数字(在java script数精度上),你应该考虑启用supportbignumbers选项把ID作为字符串读取插入,否则将会抛出错误。
在从数据库取大数时也要启用这个选项

获取受影响的行数

你可以获得从插入,更新或删除语句受影响的行数。

connection.query('DELETE FROM posts WHERE title = "wrong"', function (err, result) {
  if (err) throw err;

  console.log('deleted ' + result.affectedRows + ' rows');
})

获取被改变的行数

你可以获得更新语句被改变的行数。

“changedRows”不同于 “affectedRows” 在于他不算没有被改变的值

connection.query('UPDATE posts SET ...', function (err, result) {
  if (err) throw err;

  console.log('changed ' + result.changedR
首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇mysql连接慢的问题 下一篇MySQL优化之――视图

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·Announcing October (2025-12-24 15:18:16)
·MySQL有什么推荐的学 (2025-12-24 15:18:13)
·到底应该用MySQL还是 (2025-12-24 15:18:11)
·进入Linux世界大门的 (2025-12-24 14:51:47)
·Download Linux | Li (2025-12-24 14:51:44)