Page 2 sur 3

Re: Lire dans une BDD distante depuis mon PI

Posté : ven. 15 sept. 2017 17:36
par Bud Spencer
Bingo ! t’as tout juste

Suffit ensuite de parser ce que tu reçois pour y placer dans les différentes var de ton programme. C’est en général à ce moment-là que tu commences à comprendre l’intérêt d’utiliser un format comme JSON ou XML :lol:

Re: Lire dans une BDD distante depuis mon PI

Posté : ven. 15 sept. 2017 18:19
par estelle
Que veux tu dire par "parser" ?
Comment fait on pour passer plusieurs variables ?
A+

Re: Lire dans une BDD distante depuis mon PI

Posté : sam. 16 sept. 2017 13:37
par Bud Spencer
parser : expression utilisée par les développeurs et que l’on peut traduire par :
analyser/traiter un type (ici une chaine de caractères) pour en extraire des valeurs (et accessoirement les convertir).


Vite fait, un petit exemple complet (moins long a écrire que de tout t'expliquer :lol: ). J’ai créé une table mysql qui contient 3 champs (id (int), camera (varchar) et eclairage (int)) et j’y ai inscrit quelques enregistrements.

Le code php extrait un enregistrement suivant l’ordre définit par le ORDER de la requête sql et retourne le résultat au format JSON (sérialisation).
Code php:
code_php.png
code_php.png (36.55 Kio) Vu 6398 fois
Résultat dans le navigateur
res_html.png
res_html.png (9.36 Kio) Vu 6398 fois
Le code python utilise la lib requests pour récupérer ce résultat via une requete http et en extrait les valeurs en utilisant la lib json (desérialisation) puis les affiche dans la console.
Code et résultat python
code_res_python.png
code_res_python.png (31.69 Kio) Vu 6398 fois

Il faut bien sur ajouter du code pour gérer les éventuelles erreurs (par exemple, la ressource web n’est pas accessible faute de réseau ou si la requête ne retourne aucun enregistrement …).

Re: Lire dans une BDD distante depuis mon PI

Posté : sam. 16 sept. 2017 14:19
par estelle
Oui c'est pas mal
Je dirais même plus c'est très bien

Je vais tester cela car c'est vraiment ce que je veux faire
Encore Merci
T'est un chef :)

Re: Lire dans une BDD distante depuis mon PI

Posté : lun. 18 déc. 2017 12:12
par estelle
Bonjour Bud Spencer,

J'ai testé ta solution mais j'ai une erreur
Une question: "jsn" est une variable ?
Tu dois avoir une erreur lorsque tu lances ton Prg

Image

print ("camera" + str(Commande_IO['Camera']))

Dans le PI:

Code : Tout sélectionner

try:
        r = requests.get("http://ruches.montminoises.free.fr/Echange.php")
        Commande_IO = json.loads(r.text) 
    except:
        print("Requests: probleme de lecture BDD vers serveur")
    
    print ("camera" + str(Commande_IO['Camera']))  
Dans Echange.php:

Code : Tout sélectionner

<?php
include("xxxxxxxxx.php"); 
$link=Connect();
// on sélectionne la base 
mysql_select_db('ruches_montminoises',$link);
// on crée la requête SQL
$sql = "SELECT * FROM Echange";
// on envoie la requête 
$res = mysqli_query($link,$sql) or die (msqli_error($link));
if (mysqli_num_rows($res) == 1)
{
  print json_encode(mysqli_fetch_array($res, MYSQLI_ASSOC),JSON_NUMERIC_CHECK);
}  
// on ferme la connexion 
mysql_close($link);         
?>
Qu'en penses tu ?

Re: Lire dans une BDD distante depuis mon PI

Posté : lun. 18 déc. 2017 13:43
par Barbedouce
Il y a plusieurs manières...
Tu aurai pu ne pas utiliser MySQL et faire une BDD en .txt, ça aurait été plus simple coté Pi...

Maintenant que tu as affaire a MySQL, tu peux toujours exécuter du PHP par Python, c'est une solution.

Mais puisque vous utilisez Python pour accéder directement a MySQL sur le serveur Frit, il faut te connecter a la BDD, avec tes identifiants, etc ( les mêmes qu'en PHP...
http://apprendre-python.com/page-databa ... gre-sqlite


Bonne chance ! :)

Re: Lire dans une BDD distante depuis mon PI

Posté : lun. 18 déc. 2017 15:01
par estelle
Barbedouce a écrit :
Mais puisque vous utilisez Python pour accéder directement a MySQL sur le serveur Frit, il faut te connecter a la BDD, avec tes identifiants, etc ( les mêmes qu'en PHP...
C'est ce que je fais dans "Echange.php"

Jusqu'à maintenant j'ai toujours utiliser la méthode POST pour écrire dans les BDD avec succès

Je pense que cela vient de la partie PHP et que "Commande_IO" est vide
Car si je n'initialise pas cette variable j'ai une erreur sur la ligne "Commande_IO = json.loads(r.text)" : "Commande_IO" is not defined

Re: Lire dans une BDD distante depuis mon PI

Posté : lun. 18 déc. 2017 18:18
par Barbedouce
Si tu le fais dans Echange.php, je ne vois ni host, ni login, ni password pour la BDD.

Re: Lire dans une BDD distante depuis mon PI

Posté : lun. 18 déc. 2017 19:32
par estelle
Barbedouce a écrit :Si tu le fais dans Echange.php, je ne vois ni host, ni login, ni password pour la BDD.
Je fais appel à Connect qui comprend l'acces ....

J'ai évolué dans le projet
1) un pb acces à la BDD j'ai remplacer les " par des ' dans SQL => plus de pb de BDD
2) erreur sur json.decode()

