[RESOLU] lire json pour l'écrire dans base mysql

Eléphanteau du PHP | 11 Messages

01 juin 2016, 15:35

bonjour,

j'essai de lire un json et d'ecrire les donnees dans une base mysql.

avec le Json suivant:
$json_source='[{"ca_serv": 100,"ca_prod": 111},{"ca_serv": 200,"ca_prod": 222},{"ca_serv": 300,"ca_prod": 333}]';
ça marche en faisant:

Code : Tout sélectionner

<?php $json_source='[{"ca_serv": 100,"ca_prod": 111},{"ca_serv": 200,"ca_prod": 222},{"ca_serv": 300,"ca_prod": 333}]'; $sql = 'insert into ca_jour (code_client, ca_serv, ca_prod) values(?, ?, ?)'; $connexion = mysqli_connect('xxx.mysql.db', 'ma_base', 'mon_pass', 'mon_login') or die ('KO Echec de connexion'); // Création de l'objet commande $prepa = mysqli_stmt_init($connexion) or die ('KO Erreur SQL ( 2 )'); // Préparation de la requête : envoi à la base mysqli_stmt_prepare($prepa, $sql) or die ('KO Erreur SQL ( 3 )'); $json_data = json_decode($json_source, true); foreach($json_data as $histo){ $code_client = 'ccc'; $ca_serv =$histo['ca_serv']; $ca_prod = $histo['ca_prod']; mysqli_stmt_bind_param($prepa, 'sdd', $code_client, $ca_serv, $ca_prod) or die ('KO Erreur SQL ( 4 )'); mysqli_stmt_execute($prepa) or die('KO Erreur SQL ( 5 )'); } mysqli_stmt_close($prepa); echo 'OK'; ?>
mais je voudrais changer ma structure du Json comme suit:
$json_source='{"codeclient": "sc_greg1","histo":[{"ca_serv": 100,"ca_prod": 111},{"ca_serv": 200,"ca_prod": 222},{"ca_serv": 300,"ca_prod": 333}]}';
mais du coup je sais pas comment accéder à mes données
j'ai essayé de mettre

Code : Tout sélectionner

$ca_serv =$histo['histo']['ca_serv'];
mais ça marche pas, comme je peux accéder a code_client et aux divers ca_serv ?

merci

exyacc

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

01 juin 2016, 15:55

Bonjour,

fait un print_r ou un var_dump de ta variable $histo. Tu verras ainsi le tableau constitué par php et ça te permettra de voir quels indexes tu dois appeler pour accéder à tes valeurs :)

A vue de nez $histo['histo']['ca_serv'] devrait fonctionner, y a peut être une erreur ailleurs
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphanteau du PHP | 11 Messages

01 juin 2016, 16:17

j'ai le message d'erreur :
string(11) "json_source"
<br />
<b>Warning</b>: Illegal string offset 'histo' in <b>/home/exyacc/cloud/exyacc/insert_ca_json.php</b> on line <b>33</b><br />
<br />
<b>Warning</b>: Illegal string offset 'ca_serv' in <b>/home/exyacc/cloud/exyacc/insert_ca_json.php</b> on line <b>33</b><br />
KO Erreur SQL ( 5 )


la ligne 33 correspond à
$ca_serv =$histo['histo']['ca_serv'];

Eléphant du PHP | 176 Messages

02 juin 2016, 09:58

Bonjour exyacc,

Voici le code que j'ai utilisé pour debugger ton programme

Code : Tout sélectionner

<?php // $json_source='[{"ca_serv": 100,"ca_prod": 111},{"ca_serv": 200,"ca_prod": 222},{"ca_serv": 300,"ca_prod": 333}]'; $json_source='{"codeclient": "sc_greg1","histo":[{"ca_serv": 100,"ca_prod": 111},{"ca_serv": 200,"ca_prod": 222},{"ca_serv": 300,"ca_prod": 333}]}'; // $sql = 'insert into ca_jour (code_client, ca_serv, ca_prod) values(?, ?, ?)'; // $connexion = mysqli_connect('xxx.mysql.db', 'ma_base', 'mon_pass', 'mon_login') or die ('KO Echec de connexion'); // // Création de l'objet commande // $prepa = mysqli_stmt_init($connexion) or die ('KO Erreur SQL ( 2 )'); // // Préparation de la requête : envoi à la base // mysqli_stmt_prepare($prepa, $sql) or die ('KO Erreur SQL ( 3 )'); $json_data = json_decode($json_source, true); var_dump($json_data); foreach($json_data['histo'] as $histo){ // $code_client = 'ccc'; $ca_serv =$histo['ca_serv']; $ca_prod = $histo['ca_prod']; echo "$ca_serv $ca_prod"; // mysqli_stmt_bind_param($prepa, 'sdd', $code_client, $ca_serv, $ca_prod) or die ('KO Erreur SQL ( 4 )'); // mysqli_stmt_execute($prepa) or die('KO Erreur SQL ( 5 )'); } // mysqli_stmt_close($prepa); echo 'OK'; ?>
Dans la pratique j'ai juste enlevé tout ce qui fait intervenir la base de données.

Si tu exécute ce code tu verras que $json_data est de la forme suivante

Code : Tout sélectionner

array (size=2) 'codeclient' => string 'sc_greg1' (length=8) 'histo' => array (size=3) 0 => array (size=2) 'ca_serv' => int 100 'ca_prod' => int 111 1 => array (size=2) 'ca_serv' => int 200 'ca_prod' => int 222 2 => array (size=2) 'ca_serv' => int 300 'ca_prod' => int 333
A l'heure actuelle ton foreach ne parcours que "le niveau 1" de ton array
Cordialement
Naroth

Eléphanteau du PHP | 11 Messages

02 juin 2016, 11:52

merci beaucoup Naroth

ca marche tres bien

Code : Tout sélectionner

foreach($json_data['histo'] as $histo){ $ca_serv =$histo['ca_serv']; $ca_prod = $histo['ca_prod']; }
je m'acharnais a vouloir faire

Code : Tout sélectionner

foreach($json_data as $histo){ $ca_serv =$histo['histo'] ['ca_serv']; $ca_prod = $histo['histo'] ['ca_prod']; }