Я не получаю последний идентификатор в MySQL и узле - PullRequest
0 голосов
/ 15 марта 2020

У меня есть проблема, которую я не смог решить со вчерашнего дня, это код, который я приведу ниже, но я хотел сделать точность, у меня есть 2 таблицы, wp posts и wp post meta, я пытаюсь получить последний идентификатор сообщения, а затем вставить в соответствии с этим, поскольку я использую обещания, что, но последняя функция "insertlink" не возвращает последний идентификатор, она говорит, что она не определена, я не понимаю, спасибо.

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");
  });
}
}

1 Ответ

1 голос
/ 15 марта 2020

Использование SELECT ID ... ORDER BY ID DESC LIMIT 1 для поиска значения, которое будет использоваться для вставок вашего фолловера, с уважением, подвержено ошибкам и плохая идея . Если более чем один клиент на вашем MySQL сервере пытается выполнить подобные действия одновременно, у вас будет условие гонки, которое может выдавать неправильные значения идентификатора.

Вам необходимо использовать LAST_INSERT_ID() или один из его вариантов. Пакет npm mysql позволяет использовать для этой цели 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);

Примечание как значение в resolve(result) в вашей первой функции Promise передается как параметр вашей второй функции Promise.

Pro tip Всегда делайте отступ в своем коде. Если вы не хотите делать это самостоятельно, используйте IDE, например Visual Studio Code или Webstorm, или хороший текстовый редактор. Почему? Легче читать.

Pro tip 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 инъекций .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...