Je suis actuellement en stage pour mon IUT Informatique, et la je sèche... C'est pourquoi j'aurais besoin d'un petit coup de main svp
Ma problématique :
Je dois réaliser un site web qui permettra la supervision d'un automate programmable Entrée/Sortie.
Il gère 2 sondes de température et 5 bouton on/off.
Je travaille avec EasyPHP sur windows 7.
L'automate possède des variables (sondes températures (int) et entrées TOR (boolean))
J'arrive à accdéder à ces variables grace à un fichier PHP, exécuté coté serveur donc, et à les stocker dans une base de données MySQL.
recup_variables.php :
<?php
////////// PARAMS
// $url = url de la page souhaitée
$url="http://192.168.5.234/ReadGV";
// $valeurs contenant les variables qui seront envoyées par POST au serveur
$valeurs = array("temp1;temp2;chauffe;ventilation;sonde1;sonde2;inter;defaut");
// Tableau contenant les options de téléchargement
$options=array(
CURLOPT_URL => $url, // Url cible (l'url de la page que vous voulez télécharger)
CURLOPT_RETURNTRANSFER => true, // Retourner le contenu téléchargé dans une chaine (au lieu de l'afficher directement)
CURLOPT_HEADER => false, // Ne pas inclure l'entête de réponse du serveur dans la chaine retournée
CURLOPT_FAILONERROR => true, // Gestion des codes d'erreur HTTP supérieurs ou égaux à 400
CURLOPT_CUSTOMREQUEST => "POST", // effectuer un "POST" sans les parametres "POST" (&)
CURLOPT_POSTFIELDS => "temp1;temp2;chauffe;ventilation;sonde1;sonde2;inter;defaut"
);
////////// MAIN
// Création d'un nouvelle ressource cURL
$CURL=curl_init();
// Erreur suffisante pour justifier un die()
if(empty($CURL)){
die("ERREUR curl_init : Il semble que cURL ne soit pas disponible.");
}
// Configuration des options de téléchargement
curl_setopt_array($CURL,$options);
// Exécution de la requête
$content=curl_exec($CURL); // Le contenu téléchargé est enregistré dans la variable $content
// Si il s'est produit une erreur lors du téléchargement
if(curl_errno($CURL)){
// Le message d'erreur correspondant est affiché
echo "ERREUR curl_exec : ".curl_error($CURL);
}
// Fermeture de la session cURL
curl_close($CURL);
// Split de la chaine des variables en les mettant dans des $donnee[x]
$donnee=explode(";",$content); //chaines séparées par un point virgule
/* Liste des variables séparées :
$donnee[0] = temp1
$donnee[1] = temp2
$donnee[2] = chauffe
$donnee[3] = ventilation
$donnee[4] = sonde1
$donnee[5] = sonde2
$donnee[6] = inter
$donnee[7] = defaut
*/
//************ Insertion des éléments dans la base de données ************//
// on se connecte à MySQL
$db = mysql_connect('localhost', 'root', '');
// on sélectionne la base
mysql_select_db('aio');
// on crée la requête SQL
$sql=("UPDATE `variables` SET `temp1`='$donnee[0]', `temp2`='$donnee[1]', `chauffe`='$donnee[2]', `ventilation`='$donnee[3]', `sonde1`='$donnee[4]', `sonde2`='$donnee[5]', `inter`='$donnee[6]', `defaut`='$donnee[7]' WHERE `id` = '1'");
// on envoie la requête + affichage erreur si pb
$req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());
// fermeture de la connexion à mysql
mysql_close();
//************ Insertion des éléments dans la base de données ************//
?>
Jusque là tout vas bien, les valeurs s'affichent bien dans ma page de test :
(...)
require_once("recup_variables.php");
(...)
<td>
<?php
// on se connecte à MySQL
$db = mysql_connect('localhost', 'root', '');
// on sélectionne la base
mysql_select_db('aio');
// on crée la requête SQL
$sql=("SELECT `temp1` FROM `variables` WHERE `id` = '1'");
// on envoie la requête + affichage erreur si pb
$req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());
$result = mysql_result ($req,0)/10;
echo $result;
// fermeture de la connexion à mysql
mysql_close();
?>
°C
</td>
Le problème c'est que les valeurs doivent être misent à jour toute les seconde...
J'arrive à le faire en rafraichissant ma page grace à setTimeout en Javascript, mais c'est moche !
Je ne doit pas bien m'y prendre, car je pense qu'il ne faut pas que j'appelle mon fichier "recup_variables.php" dans le HTML.
Mes questions
- Existe-t-il une technique qui permette d'executer une requete SQL toutes les seconde ? (à savoir l'update dans "recup_variables.php", et le "select" dans le code HTML) ?
- Dois-je séparer mon fichier "recup_variables" en 2 parties, une pour récupérer et l'autre pour inserer dans la bas ?
- Ou avez-vous une autre idée à me soumettre ? ^^.
Si vous avez besoin de précision n'hésitez pas car résumer tout ce projet en quelques lignes est difficile quand on a le nez dedans depuis 2 semaines !!
Merci d'avoir pris le temps de me lire.
il le fait déjà en JS, donc à mon avis, il ne veux pas rafraichir TOUTE la page.
EDIT, répondu après toi:
L'avantage d'AJAX c'est que tu peux rafraichir la/les DIV que tu veux dans ta page. Sinon il utilise aussi le timout de JS, pas d'autre moyen, mais AJAX te permets d'envoyer une requête SQL au serveur.
Merci Christouphe, en fait j'avais déjà testé cela avec comme code :
<script>
function refresh_div(){
var xhr_object = null;
if(window.XMLHttpRequest){ // Firefox
xhr_object = new XMLHttpRequest();
}
else if(window.ActiveXObject){ // Internet Explorer
xhr_object = new ActiveXObject('Microsoft.XMLHTTP');
}
var method = 'POST';
var filename = 'test.php';
xhr_object.open(method, filename, true);
xhr_object.onreadystatechange = function(){
if(xhr_object.readyState == 4){
var tmp = xhr_object.responseText;
document.getElementById('to_refresh').innerHTML = tmp;
}
}
xhr_object.send(null);
setTimeout('refresh_div()', 1000);
}
</script>
Ca avait l'air de fonctionner au niveau du rafraichissement des div concernées, mais il y avait un pb d'affichage en double de l'entete, pieds...etc. Comme si ca me rechargeait la div complète dans ma page. Je ne sais pas si je me suis bien fait comprendre...^^.
En gros je pense que c'est l'appel du fichier à la ligne 11 : var filename = 'test.php'; qui ne vas pas car ce script est déjà dans "test.php"
Mais je ne vois pas comment faire autrement....
Désolé de mon niveau très bas, ça ne doit pas être très compliqué..
/*
* Creation d'un objet XmlHttpRequest,
* appele par les autres fonctions.
*/
function getXMLHttpRequest() {
var xhr = null;
if (window.XMLHttpRequest || window.ActiveXObject) {
if (window.ActiveXObject) {
try {
xhr = new ActiveXObject("Msxml2.XMLHTTP");
} catch(e) {
xhr = new ActiveXObject("Microsoft.XMLHTTP");
}
} else {
xhr = new XMLHttpRequest();
}
} else {
alert("Votre navigateur ne supporte pas l'objet XMLHTTPRequest...");
return null;
}
return xhr;
}
/**
* Fonction permettant d'afficher les options de deplacement a partir de l'ID de la case
*/
function optionsDeplacement(idCase) {
var xhr = getXMLHttpRequest();
if (xhr && xhr.readyState != 0) {
xhr.abort();
delete xhr;
}
xhr.onreadystatechange = function() {
if (xhr.readyState == 4 && xhr.status == 200){
document.getElementById('options').innerHTML = xhr.responseText;
} else if (xhr.readyState == 3){
document.getElementById('options').innerHTML = "<div style=\"text-align: center;\">Chargement en cours...</div>";
}
}
xhr.open("POST", "ajax/optionsdeplacement.ajax.php", true);
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=iso-8859-1");
xhr.send("idcase="+idCase);
}
Par contre, tu ne dois pas avoir de texte dans le DIV au départ:
Je rejoins les autres en te confirmant d'utiliser AJAX, et même directement Jquery.
Cela va te permettre de rendre ce rafraichissement plus fluide et moins contraignant pour l'utilisateur.
Merci pour vos réponses, mais je n'y connais vraiment pas grand chose.
Christouphe, ton script ressemble vaguement au miens en amélioré, j'essaye de l'utiliser, mais où met tu ce script ?
J'ai mon fichier test.php dans lequel je veux afficher la valeur (de température par exemple), donc je faisais dans un tableau :
(...)
require_once("recup_variables.php");
(...)
<td>
<?php
// on se connecte à MySQL
$db = mysql_connect('localhost', 'root', '');
// on sélectionne la base
mysql_select_db('aio');
// on crée la requête SQL
$sql=("SELECT `temp1` FROM `variables` WHERE `id` = '1'");
// on envoie la requête + affichage erreur si pb
$req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());
$result = mysql_result ($req,0)/10;
echo $result;
// fermeture de la connexion à mysql
mysql_close();
?>
°C
</td>
Ce qui me donne par exemple :
25,7 °C
Ce qui marche, mais il faut rafraichir la page.
C'est la qu'entre en jeu AJAX, mais je ne vois pas où mettre ton script Christouphe.. J'ai essayé dans mon fichier test.php mais ça ne donne rien...
Je ne vois pas non plus à quoi servent ces 3 dernières lignes :
je l'inclue avec la balise <script> </script>. Il est dans un script JS à part.
Puis après (et c'est important que ce soit après à cause du DOM), donc après la création de ton DIV, tu appelles dans ta page l'affichage via la fonction JS.
xhr.open("POST", "chemin/vers/ton/fichier/affichageDiv1.php", true); => permet de dire quel fichier tu vas ouvrir pour la DIV1
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=iso-8859-1"); => le charset
xhr.send("idcase="+idCase); => les paramètres passés en POST
indique quelle page va être appelé (recup_variables.php dans ton cas), la méthode d'envoi de la requete (POST OU GET) et enfin l'activation de l'Asynchrone ou non (true ou false).
Je m'incruste pour poser une question que pourrait sans doute intéresser l'auteur.
Qu'est ce que l'asynchrone ? Que change l'activation ou la non-activation ?
SI je ne me trompe pas, l'activation de cette option te permet d'effectuer ou non une autre action en même temps.
Donc soit le navigateur reste bloqué le temps que la requête soit fini soit la requête s'effectue en tâche de fond...
...en gros
Arf je ne comprends plus rien et je crois que je vais péter l'ordi !!
Quand j'intègre le script :
function refresh_div(){
var xhr_object = null;
if(window.XMLHttpRequest){ // Firefox
xhr_object = new XMLHttpRequest();
}
else if(window.ActiveXObject){ // Internet Explorer
xhr_object = new ActiveXObject('Microsoft.XMLHTTP');
}
var method = 'POST';
var filename = 'test.php';
xhr_object.open(method, filename, true);
xhr_object.onreadystatechange = function(){
if(xhr_object.readyState == 4){
var tmp = xhr_object.responseText;
document.getElementById('to_refresh').innerHTML = tmp;
}
}
xhr_object.send(null);
setTimeout('refresh_div()', 1000);
}
Ca "marche", enfin le rafraichissement se fait, mais il y a un vielle affichage en double ou triple du menu entete, pieds...
et quand je le met dans un fichier .js à coté, ça ne marche pas !
Sinon voici la tete de mon fichier test.php (fichier d'affichage final client) :
<!DOCTYPE html>
<html>
<head>
<meta name="description" content="Supervision Etuve" />
<meta name="keywords" content="etuve, supervision, aim" />
<meta name="author" content="Vincent" />
<meta name="revised" content="Vincent, 28/06/2012" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<LINK rel=stylesheet type="text/css" href="style_test.css">
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="temp.js"></script>
<script type=text/javascript>
function visibilite(thingId){
var targetElement;
targetElement = document.getElementById(thingId) ;
if (targetElement.style.display == "none"){
targetElement.style.display = "" ;
}
else {
targetElement.style.display = "none" ;
}
}
</script>
</head>
<?php
require_once("menu.inc.php");
require_once("recup_variables.php");
?>
<body>
<div id="corps_homepage">
<h1>Page test affichage test des variables</h1>
<div>
<h1> Etuve numero 1 </h1>
<fieldset>
<legend>Températures</legend>
<table border="0">
<tr>
<th>Position</th>
<th>Température</th>
</tr>
<tr>
<td>haut</td>
<td>
<?php
// on se connecte à MySQL
$db = mysql_connect('localhost', 'root', '');
// on sélectionne la base
mysql_select_db('aio');
// on crée la requête SQL
$sql=("SELECT `temp1` FROM `variables` WHERE `id` = '1'");
// on envoie la requête + affichage erreur si pb
$req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());
$result = mysql_result ($req,0)/10;
echo $result;
// fermeture de la connexion à mysql
mysql_close();
?>
°C
</td>
</tr>
<tr>
<td>bas</td>
<td>
<?php
// on se connecte à MySQL
$db = mysql_connect('localhost', 'root', '');
// on sélectionne la base
mysql_select_db('aio');
// on crée la requête SQL
$sql=("SELECT `temp2` FROM `variables` WHERE `id` = '1'");
// on envoie la requête + affichage erreur si pb
$req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());
$result = mysql_result ($req,0)/10;
echo $result;
// fermeture de la connexion à mysql
mysql_close();
?>
°C
</td>
</tr>
</table>
</fieldset>
</div>
</div>
</body>
<?php
require_once("pied.inc.php");
?>
</html>
on m'a dit qu'il fallait aussi supprimer : require_once("recup_variables.php"); et l'appeler par l'intermédiaire d'un fichier .js
mais je ne vois pas pourquoi ni comment...
merci Nightmare06 mais cette methode actualise toute la page et non d'une partie
En fait c'est similaire au meta refresh en html, sauf qu'on peut y introduire des variables facilement...
Nghtmare06, il ne veut pas recharger la page toutes les secondes, il veut juste qu'une donnée de sa page se mettre à jour toutes les secondes.
ajax est donc tout indiqué ici.
@christouphe, bah j'essaie de me convaincre que c'est l'été...
@bobyrock, je vois ce que tu as voulu dire, j'ai bien compris et te remercie.
Oui ce code est possible mais il rafraichirait toute la page toute les secondes, sa va être indigeste à voir .
@Vic38,
Oui, si tu décides d'utiliser AJAX, il va falloir supprimer ce "require_once" car c'est l'AJAX qui s'occupera de récupérer tes données toute les secondes.
L'AJAX, tu as compris c'est du javascript, et toute les secondes il va se connecter à ton script "recup_variables.php" et attendre une réponse. Il va falloir que tu exploites cette réponse afin de remplir ou remplacer le contenu de ton div.
Si tu n'as jamais fait de javascript ou que tu n'as JAMAIS pratiquer l'AJAX, dirige toi vers les différents tutoriel du site car c'est asseez particulier comme technologie.
En lisant CE tutoriel, tu sera à l'aise en Asynchrone
Merci AlwaysCard, je vais essayer mais je ne pense pas que ce soit ça.
Merci Bobyrock,
Je pense avoir saisi le problème :
Dans mon fichier recup_variable.php (voir script dans 1er msg), j'ai ma requête d'update qui met à jour les éléments dans la bas de donnée.
Et cela doit se faire toutes les secondes.
Et justement comment faire ?
Car dans ma première version ou je rafraichissais la page toutes les 1 secondes (ce qui était vraiment horrible), tout marchait bien.
Mais justement, est-ce que la requête s’effectuait parce que toutes les secondes, ca rafraichissait entièrement ma page principale (test.php), et donc le "require_once( recup_variable.php)" qui rechargeais et relançais le fichier ?
Parce que dans mon problème, il faudrait que toutes les secondes j'ai une requête qui mette à jour la base (coté serveur), et parallèlement, une requête qui vienne consulter la base (coté client).
C'est le code ajax qui s'occupe de faire appel au fichier toutes les secondes.
Ton fichier lui ne fait que retourner les informations textuelles à afficher.
ajax lui appelle le fichier toutes les 2ndes et met à jour la page.
J'ai pas suivi depuis le début.
Mais quel est ton niveau en php et javascript?
L'AJAX est une technologie pas forcément évidente à comprendre.
Comme dit Zazou, ton fichier "recup_variables.php" fonctionne exactement pareil seulement au lieu de l'afficher en brut en php donc à chaque chargement de la page, tu le gère en javascript/AJAX, qui va s'occuper de récupérer les données.
Et oui, tu afficheras le résultat non plus en php mais en javascript.
Je t'aurais bien fait un schéma mais un peu compliqué au clavier
En ce qui concerne mon niveau, je finis mon année spéciale informatique (IUT Info en 1 an car déjà titulaire d'un DUT, à savoir un TC qui ne me sert à rien ici )
Et comme c'est une formation accélérée, on a eu des cours en HTML, et un peu de PHP, mais rien en javascript... Et donc je galère depuis 2 semaines en essayant d'apprendre tant bien que mal...
Mais c'est la vie !
Je viens de discuter avec l'informaticien qui n'était pas dispo ce matin et m'a expliqué les grandes lignes avec un schéma en prime, et Bobyrock je crois que tu as cerné mon pb car il me semble que ce qu'il ma dit est proche de ce que tu me décris.
Il faut créer un fichier PHP : ReadData.php par exemple, qui va s'occuper de récupérer mes variables sur la base de données.
Je rajoute en javascript les affectations des variables dans mes div grace aux id et ça devrait le faire.
Ai-je bien interprété ?
Je vais tester et vous tiens au courant
edit : merci Zazou ça confirme en partie ce que je pensais
C'est vrais quand on sait pas ... ben on sait pas !
Sinon une autre piste aussi pour toi :
réactualise grace a l'ajax toute les 2 ou 3 secondes suffi le temps d'enregistrer les donnée dans le cerveau de l'utilisateur ... par contre crée un schell tout simple qui récupere les temperature de l'autre coté et les insert en bdd mysql sans php ou avec (avec execution grace au tache cron sou unix et donc pour toi je sait pas comment cela s'appel sous windows) comme ca php plus rapide a éxecuté et les temperatures seront actualise en bdd celon le serveur pas celon le cpu de l'user car js tire dessus ^^.
Enfin c'est juste mon avis
Alwayscard.fr, les cartes de visites éternelles : Jamais obsolètes !
Si tu as un peu de mal avec le Javascript et Ajax (comme moi :D) je te conseil vraiment d'utiliser XAjax ça te permettra d'utiliser du php il y a un très bon tutoriel ici : http://www.siteduzero.com/tutoriel-3-3 [...] et-xajax.html
Si tu n'a vraiment pas envie de lire tu peux prendre le code du Chat et essayer de bidouiller un peu
Merci pour vos réponses et pour xajax que je ne connaissais pas !
En fait Arnich et AlwaysCard vous avez raison, je pense que c'est mieux de faire un appel de recup_variable.php coté serveur avec un truc de type cron.
Du coté client, je vais faire un fichier ajax qui récupère les variables dans la BDD et les associent aux div voulues.
Ensuite je mettrais un include de mon fichier ajax, dans mon test.php pour rafraichir les div.
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Keep It Simple Stupid - SF4 conf Swift - Cours 1/4 SF4 - Exceptions PDO - Formes Normales
Keep It Simple Stupid - SF4 conf Swift - Cours 1/4 SF4 - Exceptions PDO - Formes Normales
Keep It Simple Stupid - SF4 conf Swift - Cours 1/4 SF4 - Exceptions PDO - Formes Normales
Keep It Simple Stupid - SF4 conf Swift - Cours 1/4 SF4 - Exceptions PDO - Formes Normales
Keep It Simple Stupid - SF4 conf Swift - Cours 1/4 SF4 - Exceptions PDO - Formes Normales