【问题标题】:Fetching JSON data获取 JSON 数据
【发布时间】:2023-03-30 04:21:01
【问题描述】:

我在 PHP 中获取 JSON 数据时遇到问题。下面是我的代码和 JSON 文件。问题是它只获取 JSON 的第一个产品并且不会遍历整个循环。

我知道一定有一个小错误,因为它只获取第一行。

<html>  
      <head>  
           <title>Test</title> 
           <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js"></script>
           <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" />
           <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
           <style>

            .box
            {
                width:750px;
                padding:20px;
                background-color:#fff;
                border:1px solid #ccc;
                border-radius:5px;
                margin-top:100px;
            }
        </style>
      </head>  
      <body>  
            <div class="container box">
                <h3 align="center">Import JSON File Data into Postgresql</h3><br />
                <?php
                $host = "localhost"; // db ip
                $user = "postgres"; // db username (mention your db password here)
                $pass = "postgres";// database password
                $db = "json_order"; // db 
                    // Connecting to my database 
                $connect = pg_connect("host=$host dbname=$db user=$user password=$pass") or die ("Could not connect to server\n");
                //$connect = mysqli_connect("localhost", "root", "", "employee"); //Connect PHP to MySQL Database
                $query = '';
                $table_data = '';
                $filename = "testdata.json";
                $data = file_get_contents($filename); //Read the JSON file in PHP
                $array = json_decode($data, true); //Convert JSON String into PHP Array
                $i=0;
                foreach($array as $row) //Extract the Array Values by using Foreach Loop
                {
                            // Make Multiple Insert Query 
                    $query .= "INSERT INTO order_insert(id,title) VALUES ('".$row[$i]["id"]."', '".$row[$i]["title"]."')";      // Make Multiple Insert Query 

                    $table_data .= '
                        <tr>
                            <td>'.$row[$i]["id"].'</td>
                            <td>'.$row[$i]["title"].'</td>
                        </tr>
                    ';                  
                    $i++;
                }
                if(pg_query($connect, $query))  //Run Mutliple Insert Query
                {
                    echo '<h3>Imported JSON Data</h3><br />';

                    echo '
                        <table class="table table-bordered">
                                <tr>
                                    <th width="45%">ID</th>
                                    <th width="10%">Title</th>
                                </tr>
                    ';
                    echo $table_data;       
                    echo '</table>';
                }




                ?>
                <br />
            </div>  
      </body>  
</html> 

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

{  
   "products":[  
      {  
         "id":4790584326,
         "title":"Black Sand"
      },
      {  
         "id":4790581318,
         "title":"Black Sea"
      },
      {  
         "id":4790599046,
         "title":"BLOSSOM MANAMI (02-A)"
      },
      {  
         "id":4790598534,
         "title":"BLOSSOM MANAMI (02-B)"
      },
      {  
         "id":4790587462,
         "title":"Blue Breeze"
      },
      {  
         "id":4790600326,
         "title":"Bow Bells"
      },
      {  
         "id":1008999299,
         "title":"Copy of Product 1"
      },
      {  
         "id":4790601542,
         "title":"Coral Charm"
      },
      {  
         "id":4790588550,
         "title":"Coral spectrum"
      },
      {  
         "id":4790589446,
         "title":"Dazzling Sea"
      },
      {  
         "id":4790600646,
         "title":"Emerald Woo"
      },
      {  
         "id":4790592518,
         "title":"Enchanted Blossom"
      },
      {  
         "id":4790595206,
         "title":"FLORAL SAGA (05-A)"
      },
      {  
         "id":4790595846,
         "title":"FLORAL SAGA (05-B)"
      },
      {  
         "id":4790596678,
         "title":"FLORENTINA (08-A)"
      },
      {  
         "id":4790596422,
         "title":"FLORENTINA (08-B)"
      },
      {  
         "id":4790593030,
         "title":"IMPERIAL BOUQUET (06-A)"
      },
      {  
         "id":4790594630,
         "title":"IMPERIAL BOUQUET (06-B)"
      },
      {  
         "id":4790598150,
         "title":"IRIS INVERSE (03-A)"
      },
      {  
         "id":4790597958,
         "title":"IRIS INVERSE (03-B)"
      },
      {  
         "id":4790585606,
         "title":"Mesmerised Ocean"
      },
      {  
         "id":6517629254,
         "title":"Mesmerising Bouquet"
      },
      {  
         "id":4790591046,
         "title":"Midnight Grandeur"
      },
      {  
         "id":4790599750,
         "title":"MORNING FLOSS (01-A)"
      },
      {  
         "id":4790599366,
         "title":"MORNING FLOSS (01-B)"
      },
      {  
         "id":4790584774,
         "title":"Mother of pearls"
      },
      {  
         "id":4790590662,
         "title":"Nautical Overboard"
      },
      {  
         "id":4790583558,
         "title":"Ocean Punch"
      },
      {  
         "id":4790584006,
         "title":"Opal Muse"
      },
      {  
         "id":9229155654,
         "title":"p1"
      },
      {  
         "id":9256445510,
         "title":"p1"
      },
      {  
         "id":1005959875,
         "title":"Product 1"
      },
      {  
         "id":4790592006,
         "title":"Radiant Rose"
      },
      {  
         "id":4790582278,
         "title":"Rogue Breeze"
      },
      {  
         "id":4790597702,
         "title":"ROSABELLA (04-A)"
      },
      {  
         "id":4790597062,
         "title":"ROSABELLA (04-B)"
      },
      {  
         "id":4790581830,
         "title":"Sea News"
      },
      {  
         "id":4790586438,
         "title":"Seaweed lust"
      },
      {  
         "id":4790600966,
         "title":"Spiritual Marvel"
      },
      {  
         "id":8994515974,
         "title":"Stitch My Fabric"
      },
      {  
         "id":1949467075,
         "title":"test4"
      },
      {  
         "id":1949486851,
         "title":"test4"
      },
      {  
         "id":4790582854,
         "title":"Ultramarine"
      },
      {  
         "id":4790591558,
         "title":"Viva Glam"
      },
      {  
         "id":4790594118,
         "title":"WHIMSICAL VINES (07-A)"
      },
      {  
         "id":4790593478,
         "title":"WHIMSICAL VINES (07-B)"
      }
   ]
}

