Requête SQL en fonction de l'heure

WRInaute discret
Bonjour,

voici un nouveau problème auquel je suis confronté :

j'ai un script PHP qui permet de choisir une ligne aleatoirement dans une base SQL et de l'afficher, donc à chaque fois que l'on accède à ce script ( rafraichissement de la page ou nouveau visiteur ) la requète est faite, j'aimerais que cette requête ne soit faite qu'une fois par jour.

Amicalement,
Stone66
 
Nouveau WRInaute
Tu peux enregistrer le résultat de ta requête dans une table, avec l'heure à laquelle cette requête à été faite.
Ensuite dans ton php tu requêtes en premier cette table, avec comme filtre WHERE :
Code:
select *
from matable
WHERE TO_DAYS(NOW())-TO_DAYS(matable.le_champ_date)<1
Si cette requête te retourne quelque chose : tu affiches le résultat.
Si elle ne te retourne rien (c'est donc la première exécution de la journée) : tu choisi une nouvelle ligne aléatoire, que tu intègres dans la matable, et tu affiches cette ligne.
 
WRInaute discret
Tu peux aussi stocker le résultat de la requête dans un fichier texte.
Tu testes alors la dernière date de modification du fichier texte grâce à la fonction filemtime
C'est un système de cache assez classique.
 
WRInaute passionné
Hello

Je te suggère de faire un CRON qui écrira soit dans un champ de la base, soit dans un fichier.
Et ensuite lorsque tu en as besoin tu la lis.

Sinon en SQL only, il y a la possibilité de rajouter un flag dans une table, de type DATE, et lorsque ta requête tourne, tu cherches le flag du jour, s'il n'existe pas,
- tu lances ta recherche
- tu positionnes le flag du jour à la place de l'ancien flag
- tu enregistres ta recherche,
sinon tu récupères la valeur du jour.

Cétouuuuuu
 
WRInaute passionné
Moi c'est "aleatoire" et 1x par jour qui me pose pb :)

soit en effet tu balances ta requete en debut de matinée dans un fichier texte (mais y'a plus d'aleatoire)
soit tu balances une requete de XXX lignes que tu enregistre dans ton fichier texte et tu pioches "aleatoirement" cette fois-ci dedans le reste de la journée ...
 
WRInaute discret
raljx a dit:
soit en effet tu balances ta requete en debut de matinée dans un fichier texte (mais y'a plus d'aleatoire)

je vais opter pour le fichier texte car mon but est d'eviter les acces à la base de donnée, je comprend le principe mais j'ai du mal à le coder en php.
je vais faire quelques tests et vous tiens au courant, en attendant si quelqu'un à un exemple de code tout fait :)

amicalement
Stone66
 
WRInaute discret
raljx a dit:
tu peux aller faire un tour ici
http://www.lbb.org/script/Php/Texte_aleatoire/index.php
ou plus simplement google : https://www.google.fr/search?sourceid=chrome&ie=UTF-8&q=php+texte+aleatoire

si tu peux coder l'ecriture d'un fichier texte tu peux coder un affichage aleatoire :)


en fait c'est pas tout à fait ça :
je veux piocher dans une ligne de ma base SQL aleatoirement mais une seul fois par jour.

mais avec toutes ces info je devrais trouver, je pense que dans le principe il faut que :

- nous somme le 14-10-2010, je pioche une ligne au hasard dans ma base SQL
- je la met dans un fichier texte avec la date
- à chaque visite je test si la date du fichier est egale à la date du jour
- si elle est égale j'affiche la ligne recuperer dans le fichier texte
- si elle est differente je retourne au debut

en gros pour que vous comprenniez bien c'est pour pouvoir afficher une citation différente par jour ( car actuellement j'ai une citation différente mais à chaque affichage ) mais sans faire des requete SQL pour rien
 
WRInaute discret
Tout à fait et tu n'auras qu'une requête par jour.
Je l'ai fait rapidement, dis moi si ça fonctionne :
Code:
<?php
$fichier="adresse_du_fichier.txt";
$jour_fichier=date("d", filemtime($fichier));
if ($jour_fichier==date("d")) readfile($fichier);
else {
ob_start();
// Les instructions qui te permettent d'afficher la citation

$tampon = ob_get_contents();
ob_end_clean();
file_put_contents($fichier,$tampon);
echo $tampon ;
}
?>

Ob_start() est simplement destiné à mettre les données en tampon, ça facilite l'écriture du code : http://fr2.php.net/manual/fr/function.ob-start.php
 
WRInaute accro
stone66 a dit:
- je la met dans un fichier texte avec la date
- à chaque visite je test si la date du fichier est egale à la date du jour
il y a plus facile : ton fichier contient la date dans son nom, genre random-20101014.inc et s'il n'existe pas tu le crées. Comme ça, pas besoin de vérifier si la date existe dans ton fichier
 
WRInaute passionné
encore + simple : tu generes ta requete sql à minuit 1 tous les jours . Elle efface l'ancienne entrée (de la veille) dans ton fichier texte. Tu lis ton fichier txt par jour sans avoir besoin de date.
 
