Php 如何将多维数组的嵌套数组插入mysql

Php 如何将多维数组的嵌套数组插入mysql,php,mysql,arrays,json,multidimensional-array,Php,Mysql,Arrays,Json,Multidimensional Array,我有一个多维数组,我想插入到mysql数据库中。一切都很好,但我想要一个更好的解决方案,因为行会在嵌套数组之后重复 这是我的json { "results": [ { "id": 48728, "name": "MOVIES AT THE PARK @ GIBA GORGE", "url": "Some URL", "imageUrl": "Some Path",

我有一个多维数组,我想插入到mysql数据库中。一切都很好,但我想要一个更好的解决方案,因为行会在嵌套数组之后重复

这是我的json

{
    "results": [
        {
            "id": 48728,
            "name": "MOVIES AT THE PARK @ GIBA GORGE",
            "url": "Some URL",
            "imageUrl": "Some Path",
            "dateCreated": "2018-06-08T09:18:59.717",
            "lastModified": "2018-06-26T14:20:45.0214921",
            "startDate": "2018-07-28T17:00:00",
            "endDate": "2018-07-28T22:00:00",
            "venue": {
                "id": 0,
                "name": "Giba Gorge Mountain Bike Park",
                "addressLine1": "110 Stockville Road",
                "addressLine2": "",
                "latitude": -29.8276051,
                "longitude": 30.781735700000013
            },
            "locality": {
                "levelOne": "South Africa",
                "levelTwo": "KwaZulu-Natal",
                "levelThree": "Clifton Canyon"
            },
            "organiser": {
                "id": 0,
                "name": "Ultra Glow SA ",
                "phone": "0822603351",
                "mobile": "0828927837",
                "facebookUrl": "",
                "twitterHandle": "",
                "hashTag": "UGMOVIES",
                "organiserPageUrl": "some url"
            },
            "categories": [
                {
                    "id": 3,
                    "name": "Film & Media"
                },
                {
                    "id": 12,
                    "name": "Food & Drink"
                }
            ],
            "tickets": [
                {
                    "id": 98655,
                    "name": "ADULT TICKET",
                    "soldOut": false,
                    "provisionallySoldOut": false,
                    "price": 100,
                    "salesStart": "2018-06-26T11:52:00",
                    "salesEnd": "2018-07-28T17:00:00",
                    "description": "",
                    "donation": false,
                    "vendorTicket": false
                },
                {
                    "id": 98656,
                    "name": "UNDER 12",
                    "soldOut": false,
                    "provisionallySoldOut": false,
                    "price": 80,
                    "salesStart": "2018-06-26T11:53:00",
                    "salesEnd": "2018-07-28T17:00:00",
                    "description": "",
                    "donation": false,
                    "vendorTicket": false
                }
            ],
            "schedules": [
            ],
            "refundFeePayableBy": 0
        },
        {
            "id": 51681,
            "name": "ULTRA GLOW COLOUR CRUZ @ RIETVLEI ZOO FARM",
            "url": "some url",
            "imageUrl": "some path",
            "dateCreated": "2018-06-26T12:12:07.3",
            "lastModified": "2018-06-28T15:22:24.1579751",
            "startDate": "2018-08-12T10:00:00",
            "endDate": "2018-08-12T14:00:00",
            "venue": {
                "id": 0,
                "name": "Rietvlei Zoo Farm",
                "addressLine1": "101 Swartkoppies Road",
                "addressLine2": "",
                "latitude": -26.3117147,
                "longitude": 28.07989120000002
            },
            "locality": {
                "levelOne": "South Africa",
                "levelTwo": "Gauteng",
                "levelThree": "Johannesburg South"
            },
            "organiser": {
                "id": 0,
                "name": " Ultra Glow South Africa",
                "phone": "0822603351",
                "mobile": "0828927837",
                "facebookUrl": "",
                "twitterHandle": "",
                "hashTag": "",
                "organiserPageUrl": "some url"
            },
            "categories": [
                {
                    "id": 60,
                    "name": "Trail Running"
                },
                {
                    "id": 5,
                    "name": "Sports & Fitness"
                }
            ],
            "tickets": [
                {
                    "id": 98735,
                    "name": "ADULT EARLY BIRD",
                    "soldOut": false,
                    "provisionallySoldOut": false,
                    "price": 150,
                    "salesStart": "2018-06-26T12:47:00",
                    "salesEnd": "2018-08-12T10:00:00",
                    "description": "",
                    "donation": false,
                    "vendorTicket": false
                },
                {
                    "id": 98736,
                    "name": "UNDER 12 - EARLY BIRD",
                    "soldOut": false,
                    "provisionallySoldOut": false,
                    "price": 120,
                    "salesStart": "2018-06-26T12:47:00",
                    "salesEnd": "2018-08-12T10:00:00",
                    "description": "",
                    "donation": false,
                    "vendorTicket": false
                }
            ],
            "schedules": [
            ],
            "refundFeePayableBy": 0
        }
    ],
    "pageSize": 10,
    "pages": 1,
    "records": 2,
    "extras": null,
    "message": null,
    "statusCode": 0
}
我已尝试使用以下代码将相关数据插入数据库

<?php
$connect= mysqli_connect("localhost","root","","result");
$jsondata=file_get_contents("result.json");
$json= json_decode($jsondata,true);
$results=$json['results'];
$n= sizeof($results);
for($i=0;$i<$n;$i++){

$row=$results[$i];
foreach($row['tickets'] as $key => $value){


 $sql="INSERT into 
 event(name,url,imageUrl,dateCreated,eventName,addressLine1,addressLine2,ticketNa me,price) 
 VALUES('".$row["name"]."','".$row["url"]."','".$row["imageUrl"]."','".$row["dateCreated"]."','".$row["venue"]["name"]."','".$row["venue"]["addressLine1"]."','".$row["venue"]["addressLine2"]."','".$value["name"]."','".$value["price"]."')";

    mysqli_query($connect,$sql);
    }
}

echo "events data inserted";
?>
因此,我进一步更新了代码,使用了两个foreach循环,一个用于遍历顶级数组“results”,另一个用于遍历嵌套数组“tickets”


这是因为您在for中使用foreach。您只需要一个foreach:

foreach ($multiArray as $key => $singleArray) {
    //rest of code, replacing $row with $singleArray['key']. E.g. $singleArray['id']
}
查看OP更新后更新:

所以你会这样做:

foreach ($results as $row) {
  foreach ($row['tickets'] as $ticket) {
    //sql
  }
}
这应该允许您在SQL中使用
$ticket['key']
——尽管我建议您切换到PDO准备的语句,以保护自己不受SQL注入的影响


另外,正如其他人所建议的,将票据分离到自己的表中对您非常有利。

发生这种情况的主要原因是查看以下代码:

$row=$results[$i];
foreach($row['tickets'] as $key => $value){

    $sql="INSERT into event(name,url,imageUrl,dateCreated,eventName,addressLine1,addressLine2,ticketNa me,price) VALUES('".$row["name"]."','".$row["url"]."','".$row["imageUrl"]."','".$row["dateCreated]."','".$row["venue"]["name"]."','".$row["venue"]["addressLine1"]."','".$row["venue"]["addressLine2"]."','".$value["name"]."','".$value["price"]."')";

    mysqli_query($connect,$sql);
}
$row
包含一个主条目,
$row['tickets']
包含两个条目,并且您正在循环中使用$row主内容获取票据。这就是为什么你会得到2个条目。解决这个问题的最佳方法是使用单个foreach循环,而不是使用for和foreach

编辑:

实际上,我建议您将表规范化,将其分为两个表,一个用于存储事件信息,另一个用于使用票证信息。见以下结构:

event(id,name,url,imageUrl,addressLine1,addressLine2,dateCreated);
event_tickets(id,event_id,ticketName,price,dateCreated);
这将帮助您轻松地维护信息。您还可以将代码修改为以下内容:

$sql="INSERT into event(name,url,imageUrl,addressLine1,addressLine,2dateCreated) VALUES ('".$row['name']."','".$row['url']."','".$row['imageUrl']."','".$row['venue']['addressLine1']."','".$row['venue']['addressLine2']."','".date('Y-m-d h:i:s')."');"
mysqli_query($connect, $sql);
$event_id = mysqli_insert_id($connect);
然后可以使用foreach在event_tickets表中插入票证信息


希望这对您有所帮助

您对SQL注入持开放态度,并应尽快解决此问题。我知道我只是在本地主机上测试此问题。。以后我会做所有这些的。有一个单独的票证表。好的,那个么我如何将它们和事件表上的数据连接起来?我想要每个事件的票证名称和价格,并将其显示在htmlno中的表标记中。我需要它来循环遍历结果数组的每个值。。我之所以得到两个同名事件,是因为json中嵌套了数组“tickets”,因为我在“tickets”数组下使用了键“name”和“price”。。我只是想要一个更好的解决方案that@PraneetSinghRoopra是 啊这就是为什么你只需要使用
$singleArray['tickets']
并循环它-你要两次循环它,因为你在for中嵌套了foreach,所以它通过它
2xcount(tickets)
没有兄弟,我敦促你检查我的json格式,因为嵌套的数组“tickets”,我需要for循环和foreach循环仔细看,tickets本身就是一个数组,它有两个索引,也就是说它有两个数组。因此,我需要每个循环遍历它,循环的顶层是遍历顶层arrays@PraneetSinghRoopra我敦促你们理解我的答案,你们有一个数组:我们称之为结果。您可以循环查看
结果
。这意味着在每次迭代中,您都有一个与该索引关联的
tickets
数组。这意味着在foreach中以$key=>$result
的形式执行
$results,允许您循环执行
$result['tickets']
并操纵您认为合适的方式。如果我这样做,我会得到错误未定义索引:name和未定义索引:price和no value位于mysqls下。请建议如何使用上述给定json格式的单个foreach循环?编辑答案。
event(id,name,url,imageUrl,addressLine1,addressLine2,dateCreated);
event_tickets(id,event_id,ticketName,price,dateCreated);
$sql="INSERT into event(name,url,imageUrl,addressLine1,addressLine,2dateCreated) VALUES ('".$row['name']."','".$row['url']."','".$row['imageUrl']."','".$row['venue']['addressLine1']."','".$row['venue']['addressLine2']."','".date('Y-m-d h:i:s')."');"
mysqli_query($connect, $sql);
$event_id = mysqli_insert_id($connect);