【问题讨论】:

  • 您好,感谢您的快速回复。我使用了这个循环,但它给出了“未定义的索引”错误
  • 请不要使用循环,我请查看此帖子更多信息stackoverflow.com/questions/18464457/…

标签: php json postgresql


【解决方案1】:

你可以试试。

<html>  
      <head>  
           <title>Test</title> 
           <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js"></script>
           <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" />
           <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
           <style>

            .box
            {
                width:750px;
                padding:20px;
                background-color:#fff;
                border:1px solid #ccc;
                border-radius:5px;
                margin-top:100px;
            }
        </style>
      </head>  
      <body>  
            <div class="container box">
                <h3 align="center">Import JSON File Data into Postgresql</h3><br />
                <?php
                $host = "localhost"; // db ip
                $user = "postgres"; // db username (mention your db password here)
                $pass = "postgres";// database password
                $db = "json_order"; // db 
                    // Connecting to my database 
                $connect = pg_connect("host=$host dbname=$db user=$user password=$pass") or die ("Could not connect to server\n");
                //$connect = mysqli_connect("localhost", "root", "", "employee"); //Connect PHP to MySQL Database
                $query = '';
                $table_data = '';
                $filename = "testdata.json";
                $data = file_get_contents($filename); //Read the JSON file in PHP
                $array = json_decode($data, true); //Convert JSON String into PHP Array
                $i=0;
                foreach($array['products'] as $row) //Extract the Array Values by using Foreach Loop
                {
                            // Make Multiple Insert Query 
                    $query .= "INSERT INTO order_insert(id,title) VALUES ('".$row["id"]."', '".$row["title"]."')";      // Make Multiple Insert Query 

                    $table_data .= '
                        <tr>
                            <td>'.$row["id"].'</td>
                            <td>'.$row["title"].'</td>
                        </tr>
                    ';                  
                    $i++;
                }
                if(pg_query($connect, $query))  //Run Mutliple Insert Query
                {
                    echo '<h3>Imported JSON Data</h3><br />';

                    echo '
                        <table class="table table-bordered">
                                <tr>
                                    <th width="45%">ID</th>
                                    <th width="10%">Title</th>
                                </tr>
                    ';
                    echo $table_data;       
                    echo '</table>';
                }




                ?>
                <br />
            </div>  
      </body>  
</html> 