WRInaute discret
oh bein je vais essayé tout ça car j'ai reussi mais mon code est pas très simplifié:
Code:
<?php
$date = date("d-m-Y");
$ouvre=fopen("date.txt","r"); // ouverture fichier en lecture "r"
while (!feof ($ouvre))         // tant que pas en fin de fichier
	{
$tampon = fgets($ouvre, 4096); // mise en tampon des données

  	}
fclose($ouvre);		       // fermeture fichier

if ($date > $tampon) {
	include '../connect.php';
		$nb_lignes = "2000"; 
		$id_max = $nb_lignes ;
		$id = mt_rand(1,$id_max); // creation d'un nombre aleatoire
		$req = mysql_query("SELECT proverbe,auteur,nb_commentaire FROM proverbe WHERE idproverbe='".$id."'");
		$champ_citation = mysql_result($req,0,"proverbe");
		$champ_auteur =  mysql_result($req,0,"auteur");
		$champ_commentaire =  mysql_result($req,0,"nb_commentaire");
		$champ_citation1 = utf8_encode(stripslashes($champ_citation));
		$auteur1 = strtr($champ_auteur, 'ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ ', 'aaaaaaaaaaaaooooooooooooeeeeeeeecciiiiiiiiuuuuuuuuynn+'); 
		echo "document.write(\"<font class='intoxitation_proverbe'>" . $champ_citation1 . "</font><br /><a class='intoxitation_auteur' href='http://www.intoxitation.com/citation-auteur-" .$auteur1."-0.html' title='Voir toutes les citations de " .$champ_auteur."' target='_blank'>" .utf8_encode($champ_auteur)."</a>\")";

		$ouvre=fopen("date.txt","w+"); // ouverture en lecture ( a+)
		fwrite($ouvre,$date);    // écriture fichier
		fclose($ouvre);			// fermeture fichier
		
		$ouvre=fopen("citation.txt","w+"); // ouverture en lecture ( a+)
		fwrite($ouvre,"<font class='intoxitation_proverbe'>".utf8_encode(stripslashes($champ_citation))."</font><br /><a class='intoxitation_auteur' href='http://www.intoxitation.com/citation-auteur-" .$auteur1."-0.html' title='Voir toutes les citations de ".$champ_auteur."' target='_blank'>".utf8_encode($champ_auteur)."</a>");    // écriture fichier
		fclose($ouvre);			// fermeture fichier

		mysql_free_result($req);
		mysql_close();
		}

elseif ($date == $tampon) {
		$ouvre=fopen("citation.txt","r"); // ouverture fichier en lecture "r"
		while (!feof ($ouvre))         // tant que pas en fin de fichier
			{
		$tampon = fgets($ouvre, 4096); // mise en tampon des données
		echo "document.write(\"$tampon\")";		       // affichage du tampon
			}
		fclose($ouvre);		       // fermeture fichier
}
?>
 
WRInaute passionné
m'a l'air bien compliqué pour ce qu'il y a a faire
en gros :

Dans le meme script
1 - tu crées une requete SQL qui va chercher 1 citation au hasard
2 - tu effaces (@unlink) le fichier texte existant et/ou tu en cree un nouveau ou tu ecris la citation
STOP

Dans un cron
1 - tu prevois une execution du script ci-dessus chaque jour a 00:01
STOP

Dans tes pages ou la citation doit apparaitre
1 - tu lis ton fichier texte et tu affiches la 1ere (et la seule) ligne
STOP
 
WRInaute discret
raljx a dit:
m'a l'air bien compliqué pour ce qu'il y a a faire
en gros :

Dans le meme script
1 - tu crées une requete SQL qui va chercher 1 citation au hasard
2 - tu effaces (@unlink) le fichier texte existant et/ou tu en cree un nouveau ou tu ecris la citation
STOP

Dans un cron
1 - tu prevois une execution du script ci-dessus chaque jour a 00:01
STOP

Dans tes pages ou la citation doit apparaitre
1 - tu lis ton fichier texte et tu affiches la 1ere (et la seule) ligne
STOP

ben moi je veux bien simplifier mais je ne connais pas cron, est-ce que c'est faisable sur un serveur mutualiser ?
 
WRInaute accro
raljx a dit:
encore + simple : tu generes ta requete sql à minuit 1 tous les jours . Elle efface l'ancienne entrée (de la veille) dans ton fichier texte. Tu lis ton fichier txt par jour sans avoir besoin de date.
C'est effectivement le plus simple et le plus léger.
 
WRInaute passionné
stone66 a dit:
ben moi je veux bien simplifier mais je ne connais pas cron, est-ce que c'est faisable sur un serveur mutualiser ?

Sur les mutus OVH c'est je crois "Planificateur de tâches" dans le manager...
Pour les autres... j'en sais rien :lol:
 
WRInaute discret
ok, je suis chez OVH, je vais voir ca dans mon manager,

merci de l'intérêt que vous avez porté à mon post :D

Amicalement,
Stone66
 
WRInaute discret
alors je confirme chez OVH on peut planifier une tache dans le manager - hebergement - planificateur de tache.

pour ceux qui veulent l'utiliser n'oublier pas de passer votre fichier appelé en CHMOD 700 et d'ajouter en première ligne de votre page php :
Code:
#!/usr/local/bin/php

cordialement,
Stone66
 
Discussions similaires
Haut