8791 sujets

Développement web côté serveur, CMS

bonjour à tous,

j'ai tenté un script pour rechercher dans la base la date suivant aujourdhui (YYYY-MM-DD) et renvoyer 'date_debut', 'titre', et 'description'. En gros je veux afficher le prochain evenement dans mon agenda (plusieurs evenements possibles).Ex: le 25 Janvier 2008: Reunion . Parents d'elèves.
Le problème est que ce script fonctionne par moments (!!) il me faut raffraichir plusieurs fois avoir le resultat attendu.

Si quelqu'un peut m'aider à optimiser ce code, voire une autre solution plus conventionelle.. Merci d'avance


<?php

include(data.php');

$cnx = mysql_connect($dbserver, $dbuser, $dbpass) OR die (mysql_error());
mysql_select_db($dbdb, $cnx) OR die ("Erreur connexion Base");


//connexion a la base effectuée

$dday = time();
$sql = "SELECT * FROM agenda WHERE date_debut >= $dday ORDER BY date_debut";
$req = mysql_query($sql)or die ("Erreur SQL !".mysql_error());
$i = 0;

while($dates = mysql_fetch_assoc($req)){
	$moisg = substr($dates['date_debut'],5,2);
	$jourg = substr($dates['date_debut'],8,2);
	$anneeg = substr($dates['date_debut'],0,4);
	$timestamp = mktime(0,0,0, $moisg, $jourg, $anneeg);
	$timediff = $timestamp - $dday;
	$ecart_jours = floor($timediff / (60*60*24));
	$tabday[$i] = $ecart_jours.'.'.$dates['id'];
	$i = ++$i;
	}
$k = 0;
for ($j=0; $j < $i; ++$j){
	if ($tabday[$j] > 0){
		$tabplus[$k] = $tabday[$j];
		$k = ++$k;
		}
	}
$exptab = explode(".",$tabplus[0]);
$z=0;
$months = array("janvier", "février", "mars", "avril", "mai", "juin",
    "juillet", "août", "septembre", "octobre", "novembre", "décembre");

for ($j=0; $j < $k; ++$j){
	$expdat = explode(".",$tabplus[$j]);
	if($expdat[0]  == $exptab[0]){
		$id = $expdat[1];
		$sql = "SELECT * FROM `agenda` WHERE id=$id";
		$rq = mysql_query($sql)or die ("Erreur SQL !".mysql_error());	
		$rslt= mysql_fetch_assoc($rq);
		if ($z=="0") //pour n'afficher la ligne qu'une fois
		{
		list($y, $m, $d) = explode("-", $rslt['date_debut']);
		echo "Le $d ".$months[$m-1]." $y".'<br /><br />';
		$z=1;
		}
		echo $rslt['nom'].' : '.$rslt['description'].'<br />';
		}
	}

?>



Modifié par el fab (30 Jan 2008 - 11:13)
bon si j'ai bien compris, tu veux pour la date la plus proche de la date actuelle tout les événements.

Ton script est bien compliqué Smiley smile


<?php
require dirname(__FILE__). '/data.php';

$cnx = mysql_connect($dbserver, $dbuser, $dbpass) OR die (mysql_error());
mysql_select_db($dbdb, $cnx) OR die ("Erreur connexion Base");

$mois = array("janvier", "février", "mars", "avril", "mai", "juin",
              "juillet", "août", "septembre", "octobre", "novembre", "décembre");

$sql = "SELECT `id`, `date_debut`, `nom`, `description`
        FROM `agenda`
        WHERE `date_debut` = (SELECT `date_debut`
                              FROM `agenda`
                              WHERE `date_debut` >= NOW()
                              LIMIT 1)
        ORDER BY `id` ASC;";

$req = mysql_query($sql, $cnx) or die("Erreur SQL !".mysql_error());

$viewDate = true;
while($agenda = mysql_fetch_assoc($req))
{
    if($viewDate == true)
    {
        $viewDate = false;
        preg_match('/^(\d{4})-(\d{2})-(\d{2})$/', $agenda['date_debut'], $date);
        echo 'Le '.$date[3] . ' '. $mois[$date[2]-1] . ' ' . $date[1].'<br /><br />';
    }
    echo $agenda['nom'].' : '.$agenda['description'].'<br />';
}
?>


Ca te va comme ça ?
Surfoo a écrit :
bon si j'ai bien compris, tu veux pour la date la plus proche de la date actuelle tout les événements.

Ton script est bien compliqué Smiley smile


<?php
require dirname(__FILE__). '/data.php';

$cnx = mysql_connect($dbserver, $dbuser, $dbpass) OR die (mysql_error());
mysql_select_db($dbdb, $cnx) OR die ("Erreur connexion Base");

$mois = array("janvier", "février", "mars", "avril", "mai", "juin",
              "juillet", "août", "septembre", "octobre", "novembre", "décembre");

$sql = "SELECT `id`, `date_debut`, `nom`, `description`
        FROM `agenda`
        WHERE `date_debut` = (SELECT `date_debut`
                              FROM `agenda`
                              WHERE `date_debut` >= NOW()
                              LIMIT 1)
        ORDER BY `id` ASC;";

$req = mysql_query($sql, $cnx) or die("Erreur SQL !".mysql_error());

$viewDate = true;
while($agenda = mysql_fetch_assoc($req))
{
    if($viewDate == true)
    {
        $viewDate = false;
        preg_match('/^(\d{4})-(\d{2})-(\d{2})$/', $agenda['date_debut'], $date);
        echo 'Le '.$date[3] . ' '. $mois[$date[2]-1] . ' ' . $date[1].'<br /><br />';
    }
    echo $agenda['nom'].' : '.$agenda['description'].'<br />';
}
?>


Ca te va comme ça ?


Royal..ton script gère même les doublons..
en effet le mien etait plus compliqué Smiley lol


Merci pour tout !!
resultat sur : http://www.villecomtal.fr
Modifié par el fab (24 Jan 2008 - 22:45)
Salut el fab

Ce n'est peut-être pas la bonne section du forum mais je tenais quand même à dire que le design de ton site... il est vraiment sympa Smiley cligne
En effet rien ne vaut un bon REGEX pour traiter les dates...
Et pour ton site il est sympa, mais je préférais le style "modern life"

@++

ps:t'as le bonjour de la "Tchicha" Smiley langue
Surfoo,

je me tourne a nouveau vers toi car je me rend compte aujourd'hui que le script ne m'affiche pas la prochaine date (qui est le 02/02) mais le 16/02.
Il manque donc 2 dates entre temps ??

Peux tu m'aider a contourner cela?
Modifié par el fab (29 Jan 2008 - 18:53)
Bon, j'ai codé comme ça....

Pour afficher la première occurence (en cas de 'vrai' doublon c'est l'ID qui prime):


<?php
include("connect.php");
$sql = "SELECT * FROM `agenda` WHERE date_debut BETWEEN DATE_ADD(NOW(),INTERVAL 0 DAY) AND DATE_ADD(NOW(),INTERVAL 365 DAY) ORDER BY date_debut";
$req = mysql_query($sql)or die ("Erreur SQL !".mysql_error());
$dates = mysql_fetch_assoc($req);
echo 'Prochain evenement le : ';
echo substr($dates['date_debut'],5,2).'-'.substr($dates['date_debut'],8,2).'-'.substr($dates['date_debut'],0,4).' '.$dates['description'].'<br />';
echo '....a suivre';
?>


Pour gerer les doublons:

<?php
include("connect.php");
$sql = "SELECT * FROM `agenda` WHERE date_debut BETWEEN DATE_ADD(NOW(),INTERVAL 0 DAY) AND DATE_ADD(NOW(),INTERVAL 365 DAY) ORDER BY date_debut";
$req = mysql_query($sql)or die ("Erreur SQL !".mysql_error());
$i=0;
while($dates = mysql_fetch_assoc($req)){
	$tabday[$i] = $dates['date_debut'].'.'.$dates['id'];
	$i = ++$i;
	}
$exptab = explode(".",$tabday[0]);
for ($j=0; $j < $i; ++$j){
	$expdat = explode(".",$tabday[$j]);
	if($expdat[0]  == $exptab[0]){
		$idcom = $expdat[1];
		$sql = "SELECT * FROM `comments` WHERE id=$id";
		$req = mysql_query($sql)or die ("Erreur SQL !".mysql_error());	
		$rslt= mysql_fetch_assoc($req);
		echo 'Prochaine date: ';
		echo substr($rslt['date_debut'],0,10).' - '.$rslt['description'].'<br />';
		}
	}
?> 


A noter que ce code affiche un évènement du jour même...

le fichier "connect.php" est un fichier contenant le code de connection à ta base....

J'espère avoir répondu à ta question....
Modifié par zest (29 Jan 2008 - 15:46)
Merci Zestounet

ça marche enfin. Le code definitif:

<?php

require 'agenda/data.php';

$cnx = mysql_connect($server, $dbuser, $dbpass) OR die (mysql_error());
mysql_select_db($dbdb, $cnx) OR die ("Erreur connexion Base");

$sql = "SELECT * FROM `agenda` WHERE date_debut BETWEEN DATE_ADD(NOW(),INTERVAL 0 DAY) AND DATE_ADD(NOW(),INTERVAL 365 DAY) ORDER BY date_debut";

$req = mysql_query($sql)or die ("Erreur SQL !".mysql_error());

$i=0;

function date_fr($timestamp){
	$tabjour = array('Dimanche', 'Lundi', 'Mardi', 'Mercredi', 'Jeudi','Vendredi','Samedi');

	$tabmois = array('Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Août', 'Septembre', 'Octobre', 'Novembre','Décembre');
	
	$jsem = date('w', strtotime($timestamp));
	$jmois = date('j', strtotime($timestamp));
	$mois = date('n', strtotime($timestamp));
	$annee = date('Y', strtotime($timestamp));
	$heures = date('G', strtotime($timestamp));
	$minutes = date('i', strtotime($timestamp));
		
	return (ereg(":",$timestamp) ? $tabjour[$jsem]." ".$jmois." ".$tabmois[($mois-1)]." ".$annee." - ".$heures."h".$minutes : $tabjour[$jsem]." ".$jmois." ".$tabmois[($mois-1)]." ".$annee);
}

while($dates = mysql_fetch_assoc($req)){

	$tabday[$i] = $dates['date_debut'].'.'.$dates['id'];

	$i = ++$i;

	}

$exptab = explode(".",$tabday[0]);
$viewDate = true;

for ($j=0; $j < $i; ++$j){

	$expdat = explode(".",$tabday[$j]);
	
	if($expdat[0]  == $exptab[0]){

		$id = $expdat[1];

		$sql = "SELECT * FROM `agenda` WHERE id=$id";

		$req = mysql_query($sql)or die ("Erreur SQL 2!".mysql_error());	

		$rslt= mysql_fetch_assoc($req);
		if ($viewDate == true)
		{
		$viewDate = false;
		echo '<b>Le '.date_fr(substr($rslt['date_debut'],0,10)).'<br /><br /></b>';
		}
		echo $rslt['nom'].'<br />'.$rslt['description'].'<br /><br />';

		}

	}

?> 


résultat ici http://www.villecomtal.fr/
Merci à tous
A+; je coche resolu
Modifié par el fab (30 Jan 2008 - 11:26)
Euh non mais attendez avant de faire tout ça, est ce que vous avez regardé mon code avant d'en faire un autre ?!

J'ai juste oublié un petit truc dans la sous requête SQL, c'est tout....

Prend mon code et remplace la requête par ça :


$sql = "SELECT `id`, `date_debut`, `nom`, `description`
        FROM `agenda`
        WHERE `date_debut` = (SELECT `date_debut`
                              FROM `agenda`
                              WHERE `date_debut` >= NOW()
                              ORDER BY `date_debut` ASC 
                              LIMIT 1)
        ORDER BY `id` ASC;";


J'ai juste rajouté ORDER BY `date_debut` ASC... bref avant de pondre un autre code, il faudrait voir ce qui n'allais pas dans le code et apprendre un peu le SQL car le 'order by' c'est un peu la base.
Surfoo a écrit :
Euh non mais attendez avant de faire tout ça, est ce que vous avez regardé mon code avant d'en faire un autre ?!


Le ORDER BY c'est la base, je veux bien, m'enfin pour en arriver à retrouver cette erreur je peux te dire que je me suis accroché...avec mon petit niveau.

Les deux codes fonctionnent.. Zest a pondu le 2eme entretemps, personne ne peut l'en blamer, bien au contraire, je l'en remercie.

Merci aussi à toi car ton aide m'a quand meme permis d'avancer sur le php, meme si je n'ai pas utilisé ton code.
tu demandes des conseils, je te réponds, ça fonctionne et tu n'utilises pas le code ? A quoi ça sert de demander des conseils si tu les prends pas en compte ?
Surfoo a écrit :
tu demandes des conseils, je te réponds, ça fonctionne et tu n'utilises pas le code ? A quoi ça sert de demander des conseils si tu les prends pas en compte ?


Bien.

Un grand merci à toi, Surfoo, ton code m'a permis d'avancer, notemment sur d'autre projets.
Les deux codes etant fonctionnels, j'ai du faire un choix, et je vais revenir sur ce choix pour utiliser le tien.

A bientot
Heu ....Surfoo et El Fab vous êtes tendus comme des strings !!!

Les deux codes sont pourtant fonctionnels.
Le mien est bien plus classique que l'utilisation de REGEX qui peuvent sembler obscures pour le simple quidam (dont je fais parti Smiley biggrin ).

Commencer par maitriser les bases du PHP et MySQL est je pense une obligation avant de s'attaquer aux enigmatiques expressions réguliaires.

Allez-va sans rancune Smiley biggol [!"#$%&'()*+,-./:;?@[\\\]_`{|}~]