【讨论】:

    【解决方案2】:

    由于您使用foreach($array as $row) 循环JSON 数据,因此无需使用$i 变量,因为可以通过$row 变量访问json 对象的每个元素。

    编辑:

    此外,多重插入查询应采用以下格式:

    INSERT INTO table(column1, column2) VALUES (value1, value2), ( Value1, Value2 )....
    

    所以把你的代码改成这样:

    $query = "INSERT INTO order_insert(id,title) VALUES ";
    foreach($array['products'] as $row) //Extract the Array Values by using Foreach Loop
                {
                            // Make Multiple Insert Query 
                    $query .= " ('".$row["id"]."', '".$row["title"]."'), ";      // Make Multiple Insert Query 
    
                    $table_data .= '
                        <tr>
                            <td>'.$row["id"].'</td>
                            <td>'.$row["title"].'</td>
                        </tr>
                    ';                  
                }
    

    第二次编辑:

    最终查询的末尾会有一个额外的,,所以要删除你应该这样做:

    $theQuery = rtrim($theQuery,", ");
    

    这是一个有效的Fiddle

    【讨论】:

    • 答案已经存在于 stsckoverflow stackoverflow.com/questions/18464457/…
    • 这是答案的一部分,在OP代码中有两个问题1)循环JSON数据,2)创建多个插入查询
    • 您好,感谢您的及时回复。我已经尝试了上面的代码,但它仍然只显示第一行
    • 但是 JSON 以数组开头。我的 JSON 格式有点不同。我已经编写了一个代码,该代码在您的链接中的 JSON 文件上运行良好
    • @TalalHaider,那是因为查询末尾有一个额外的,。我更新了我的答案,请看一下。
    【解决方案3】:

    使用这个

    foreach($array->products as $row) //Extract the Array Values by using Foreach Loop
                    {
                                // Make Multiple Insert Query 
                        $query .= "INSERT INTO order_insert(id,title) VALUES ('".$row[$i]["id"]."', '".$row[$i]["title"]."')";      // Make Multiple Insert Query 
    
                        $table_data .= '
                            <tr>
                                <td>'.$row->id.'</td>
                                <td>'.$row->title.'</td>
                            </tr>
                        ';                  
    
                    }
    

    【讨论】:

    • print_r($array['products']), print_r($array) 和 print_r($array->products) 会得到什么
    【解决方案4】:

    你需要遍历 products 数组

                $i=0; //remove no need
                foreach($array['products'] as $row)  //change to $array['products']
                {
                            // Make Multiple Insert Query 
                    $query .= "INSERT INTO order_insert(id,title) VALUES ('".$row["id"]."', '".$row["title"]."')";      // Make Multiple Insert Query 
    
                    $table_data .= '
                        <tr>
                            <td>'.$row["id"].'</td>
                            <td>'.$row["title"].'</td>
                        </tr>
                    ';                  
                    $i++;
                }
    

    【讨论】:

    • 不过,他的查询会有问题!
    【解决方案5】:

    错误是您访问的是对象,而不是数组 因此它可以简单地访问它的密钥:$row-&gt;id$row-&gt;title 并且该对象是嵌套的(对象的对象) 因此双 foreach 循环 这是一个有效的code,用于没有数据库部分的显示 这是基于您的代码的工作代码,我只是更改了值表示:

     $data='{  
           "products":[  
              {  
                 "id":4790597958,
                 "title":"IRIS INVERSE (03-B)"
              },
              {  
                 "id":4790585606,
                 "title":"Mesmerised Ocean"
              },
              {  
                 "id":6517629254,
                 "title":"Mesmerising Bouquet"
              }
           ]
        }';
        echo "<pre>";
        $array = json_decode($data); //Convert JSON String into PHP Array
    
        foreach($array as $value) //Extract the Array Values by using Foreach Loop
        {
            foreach($value as $row){
            $query .= "INSERT INTO order_insert(id,title) VALUES ('".$row->id."', '".$row->title."'), ";      // Make Multiple Insert Query 
    
                    $table_data .= '
                        <tr>
                            <td>'.$row->id.'</td>
                            <td>'.$row->title.'</td>
                        </tr>
                    ';       
            }
        }
    

    祝你好运,

    【讨论】:

    • 谢谢,但我也想在数据库中存储数据
    • @TalalHaider,我知道,但是你有你的数组,剩下的很简单
    • 你能指导我吗?我被卡住了
    • @TalalHaider,给你
    • @TalalHaider,我想得到一些反馈,如果这对你有用
    猜你喜欢
    • 2013-10-15
    • 1970-01-01
    • 2021-02-07
    • 2012-06-20
    • 2018-05-12
    • 2021-07-16
    • 2020-01-22
    • 2018-03-18
    相关资源
    最近更新 更多