【问题标题】:How do I break up a JSON object to insert into a MySQL table?如何分解 JSON 对象以插入 MySQL 表?
【发布时间】:2020-08-23 11:26:34
【问题描述】:

总结

我收到了一些 JSON 数据:

// Now Get Only New Listings
 finalArray = _.difference(existingResults, items);

我需要将这些值插入其中:

有些进来的数据不能填满所有的列。在这种情况下,我想将它们留空。

这是数据的样子(可能是众多数据之一)...

{
    price: '$6,000',
    title: '1999 Jeep Wrangler SE Sport Utility 2D',
    location: 'Auburndale, Florida',
    miles: '12K miles',
    imgUrl: 'http://www.example.com/pic.jpg',
    itemURL: '/products/item/36427/'
  }

所以我需要弄清楚如何遍历每个 JSON 对象,并插入到正确的列中。

var insertQuery = 'Your code here! :)  ';

我想查询需要在某个地方循环吗?还是一个大的插入语句?

任何建议或代码将不胜感激。谢谢。


注意

使用:NodeJS 和 JawsDB MySQL(如果信息很重要)

【问题讨论】:

    标签: javascript mysql node.js json


    【解决方案1】:

    以下方法仅在您的有效负载没有任何嵌套对象时才有效。使用 ES6 地图来完成这项工作。我使用connection.escape() 删除了 JSON 中的任何可注入脚本,以防止 SQL 注入攻击。我希望你已经为 node.js 安装了mysql 连接器。

    const mysql      = require('mysql');
    const connection = mysql.createConnection({
      host     : 'localhost',
      user     : 'me',
      password : 'secret',
      database : 'my_db'
    });
    
    connection.connect();
    
    const payload = {
        price: '$6,000',
        title: '1999 Jeep Wrangler SE Sport Utility 2D',
        location: 'Auburndale, Florida',
        miles: '12K miles',
        imgUrl: 'http://www.example.com/pic.jpg',
        itemURL: '/products/item/36427/'
    }
    
    const map = new Map(Object.entries(payload));
    const keys = map.keys();
    const values =  map.values();
    
    const insertQuery = `
    INSERT INTO TABLE_NAME (${connection.escape(keys.next().value)},
                            ${connection.escape(keys.next().value)},
                            ${connection.escape(keys.next().value)},
                            ${connection.escape(keys.next().value)},
                            ${connection.escape(keys.next().value)},
                            ${connection.escape(keys.next().value)})
                VALUES     (${connection.escape(values.next().value)},
                            ${connection.escape(values.next().value)},
                            ${connection.escape(values.next().value)},
                            ${connection.escape(values.next().value)},
                            ${connection.escape(values.next().value)},
                            ${connection.escape(values.next().value)});
    `
    connection.query(insertQuery, function (error, results, fields) {
      if (error) throw error;
      // ...
    });
    console.log(insertQuery);
    

    【讨论】:

    • 以这种方式构建查询允许 SQL 注入攻击。为什么不使用专用连接器正确构建查询?
    • 100% 同意你的观点,Anastazy...我不明白为什么@John S. 想要这种方式来创建插入查询...我希望他可能知道他在做什么...
    • 我建议您编辑答案并至少添加一些评论,说明这样做很容易受到攻击。以目前的形式,你正在教如何被黑客入侵。
    • 也许我做错了。这就是我正在做的事情......我正在抓取一个页面,并形成一个包含所有数据的 JSON 对象。我使用 Heroku 作为服务器,所以我无法写回 JSON 文件(Dynos 显然处于睡眠状态或导致更改不持久的东西)。无论如何,我创建了一个 mySQL 数据库来保存我的数据。所以我想我会取回这个 JSON,并将其插入数据库。我当然不想让自己面对 SQL 注入攻击。我只是想获取我的 JSON 对象并将其插入到我的数据库中的正确列中。我的帖子是否在正确的轨道上?
    • @JohnS。每次您必须处理“不受信任”的输入时,请使用适当的转义函数——这意味着您不能保证它是正确的,并且它超出了您的代码并且您无法控制它。在这里查看更多示例如何使用 mysql 驱动程序npmjs.com/package/mysql#escaping-query-values 完成它并且永远不要将简单的字符串连接与不受信任的输入一起使用。
    猜你喜欢
    • 2018-04-20
    • 1970-01-01
    • 2020-11-19
    • 2016-05-04
    • 1970-01-01
    • 2020-12-11
    • 1970-01-01
    • 2018-06-19
    • 2019-03-17
    相关资源
    最近更新 更多