tu as surtout fais une remise en forme et supprimé les .$donnees['id_ruche']
J'ai également intégré la variable $message dans la variable $hbody (au lieu de $TEXT).
Et j'ai aussi passé la génération du mail dans la condition if pour éviter d'envoyer le mail si aucune ruche ne ressort de la requête ... ça serait balot
GillesMangin-Voirin a écrit:
j'ai essayé ceci :
// on exécute la variable de détection
$reponse = $bdd->query(" SELECT M1.id_ruche, DATE_FORMAT( MAX( M1.horodatage ), "%d/%m/%Y %H:%i" ) AS derniere_mesure
FROM Telemesures_ruches M1 INNER JOIN Liste_ruches R ON M1.id_ruche = R.id_ruche
WHERE R.date_email IS NULL OR R.date_email < NOW() - INTERVAL 1 MINUTE
GROUP BY M1.id_ruche HAVING MAX( M1.horodatage ) < NOW() - INTERVAL 10 MINUTE ORDER BY M1.id_ruche ");
mais PHP me trouve une erreur sur cette ligne
La coloration syntaxique devrait te mettre la puce à l'oreille ... Tu fermes les guillemets avec celui du DATE_FORMAT avant le %d ...
Il faudrait mettre des apostrophes au lieu des guillemets soit dans le DATE_FORMAT, soit autour de la requête :
// Comme ceci
$reponse = $bdd->query('
SELECT M1.id_ruche, DATE_FORMAT( MAX( M1.horodatage ), "%d/%m/%Y %H:%i" ) AS derniere_mesure
FROM Telemesures_ruches M1 INNER JOIN Liste_ruches R ON M1.id_ruche = R.id_ruche
WHERE R.date_email IS NULL OR R.date_email < NOW() - INTERVAL 1 MINUTE
GROUP BY M1.id_ruche HAVING MAX( M1.horodatage ) < NOW() - INTERVAL 10 MINUTE ORDER BY M1.id_ruche'
);
// Ou comme ceci
$reponse = $bdd->query("
SELECT M1.id_ruche, DATE_FORMAT( MAX( M1.horodatage ), '%d/%m/%Y %H:%i' ) AS derniere_mesure
FROM Telemesures_ruches M1 INNER JOIN Liste_ruches R ON M1.id_ruche = R.id_ruche
WHERE R.date_email IS NULL OR R.date_email < NOW() - INTERVAL 1 MINUTE
GROUP BY M1.id_ruche HAVING MAX( M1.horodatage ) < NOW() - INTERVAL 10 MINUTE ORDER BY M1.id_ruche"
);
C'est le métier qui rentre
GillesMangin-Voirin a écrit:
si je remplace les guillemets par ' elle ne fonctionne plus :
$reponse = $bdd->query('SELECT * FROM Telemesures_ruches WHERE (id_ruche) = $NumRuche AND horodatage >= NOW() - INTERVAL 2 WEEK ORDER BY horodatage DESC');
Je me demande pourquoi?
Là c'est la syntaxe PHP aussi ... PHP n'interprète les variables dans les chaînes (ici $numRuche) qu'entre les guillemets et non entre les apostrophes.
Donc :
// Ceci écrit la chaîne $numRuche sans la remplacer par le contenu de la variable
$sql = 'SELECT * FROM Telemesures_ruches WHERE (id_ruche) = $NumRuche AND horodatage >= NOW() - INTERVAL 2 WEEK ORDER BY horodatage DESC';
// Ceci va remplacer $numRuche par le contenu de la variable
$sql = "SELECT * FROM Telemesures_ruches WHERE (id_ruche) = $NumRuche AND horodatage >= NOW() - INTERVAL 2 WEEK ORDER BY horodatage DESC";
Utiliser un éditeur de texte avec de la coloration syntaxique permet souvent de voir ce genre de problème. Avec les apostrophes $numRuche apparaîtrait de la même couleur que le reste du texte, alors qu'avec les guillemets il serait d'une couleur différente. Exemple avec Notepad++ :
On voit dans le deuxième cas que $numRuche est coloré différemment ...
GillesMangin-Voirin a écrit:
avec ta future réponse je vais encore apprendre quelque chose
Merci j'ai compris (il faut encore que je m'en souvienne...) J'utilise Geany sur Raspberry il met aussi en couleur mais je n'avais pas vraiment fait attention.
mais du coup j'ai essayé de modifier cette requête
$reponse = $bdd->query("SELECT * FROM Telemesures_ruches WHERE (id_ruche) = $NumRuche AND horodatage >= NOW() - INTERVAL 2 WEEK ORDER BY horodatage DESC");
qui fonctionnait par celle-ci afin de mettre la fate au format français :
$reponse = $bdd->query("SELECT * FROM Telemesures_ruches WHERE (id_ruche) = $NumRuche AND DATE_FORMAT(horodatage, '%d/%m/%Y %H:%i:%s' ) >= NOW() - INTERVAL 2 WEEK ORDER BY horodatage DESC");
Du coup ma requête ne renvoie rien (pas d'erreur un tableau vide...) J'ai encore dû louper quelque chose..
Faut-il modifier aussi le format du retour de NOW ou de celui du ORDER BY (ou des 2)?
NOW() retourne un type DATETIME alors que DATE_FORMAT() retourne une chaîne de caractères, la condition n'est donc jamais vérifiée...
Il faut mettre le formatage dans la SELECT, donc le rajouter après * ou carrément enlever * pour préciser seulement les colonnes que tu veux récupérer.
$reponse = $bdd->query("SELECT * , DATE_FORMAT(horodatage, '%d/%m/%Y %H:%i:%s') AS horodatage FROM Telemesures_ruches WHERE (id_ruche) = $NumRuche AND horodatage >= NOW() - INTERVAL 2 WEEK ORDER BY horodatage DESC");
ou
$reponse = $bdd->query("SELECT id_ruche, DATE_FORMAT(horodatage, '%d/%m/%Y %H:%i:%s') AS horodatage, hyg, tex, tin,mas,lum, eau FROM Telemesures_ruches WHERE (id_ruche) = $NumRuche AND horodatage >= NOW() - INTERVAL 2 WEEK ORDER BY horodatage DESC");
× 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.