Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Analysieren von JSON-Daten und Einfügen in MySQL

  1. Konvertieren Sie json nicht blind in ein assoziatives Array. Es schafft mehr Probleme.
  2. Für den Zugriff auf Eigenschaften, die Sonderzeichen oder reservierte Wörter enthalten, verwenden Sie Platzhalter wie $data->{'$ts'}
  3. Gehen Sie bei Bedarf durch Arrays und Objekte.
  4. Hinzufügen einer automatisch inkrementierten id Spalte zu Tabellen hilft, Daten für ein Gerät zu speichern.
  5. Es ist eine gute Idee, time hinzuzufügen zu error_log auch Tabelle

Getestet unten kurze Version Ihrer ursprünglichen Frage und es funktioniert.

<?php
        $_user = 'root';
        $_password= 'root';
        $_db = 'localtest';
        $_host = 'localhost';
        $_port = 3306;
    $con = new mysqli($_host, $_user, $_password, $_db) or die(mysql_error);

    //read the json file contents
    $jsondata = file_get_contents('test.json');

    //do not convert to array
    $json = json_decode($jsondata);

    $id = $json->device->sn;
    foreach($json->data as $key => $data){
        if(empty($data) || !isset($data->{'$ts'})){
            continue;
        }
        if (isset($data->{'$msg'})){
            $msg = $data->{'$msg'};
            $time = $data->{'$ts'};

            $sql="INSERT into error_log (sn, time, MSG) VALUES (?,?,?); ";
            $stmt = $con-> prepare($sql);
            $stmt -> bind_param("iss", $id,$time, $msg);
            $stmt -> execute();
        }else{
            $time = (isset($data->{'$ts'}))? $data->{'$ts'}:'';
            $RH = (isset($data->RH))? $data->RH:'';
            $AT = (isset($data->AT))? $data->AT:'';
            $MINVi = (isset($data->MINVi))? $data->MINVi:'';

            //insert into mysql table
            $sql="INSERT into test (sn, date, RH, AT, MINVi) VALUES (?,?,?,?,?); ";
            $stmt = $con-> prepare($sql);
            $stmt -> bind_param("issss", $id,$time,$RH,$AT,$MINVi);
            $stmt -> execute();
        }


    }
    mysqli_close($con);

?>