【问题标题】:Insert Array Data from File into MYSQL using PHP使用 PHP 将数组数据从文件插入 MYSQL
【发布时间】:2022-11-11 15:50:12
【问题描述】:

我在尝试连接到 MySQL 数据库以从 .json 文件中插入某些 JSON 值时遇到问题。

我对处理数据、通过 PHP 等连接到数据库还是很陌生。

db 与找到此文件的位置位于同一 cpanel/host/server 中。如果我需要更改、添加或改进任何内容,请告诉我。

我正在尝试做的是读取 file.json,然后将这些条目插入到我服务器上的远程数据库中。

我正在寻找的是如何将这些值插入到将数据插入到 MYSQL 中,而不是在页面上打印。

这个问题没有回答我的问题:How to extract and access data from JSON with PHP?

    <!DOCTYPE html>
<html>
<body>
<h1>Insert Data into DB</h1>
<?php
   
$username = "user";
$password = "pass";


// Create connection
$con = new PDO('mysql:host=host;dbname=DBNAME', $username, $password);
   

    //read the json file contents
    $jsondata = file_get_contents('http://path.to.file.com/file.json');
    
   
    
    //convert json object to php associative array
    $data = json_decode($jsondata, true);
    
    foreach ($data as $jsons)
     {
          $id = null;
    $fname = null;
    $lname = null;
    $email = null;
    $phone = null;
    $date = null;
    $state = null;
    
    foreach($jsons as $key => $value)
     {
         if($key == 'id') {
             $id = $value;
         }
         
          if($key == 'date_created') {
             $date = $value;
         }
         
          if($key == '1') {
             $email = $value;
         }
         
          if($key == '3.3') {
             $fname = $value;
         }
         
          if($key == '3.6') {
             $lname = $value;
         }
         
         if($key == '5') {
             $phone = $value;
         }
         
         if($key == '6') {
             $state = $value;
         }
    
     }
    //insert into mysql table
    $sql = "INSERT INTO contact(id, date, first, last, phone, email, state)
    VALUES('$id', '$date', '$fname', '$lname', '$phone', '$email', '$state')";
    if(!mysql_query($sql,$con))
    {
        die('Error : ' . mysql_error());
    }
    }
?>

</body>
</html>

这是 JSON 条目的示例

{
    "total_count": 209,
    "entries": [
        {
            "id": "544537",
            "form_id": "2",
            "post_id": null,
            "date_created": "2022-10-21 17:26:18",
            "date_updated": "2022-10-21 17:26:18",
            "is_starred": "0",
            "is_read": "0",
            "ip": "68.126.222.136",
            "source_url": "/contact\",
            "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/106.0.0.0 Safari\/537.36",
            "currency": "USD",
            "payment_status": null,
            "payment_date": null,
            "payment_amount": null,
            "payment_method": null,
            "transaction_id": null,
            "is_fulfilled": null,
            "created_by": null,
            "transaction_type": null,
            "status": "active",
            "1": "email@email.com",
            "2": "Contractor\/GC",
            "3.3": "first",
            "3.6": "last",
            "4": "Company",
            "5": "(111)132-4567",
            "6": "California",
            "7": "I am seeking for a bid to furnish and install",
            "is_approved": "3",
            "3.2": "",
            "3.4": "",
            "3.8": "",
            "8": "",
            "workflow_current_status_timestamp": false,
            "gpnf_entry_parent": false,
            "gpnf_entry_parent_form": false,
            "gpnf_entry_nested_form_field": false
        },

【问题讨论】:

  • 你为什么这样做 $data = json_decode($jsondata, true);两次?
  • 警告:您对SQL Injections 持开放态度,应该使用参数化准备好的陈述而不是手动构建查询。它们由PDOMySQLi 提供。永远不要相信任何形式的输入!即使您的查询仅由受信任的用户执行,you are still in risk of corrupting your dataEscaping is not enough!
  • 警告:mysql_* 扩展自 PHP 5.5.0 (2013) 起已弃用,自 PHP 7.0.0 (2015) 起已被删除。相反,应该使用mysqliPDO_MySQL 扩展名。在选择 MySQL API 时,另请参阅MySQL API Overview 以获得更多帮助。
  • Dharman 是对的,使用准备好的语句并且 mysql_* 已过时。
  • @ValeriuCiuca 一定是个意外。我删除了它,仍然没有

标签: php mysql sql arrays json


【解决方案1】:

你应该做:

foreach ($data['entries'] as $jsons)

因为你遍历条目。你还有:

$data = json_decode($jsondata, true);

两次。

【讨论】:

  • 我很高兴!我不知道为什么人们投票反对。这就是问题所在,pdo/mysqli 建议只是最佳实践,不能解决问题。但是您应该使用 mysqli 或 pdo prepare 语句重写您的查询。
  • 我实际上也更改了与 mysqli 的连接。我只是没有在这里更新代码。我遇到了另一种情况,我必须确保写入新数据并且不覆盖现有数据
  • 您应该在表上添加一个约束,在电子邮件列上添加一个唯一键,或者在列组合上添加一个复合键。您还可以在插入之前进行查询以检查现有数据。
  • 您应该为必须唯一的所有内容添加唯一键。这是你的决定。
  • 打印循环中的每个 SQL 查询..也许你有一个打破循环的约束、重复的行或其他东西
猜你喜欢
  • 2013-12-27
  • 1970-01-01
  • 2012-04-20
  • 1970-01-01
  • 1970-01-01
  • 2012-10-15
相关资源
最近更新 更多