J' ai abondonné avec json et suis partie sur des "echo" des variables qui me crée une chaîne de 3 caractères au niveau du PI

Au niveau du PI, je fais une extraction de caractère => conversion en int et tout est OK

C'est moins élégant mais cela fonctionne

Re: Lire dans une BDD distante depuis mon PI

Posté : sam. 23 déc. 2017 11:23
par Bud Spencer
Non Estelle, il n’y a pas d'erreur dans mon code et il est parfaitement fonctionnel (les sceenshoot en attestent). Par contre, il est évident que le tiens ne peut pas fonctionner. Le plus drôle, c’est qu’avec tous les ‘experts’ en ‘python-php-mysql ’ qu’il y a ici, aucun ne t’a notifié tes erreurs de code alors qu’elles se voient comme un nez de clown lumineux au milieu de la figure … Relis ton code et réfléchis 5 minutes, tu vas forcement comprendre pourquoi cela ne marche pas.

C’est un peu décourageant de voir que tu fais marche arrière en te rabattant sur des solutions aussi nulle alors que depuis pas mal de temps je t’ai toujours donné toutes les infos (code a l’appuis) pour que tu puisse développer un vrai web-services en utilisant les langages que tu as choisi.
Il faut bien comprendre que les exemples de code que je donne ne sont pas des solutions qu’il suffit de recopier. Ils sont faits pour démontrer des méthodes le plus simplement possible et pour pouvoir être compris. Décortiques chaque instruction du code que j’ai mis et s’il y en a une que tu ne comprends pas, documente toi dessus ou demande avant de dire que cela ne marche pas.

Pour répondre à ta question, non, 'jsn' n’est pas à proprement parler une variable. C’est une structure (un ensemble de variable). Ici il représente l’enregistrement extrait de la db converti en objet JSON. Si tu avais cherché à comprendre le code d’exemple avant de vouloir l’utiliser, tu le saurais ;)

Barbedouce a écrit :Il y a plusieurs manières...
Tu aurai pu ne pas utiliser MySQL et faire une BDD en .txt, ça aurait été plus simple coté Pi...
Maintenant que tu as affaire a MySQL, tu peux toujours exécuter du PHP par Python, c'est une solution.
Mais puisque vous utilisez Python pour accéder directement a MySQL sur le serveur Frit, il faut te connecter a la BDD, avec tes identifiants, etc ( les mêmes qu'en PHP...
Visiblement tu n'as pas tout compris non plus toi :lol:
Tiens, cadeau ;)