- Không chuyển đổi json sang mảng kết hợp một cách mù quáng. Nó tạo ra nhiều vấn đề hơn.
- Để truy cập các thuộc tính có chứa các ký tự đặc biệt hoặc từ dành riêng, hãy sử dụng các trình giữ chỗ như
$data->{'$ts'}
- Lặp qua các mảng và đối tượng nếu cần.
- Thêm
id
tăng tự động cột thành bảng giúp lưu trữ dữ liệu cho một thiết bị. - Bạn nên thêm
time
tớierror_log
bảng cũng vậy
Đã kiểm tra phiên bản ngắn dưới đây của câu hỏi ban đầu của bạn và nó hoạt động.
<?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);
?>