Lire dans une BDD distante depuis mon PI

Paramétrer le Raspberry Pi B/B+ pour se connecter via Ethernet ou une clé WiFi USB

Modérateurs : Francois, maxty01

estelle
Raspinaute
Messages : 154
Enregistré le : jeu. 24 déc. 2015 17:14

Re: Lire dans une BDD distante depuis mon PI

Message par estelle » dim. 31 déc. 2017 14:21

Tu m'as un peu piqué au vif et comme je n'aime pas rester sur un échec d'autant plus que l'on me le fait remarquer.....
message d'erreur qui m'a fait abondonner: :lol: :lol:
Fatal error: Call to undefined function json_encode()

1) JSON est pris en charge à partir de la version PHP 5.2
A savoir que chez Free, si on ne le spécifie pas, il ne charge pas la dernière version 5.6
Grand moment de solitude, d'autant plus que la plupart préconise de changer de fournisseurs..
2) une petite parade permet de forcer "la main" en installant un fichier .htaccess avec cette déclaration :

Code : Tout sélectionner

<IfDefine Free>
php56 1
</IfDefine>
Source: http://les.pages.perso.chez.free.fr/le- ... s-perso.io
En plus, j'ai corrigé quelques petites erreurs...
Tout est ok..
Moralité: il ne faut jamais mettre la charrue avant les boeufs

Bud Spencer
Raspinaute
Messages : 1089
Enregistré le : lun. 15 août 2016 21:38

Re: Lire dans une BDD distante depuis mon PI

Message par Bud Spencer » lun. 1 janv. 2018 13:32

estelle a écrit :Tu m'as un peu piqué au vif ...
C'est parfois la bonne solution pour forcer un peu de motivation ;)

Les soucis de version avec php c’est assez classique et d’un hébergeur à l’autre il y a souvent des surprises. Cela reste malgré tout très bien documenté et on finit toujours par trouver des solutions pour arriver à ses fins.

Pour ton code tel que tu nous l’avais donné, il y avait de grosses boulettes dedans. Déjà dans le code php, tu écrivais une requête sql ‘select * from table’ et juste après tu convertissais le résultat en json dans une eval ‘if (mysqli_num_rows($res) == 1) … Ce qui signifie que si il y avait eu plus d’un enregistrement dans ta table, cela ne pouvait pas fonctionner. Si tu veux utiliser ce genre d’évaluation tu dois t’assurer que ta requête sql ne puisse jamais retourner plus que le nombre d’enregistrement attendu (ici 1). C’est pour ça que dans le code d’exemple que je t’avais écrit, la requête sql contenait ‘LIMIT 0,1

Ensuite il y a le type attendu par ton code python. Lui ce qu’il attend, c’est une structure json. Cela fait partie de la gestion des erreurs que j’avais préconisée dans l’exemple. Imagine que ta requête sql ne retourne aucun enregistrement, dans ce cas, ton code php retournerait une page blanche (donc une string vide) qui génèrerait forcement une erreur lors du décodage ‘json.load’ du code python. Tu dois donc définir correctement le header de ta page php (Content-Type : application/json) et faire en sorte qu’il renvois toujours une structure json, même si celle-là peut être vide.

Ensuite pour traiter les erreurs coté python, ton block try est un peu simpliste. Si on regarde bien, fondamentalement il y a 2 cas d’erreurs possibles. Le premier c’est l’état de retour de la requête http. Il se peut que le site distant ne soit pas accessible (maintenance, problème réseaux …) ou qu’il retourne une erreur. Avant de traiter les données de retour, tu dois donc déjà t’assurer que le retour de la requête http est conforme. Pour ça il suffit de faire une eval sur le code d'état du header retourné. Pour ton code python un truc du genre ‘if r.status_code == 200 ….’ (Lire la doc de la lib request et se documenter sur les différents header statuts http). Si il ni a pas d’erreur et seulement dans ce cas, tu peux passer au traitement des données. On arrive là au second cas d’erreur à traiter : La page a retourné un header conforme, mais la structure json est vide (exemple, pas d’enregistrement correspondant à la demande dans la db). Tu dois donc prévoir ce cas en évaluant le contenu retourné pour orienter correctement le traitement.

Tout ça pour dire que le modèle que tu as choisi (pour ne pas dire celui vers lequel je t’ai orienté …) pour interfacer ta db distante est parfaitement adapté à ton besoin. Une api REST json n'est pas un bricolage de débutant mais bien une technique très utilisée et fiable si elle est bien codée. Si cela ne fonctionne pas, ce n'est surtout pas la méthode qu'il faut remettre en cause, mais ton code ;-)
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).

estelle
Raspinaute
Messages : 154
Enregistré le : jeu. 24 déc. 2015 17:14

Re: Lire dans une BDD distante depuis mon PI

Message par estelle » mer. 3 janv. 2018 17:46

Encore merci pour ton aide et tes bons conseils
A+

Répondre

Retourner vers « Le réseau sur le Raspberry Pï »