par
McDeffice » 04 mai 2017, 15:15
Merci pour ton aide, tu ma donné un début de pistes; avec tes indications et ton code.
Par contre, du a des multi sous arrays cela ne fonctionnais pas, j'ai re edité ma fonction
Code : Tout sélectionner
function JsonToSQL ($json) {
if ($json == NULL) { return ''; }
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "tmp";
// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$json = Encoding::toUTF8($json);
$array = json_decode(ltrim($json, ''), true);
switch (json_last_error()) {
case JSON_ERROR_NONE:
echo ' - No errors';
break;
case JSON_ERROR_DEPTH:
echo ' - Maximum stack depth exceeded';
break;
case JSON_ERROR_STATE_MISMATCH:
echo ' - Underflow or the modes mismatch';
break;
case JSON_ERROR_CTRL_CHAR:
echo ' - Unexpected control character found';
break;
case JSON_ERROR_SYNTAX:
echo ' - Syntax error, malformed JSON';
break;
case JSON_ERROR_UTF8:
echo ' - Malformed UTF-8 characters, possibly incorrectly encoded';
break;
default:
echo ' - Unknown error';
break;
}
$a=0;
foreach( array_keys_recursive($array,1) as $tbl => $none ) {
$SQL_BEGIN = 'INSERT IGNORE INTO `'.$tbl.'` (';
$max = count($array[$tbl]);
for( $n = 0; $n<$max; $n++ ) {
$COL = '`datecreate`, ';
$VAL = ' VALUES ( CURDATE(), ';
foreach( $array[$tbl][$n] as $key => $value ) {
if (is_array($value)) {
foreach( $array[$tbl][$n][$key] as $k => $value1 ) {
if (is_array($value1)) {
foreach( $array[$tbl][$n][$key][$k] as $k2 => $value2 ) {
$COL .= "`".$key.'-'.$k.'-'.$k2."`, ";
$VAL .= "'".mysqli_real_escape_string ($conn,$value2)."', ";
}
} else {
$COL .= "`".$key.'-'.$k."`, ";
$VAL .= "'".mysqli_real_escape_string ($conn,$value1)."', ";
}
}
} else {
$COL .= "`".$key."`, ";
$VAL .= "'".mysqli_real_escape_string ($conn,$value)."', ";
}
}
$REQ = $SQL_BEGIN.rtrim($COL, ', ').") ".rtrim($VAL, ', ').");";
if ($conn->query($REQ) === TRUE) {
//echo "New record created successfully";
$a++;
} else {
echo "Error: " . $REQ . "<br>" . $conn->error;
var_dump($array[$tbl][$n]);
}
}
}
$conn->close();
echo "<br>New record created successfully ".$a++;
}
Cela me semble aller mieux, sa prend les sous arrays apparemment correctement. Mais j'ai l’impression que je perd toujours des données.
Merci pour ton aide, tu ma donné un début de pistes; avec tes indications et ton code.
Par contre, du a des multi sous arrays cela ne fonctionnais pas, j'ai re edité ma fonction
[code]function JsonToSQL ($json) {
if ($json == NULL) { return ''; }
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "tmp";
// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$json = Encoding::toUTF8($json);
$array = json_decode(ltrim($json, ''), true);
switch (json_last_error()) {
case JSON_ERROR_NONE:
echo ' - No errors';
break;
case JSON_ERROR_DEPTH:
echo ' - Maximum stack depth exceeded';
break;
case JSON_ERROR_STATE_MISMATCH:
echo ' - Underflow or the modes mismatch';
break;
case JSON_ERROR_CTRL_CHAR:
echo ' - Unexpected control character found';
break;
case JSON_ERROR_SYNTAX:
echo ' - Syntax error, malformed JSON';
break;
case JSON_ERROR_UTF8:
echo ' - Malformed UTF-8 characters, possibly incorrectly encoded';
break;
default:
echo ' - Unknown error';
break;
}
$a=0;
foreach( array_keys_recursive($array,1) as $tbl => $none ) {
$SQL_BEGIN = 'INSERT IGNORE INTO `'.$tbl.'` (';
$max = count($array[$tbl]);
for( $n = 0; $n<$max; $n++ ) {
$COL = '`datecreate`, ';
$VAL = ' VALUES ( CURDATE(), ';
foreach( $array[$tbl][$n] as $key => $value ) {
if (is_array($value)) {
foreach( $array[$tbl][$n][$key] as $k => $value1 ) {
if (is_array($value1)) {
foreach( $array[$tbl][$n][$key][$k] as $k2 => $value2 ) {
$COL .= "`".$key.'-'.$k.'-'.$k2."`, ";
$VAL .= "'".mysqli_real_escape_string ($conn,$value2)."', ";
}
} else {
$COL .= "`".$key.'-'.$k."`, ";
$VAL .= "'".mysqli_real_escape_string ($conn,$value1)."', ";
}
}
} else {
$COL .= "`".$key."`, ";
$VAL .= "'".mysqli_real_escape_string ($conn,$value)."', ";
}
}
$REQ = $SQL_BEGIN.rtrim($COL, ', ').") ".rtrim($VAL, ', ').");";
if ($conn->query($REQ) === TRUE) {
//echo "New record created successfully";
$a++;
} else {
echo "Error: " . $REQ . "<br>" . $conn->error;
var_dump($array[$tbl][$n]);
}
}
}
$conn->close();
echo "<br>New record created successfully ".$a++;
}[/code]
Cela me semble aller mieux, sa prend les sous arrays apparemment correctement. Mais j'ai l’impression que je perd toujours des données.