Как вставить вложенный массив многомерного массива в MySQL

0

У меня есть многомерный арай, который я хочу вставить в базу данных 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";
?>

Это вводит соответствующие данные в мою базу данных, но из-за вложенных tickets массива с соответствующим name и price те же самые события публикуются дважды в моей базе данных, например, MOVIES AT THE PARK @GIBA GORGE по цене 100 - это одна строка и MOVIES AT THE PARK @GIBA GORGE по цене 80 в другой строке... Я должен отображать эти данные в будущем как часть одного имени события с их типом и ценой в виде таблицы... у вас есть какие-либо идеи по другому пути я может сделать это лучше, вместо двух строк для одних и тех же событий?

заранее спасибо

для тех, кто предлагал мне не использовать цикл foreach, это мой код обновления после удаления для цикла и одного цикла foreach, и это дает мне ошибку неопределенного индекса имени и цены по билетам

<?php
$connect= mysqli_connect("localhost","root","","result");
$jsondata=file_get_contents("result.json");
$json= json_decode($jsondata,true);
$results=$json['results'];

foreach($results as $key => $result){

    $sql="INSERT into 'event(name,url,imageUrl,dateCreated,eventName,addressLine1,addressLine2,ticketName,price) VALUES('".$result["name"]."','".$result["url"]."','".$result["imageUrl"]."','".$result["dateCreated"]."','".$result["venue"]["name"]."','".$result["venue"]["addressLine1"]."','".$result["venue"]["addressLine2"]."','".$result["tickets"]["name"]."','".$result["tickets"]["price"]."')";'
    mysqli_query($connect,$sql);
}

echo "events data inserted";
?>

поэтому я дополнительно обновил свой код с помощью двух циклов foreach, один из которых может пройти через массив "результаты" верхнего уровня, а другой - итерации через "билеты" вложенных массивов,

<?php
$connect= mysqli_connect("localhost","root","","result");
$jsondata=file_get_contents("result.json");
$json= json_decode($jsondata,true);
$results=$json['results'];

foreach($results as $key => $result){
    foreach($result["tickets"] as $k => $v){
    $sql="INSERT into event(name,url,imageUrl,dateCreated,eventName,addressLine1,addressLine2,ticketName,price) VALUES('".$result["name"]."','".$result["url"]."','".$result["imageUrl"]."','".$result["dateCreated"]."','".$result["venue"]["name"]."','".$result["venue"]["addressLine1"]."','".$result["venue"]["addressLine2"]."','".$v["name"]."','".$v["price"]."')";'
    mysqli_query($connect,$sql);
    }
}

echo "events data inserted";
?>

что итерации через вложенный массив, поэтому в моем коде нет ничего плохого. Единственная проблема: я получаю 2 события на моем столе из-за двух типов билетов для взрослых и детей в массиве "билеты"

так как для многих предложений здесь мне нужно создать две отдельные таблицы для событий и билетов, я был бы признателен, если кто-нибудь скажет мне, что как значить эти две таблицы, чтобы иметь возможность показывать информацию о моих событиях в html с типом и ценой, указанными в таблице в теге html table спасибо заранее

  • 1
    вы открыты для внедрения SQL и должны стремиться исправить это как можно скорее
  • 0
    Я знаю, что я только проверяю это на mylocal host .. сделаю все это позже
Показать ещё 2 комментария
Теги:
arrays
multidimensional-array

2 ответа

0

Основная причина, по которой это происходит, - посмотреть нижеприведенный код:

$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'] содержит 2 записи, и вы используете основное содержимое $ 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.

Надеюсь это поможет

  • 0
    Подскажите, пожалуйста, как мне использовать один цикл foreach в указанном выше формате json?
  • 0
    Отредактировал ответ.
0

потому что вы используете foreach внутри for. Вам просто нужен 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
  }
}

это должно позволить вам использовать $ticket['key'] в вашем SQL - хотя я предлагаю переключиться на подготовленные инструкции PDO, чтобы защитить себя от SQL-инъекции.

Также, как и другие предлагаемые, разделение билетов на собственный стол было бы очень выгодным для вас.

  • 0
    нет, мне нужно, чтобы цикл for повторял каждое значение массива результатов ... причина, по которой я получаю два события с одним и тем же именем, заключается в том, что во вложенном массиве "tickets" в json используются ключи "name" и " цена "под массивом" билетов ".. я просто хочу лучшее решение для этого
  • 0
    @PraneetSinghRoopra да ... именно поэтому вы просто используете $singleArray['tickets'] и проходите через него - вы дважды зацикливаете его, потому что вложили foreach в for, поэтому он проходит через него 2 x count(tickets)
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню