【问题标题】:I am not getting the last ID in MySQL and Node我没有得到 MySQL 和 Node 中的最后一个 ID
【发布时间】:2020-03-16 08:34:18
【问题描述】:

我有一个从昨天开始一直无法解决的问题,这是我将在下面放置的代码,但我想精确,我有 2 个表,wp 帖子和 wp 帖子元,我尝试获取帖子的最后一个 id,然后根据它插入,因为我使用了 promises,但是最后一个函数“insertlink”没有返回最后一个 id,它说它没有定义,我不明白,谢谢。

function insertarpost()

{
return new Promise(function(resolve, reject) {
  var sql = "INSERT INTO `wp_posts` ( `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`,`post_excerpt`, `post_status`,`comment_status`, `ping_status`,`post_password`, `post_name`,`to_ping`,`pinged`, `post_modified`, `post_modified_gmt`,`post_content_filtered`,`post_parent`, `guid`,`menu_order`, `post_type`, `post_mime_type`,`comment_count`) VALUES (1, '"+fhoy+"', '"+fhoy+"', '"+description+"', '"+title+"','', 'publish', 'open', 'closed','','"+slug+"','','', '"+fhoy+"', '"+fhoy+"','', '0','','0', 'movies','' ,0);";
  con.query(sql, function (err, result) {
    if (err)  throw err;
    resolve(result);
    console.log("1 registro insertado");
  });

});
}




insertarpost().then(obtenerultimopostid);

function obtenerultimopostid() {
return new Promise(function(resolve, reject) {
  con.query("SELECT ID FROM wp_posts ORDER BY ID DESC LIMIT 0,1;", function (err, result, fields) {
  console.log(result);
    var sql = "INSERT INTO wp_postmeta (post_id, meta_key, meta_value) VALUES ("+result[0].ID+",'runtime', '"+runtime+"'),("+result[0].ID+",'original_title','"+titleoriginal+"'),("+result[0].ID+",'Rated','"+cpgrated+"'),("+result[0].ID+",'Country', '"+country+"'),("+result[0].ID+",'date', '"+datemovie+"'),("+result[0].ID+",'imdbRating', '"+repimdb+"'),("+result[0].ID+",'vote_average', '"+reptmdb+"'),("+result[0].ID+",'imdbVotes', '"+quantimdb+"'),("+result[0].ID+",'vote_count', '"+quanttmdb+"'),("+result[0].ID+",'tagline', '"+tagline+"'),("+result[0].ID+",'dt_poster', '"+poster+"'),("+result[0].ID+",'dt_backdrop', '"+backdrop+"'),("+result[0].ID+",'imagenes', '"+backdrops+"'),("+result[0].ID+",'dt_cast', '"+textimgreparto+"'),("+result[0].ID+",'dt_dir', '"+textimgreparto2+"');";
  con.query(sql, function (err, result) {
    if (err) throw err;
    resolve(result);
    console.log("1 registro wpmeta insertado");
  });

});
  });  

}
obtenerultimopostid().then(insertarlink);


var idultimomovie='';


  function insertarlink() {
var sql ="SELECT ID FROM wp_posts ORDER BY ID DESC LIMIT 0,1;";
con.query(sql, function (err, result) {
    if (err)  throw err;
    idultimomovie=result[0].ID;
    console.log(idultimomovie);
  });

    for(var i=0;i<getData.length;i++) {

    var source=getData[i]['source'];
    var text =getData[i]['text'];
    var quality = getData[i]['quality'];

var sql = "INSERT INTO `wp_posts` ( `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`,`post_excerpt`, `post_status`,`comment_status`, `ping_status`,`post_password`, `post_name`,`to_ping`,`pinged`, `post_modified`, `post_modified_gmt`,`post_content_filtered`,`post_parent`, `guid`,`menu_order`, `post_type`, `post_mime_type`,`comment_count`) VALUES (1, '"+fhoy+"', '"+fhoy+"', '', '"+make+"','', 'publish', 'closed', 'closed','','"+make+"','','', '"+fhoy+"', '"+fhoy+"','', '"+idultimomovie+"','','0', 'dt_links','' ,0);";
  con.query(sql, function (err, result) {
    if (err)  throw err;
    console.log("1 registro link insertado");
  });
}
}

【问题讨论】:

  • 我不明白,当我删除函数'insertlink'或留下一个简单的'console.log()'消息时我得到一个错误,好像有什么问题只需命名即可。
  • node.js 中是否禁止格式化?

标签: mysql node.js wordpress


【解决方案1】:

使用SELECT ID ... ORDER BY ID DESC LIMIT 1 来查找用于后续插入的值是,容易出错且是个坏主意。如果您的 MySQL 服务器的多个客户端尝试同时执行此类操作,您将遇到可能提供错误 ID 值的竞争条件。

您需要使用LAST_INSERT_ID() 或其变体之一。 npm mysql package lets you use result.insertId 用于此目的。

你可以在你的代码中做这样的事情。

function insertarpost()  {
    return new Promise(function(resolve, reject) {
        var sql = "INSERT INTO `wp_posts` whatever...;";
        con.query(sql, function (err, result) {
            if (err)  throw err;
            console.log ('ID to use for wp_postmeta', result.insertId)
            resolve(result);
        } );
    } );
}

function obtenerultimopostid(previousResult) {
    /* you get the result from the previous promise in previousResult */
    return new Promise(function(resolve, reject) {
        var postId = previousResult.insertId
        var sql = "INSERT INTO wp_postmeta (post_id, meta_key, meta_value) VALUES (" + postId + ", .... whatever )";
        con.query(sql, function (err, result) {
            if (err) throw err;
            resolve(result);
        } );
    } );
}

insertarpost().then(obtenerultimopostid);

注意第一个 Promise 函数中 resolve(result) 中的值是如何作为参数传递给第二个 Promise 函数的。

专业提示始终缩进您的代码。如果您不想自己动手,请使用 Visual Studio Code 或 Webstorm 之类的 IDE,或者使用好的文本编辑器。为什么?更容易阅读。

专业技巧 2 参数化您的 SQL 语句。使用这样的东西:

var sql = "INSERT INTO wp_postmeta (post_id, meta_key, meta_value) VALUES (?, ?, ?)"
var postId = previousResult.insertId;
var key = "whatever";
var val = "whatelse";
con.query (sql, [postId, key, value], function (err, result) {
    /* whatever */
} );

为什么?更容易阅读,更不容易受到SQL injection 的攻击。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-28
    • 2016-05-31
    相关资源
    最近更新 更多