Mysql
 sql >> Base de données >  >> RDS >> Mysql

Analyse des données JSON et insertion dans MySQL

  1. Ne convertissez pas json en tableau associatif à l'aveuglette. Cela crée plus de problèmes.
  2. Pour accéder aux propriétés contenant des caractères spéciaux ou des mots réservés, utilisez des espaces réservés comme $data->{'$ts'}
  3. Parcourir les tableaux et les objets si nécessaire.
  4. Ajout d'un id d'incrémentation automatique la colonne aux tables permet de stocker des données pour un appareil.
  5. C'est une bonne idée d'ajouter time à error_log table aussi

Testé ci-dessous version courte de votre question d'origine et cela fonctionne.

<?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);

?>