- जॉन को साहचर्य सरणी में आँख बंद करके परिवर्तित न करें। यह और भी समस्याएं पैदा करता है।
- विशेष वर्णों या आरक्षित शब्दों वाली संपत्तियों तक पहुँचने के लिए
$data->{'$ts'}
जैसे प्लेसहोल्डर का उपयोग करें - यदि आवश्यक हो तो सरणियों और वस्तुओं के माध्यम से लूप करें।
- एक ऑटो इंक्रीमेंट जोड़ना
id
कॉलम टू टेबल एक डिवाइस के लिए डेटा स्टोर करने में मदद करता है। time
जोड़ना एक अच्छा विचार है करने के लिएerror_log
टेबल भी
आपके मूल प्रश्न के संक्षिप्त संस्करण का परीक्षण किया गया और यह काम करता है।
<?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);
?>