Page 1 sur 1

Arrays et sous Array vers MySQL

Posté : 30 avr. 2017, 15:09
par McDeffice
Bonjour tout le monde,

J'ai des arrays dynamique, avec des sous arrays qui ce présente un peu comme cela :
https://pastebin.com/Un3R0HFm

J'essaye de faire une fonction pour l'importer toutes mes requêtes en SQL de maniérè dynamique. J'ai du mal avec les array, dans les array dans des array... par exemple :

Code : Tout sélectionner

[n] => Array ( [2] => Array ( [el] => Array ( [0] => Array ( [t] => 13 [o] => 99 [d] => 1493568787000 [v] => 50 )
pour avoir en retour
db : n
table : el-t
valeur: 13

Voici mon morceau de code

Code : Tout sélectionner

function JsonToSQL ($json) { .... $array = json_decode(ltrim($json, ''), true); foreach( array_keys_recursive($array,1) as $tbl => $none ) { $SQL_BEGIN = 'REPLACE INTO `'.$tbl.'` ('; $max = count($array[$tbl]); for( $n = 0; $n<$max; $n++ ) { $SQL_COL = ''; $SQL_VAL = ' VALUES ('; foreach( $array[$tbl][$n] as $key => $value ) { if (is_array($value)) { foreach( $array[$tbl][$n][$key] as $k => $value ) { if (is_array($value)) { foreach( $array[$tbl][$n][$key][$k] as $k2 => $value ) { $key = $key.'-'.$k.'-'.$k2; echo '2---key '.$key.' val '.$value.'----------<br><br>'; } } else { $key = $key.'-'.$k; echo '1---key '.$key.' val '.$value.'----------<br><br>'; } } } $SQL_COL .= "`".$key."`, "; $SQL_VAL .= "'".mysqli_real_escape_string ($conn,$value)."', "; } $REQ = $SQL_BEGIN.rtrim($SQL_COL, ', ').") ".rtrim($SQL_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++; }
Quelqu'un aurais l amabilité de m'aider ? J'avoue que je suis pas assez logique; j'ai chercher sur le net, essayer pleins de chose et je coince

Merci d'avance,
McDeffice

Re: Arrays et sous Array vers MySQL

Posté : 01 mai 2017, 22:43
par Aureusms
Salut,

Tu affectes mal tes variables en écrasant systématiquement $value.
Si on part du principe qu'un tableau est fait de clés, qu'on appellera $cle et de valeur, qu'on appellera $valeur alors pour aller en profondeur dans un tableau multidimensionnel :
$sql = "db: ";
foreach ($tableau as $cle0 => $valeur0) :
	$sql .= $cle0;
	foreach ($valeurO as $cle1 => $valeur1) :
		foreach ($valeur1 as $cle2 => $valeur2 ):
			$sql .= " ,table : ".$cle2;
			foreach ($valeur2 as $cle3 => $valeur3 ):			
				$sql .= ".".$cle3." ,valeur :".$valeur3;
			endforeach;
		endforeach;
	endforeach;
endforeach;

Normalement avec ton tableau que tu as donné, tu auras :
db: n, table : el.t, valeur : 13
db: n, table : el.o, valeur : 99
...

A toi ensuite de créer le texte sql que tu veux par le même principe.
A noter que je n'ai pas fais les vérifications d'usage (empty et is_array) pour éviter les erreurs.

Re: Arrays et sous Array vers MySQL

Posté : 04 mai 2017, 15:15
par McDeffice
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.