}); 注意当占位符作为参数传递而不是对象时,第二跟第三种形式可以结合来使用。 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
|