OVH Cloud OVH Cloud

Aide pour affichage disponibilites

40 réponses
Avatar
MIMATA
Bonjour à tous,

Voilà, je cherche de l'aide pour m'aider à mettre en place un système très
simple d'affichage de disponibilités pour des gites.
Vous pouvez voir ce que je cherche à faire là :
http://www.mimata6.free.fr/admin_dispo.php
Le principe est de faire en sorte que quand on clique sur un jour, dans l'un
des tableaux, on change son état : un clic, le jour est réservé donc la
cellule s'affiche en rouge (par exemple, c'est la classe occupe), un autre
clic sur la même case remet la cellule à son état d'origine, c'est à dire
libre. Pour cela, il faut que, à l'affichage de la page, on teste l'état de
chaque case pour savoir s'il faut l'afficher occupée ou libre, puis, sur
chaque numéro de jour, si on clique on change son état.

J'ai donc :
- 2 pages : dispo.php et admin_dispo (mais on ne va s'occuper que de la page
admin_dispo.php pour le moment)
- Une base de donnée avec une table dispo_gite_ecuries contenant 2 champs :
date et dispo. Voici sa structure :
`date` date NOT NULL default '0000-00-00',
`dispo` int(1) NOT NULL default '0',
PRIMARY KEY (`date`)
Cette table est vide par défaut. Sur un clic, on ajoute un item dans la base
avec la date correspondante et 1 dans dispo, sur le clic suivant sur la même
case, on efface l'item s'il existe, sinon on ajoute.

Les tableaux de chaque mois sont générés en php. Voici le code :

<?php
$m_loc = array(
1=>'Janvier',
2=>'Février',
3=>'Mars',
4=>'Avril',
5=>'Mai',
6=>'Juin',
7=>'Juillet',
8=>'Août',
9=>'Septembre',
10=>'Octobre',
11=>'Novembre',
12=>'Décembre'
);

// numéro de l'année
$a = date("Y");

for($ind=1; $ind<=12;$ind++){
// numéro du mois
$m = $ind;
// timestamp du 1er du mois à minuit une
$t = mktime(0, 0, 1, $m, 1, $a);
// nombre de jours dans ce mois
$nj = date('t', $t);

// n° du premier jour du mois: on décale le résultat anglais
(premier=0=dimanche) pour obtenir premier=1=lundi
$j = date('w', $t);
if ($j==0) $j = 7; // dimanche=7
else $j = $j; // lundi=1 ... samedi=6

// nombre d'espaces à laisser vides avant le premier jour du mois = numéro
du jour - 1
$sb = $j - 1;

// nombre de lignes au total dans la table
// sachant qu'il faut placer AU MOINS $nj+$sb cases, et qu'on a 7 colonnes
// $nl = ceil(($nj+$sb)/7);

$nl = 6;

// pré-remplissage de la table avec des cases vides (0) partout
$tb = array_fill(0, $nl, array_fill(1,7,0));

// remplissage avec les n° de jours, en sautant les $sb premières cases
for ($i=1; $i<=$nj; $i++) {
$ligne = floor(($i+$sb-1)/7);
$colonne = ($i+$sb-1)%7 + 1;
$tb[$ligne][$colonne] = $i;
}


?>
<table border="1" bordercolorlight="#666666" bordercolordark="#FFFFFF"
cellpadding="2" cellspacing="2">
<tr>
<th class="mois" colspan="7" align="center" valign="middle">
<?php echo $m_loc[$m]; ?>
</th>
</tr>
<tr>
<th class="jours">Lun</th>
<th class="jours">Mar</th>
<th class="jours">Mer</th>
<th class="jours">Jeu</th>
<th class="jours">Ven</th>
<th class="jours">Sam</th>
<th class="jours">Dim</th>
</tr>
<?php foreach ($tb as $l) { ?>
<tr>
<?php foreach ($l as $numjour) { ?>

// A PARTIR DE LA CA DELIRE CAR JE NE SAIS PAS LE FAIRE

<?php
// concaténation pour céer la date complète au format mysql 0000-00-00
$date = $a.'-'.$m.'-'.$numjour;
// connexion à la base
include ('config.inc.php');
$req = "SELECT * FROM dispo_gite_ecuries WHERE date='$date'";
$res = mysql_query($req) or die(mysql_error());
if (mysql_num_rows($res) == 0){ // si la recherche ne renvoie rien, on cré
l'enregistrement
// lancement de la requette d'injection
$req = "INSERT INTO dispo_gite_ecuries(date,dispo) VALUES('$date','1')";
mysql_query($req) or die(mysql_error());
}else{ // sinon (l'enregistrement existe deja...)
$req = "DELETE FROM dispo_gite_ecuries WHERE date='$date' AND
dispo='1'";
$res = mysql_query($req) or die(mysql_error());
}

if ($numjour!=0){
if ($dispo == 0){
echo '<td class="libre"><a
href="admin_dispo.php?date='.$date.'">'.$numjour.'</a>'; }
else {
echo '<td class="occupe"><a
href="admin_dispo.php?date='.$date.'">'.$numjour.'</a>'; }
}
else { echo '<td class="pasdebordure">.'; }
?>
</td>
<?php } ?>
</tr>
<?php } ?>
</table>


Merci du coup de main.

MIMATA

10 réponses

1 2 3 4
Avatar
John GALLET
Bonjour,

Le principe est de faire en sorte que quand on clique sur un jour, dans l'un
des tableaux, on change son état : un clic, le jour est réservé donc la
cellule s'affiche en rouge (par exemple, c'est la classe occupe), un autre
clic sur la même case remet la cellule à son état d'origine, c'est à dire
libre.
Ok jusqu'ici.


Pour cela, il faut que, à l'affichage de la page, on teste l'état de
chaque case pour savoir s'il faut l'afficher occupée ou libre,
Pour afficher les dispo.


puis, sur chaque numéro de jour, si on clique on change son état.
Non, pas puis : si on a reçu une date, on la flague dans l'état reçu.


- Une base de donnée avec une table dispo_gite_ecuries contenant 2 champs :
date et dispo. Voici sa structure :
`date` date NOT NULL default '0000-00-00',
`dispo` int(1) NOT NULL default '0',
PRIMARY KEY (`date`)
OUI. Enfin quelqu'un qui a compris à quoi sert un clef primaire,

alleliua. Enfin là on part du principe qu'on a une seule place (si on a
plusieurs écuries, la clef primaire est composée de l'identifiant du box
et de la date, pas seulement la date). En revanche attention à appeler
une colonne "date" car c'est un mot clef réservé du SQL, mettons plutôt
"date_dispo". Là d'ailleurs, à la limite, l'attribut dispo ne sert à rien.

Cette table est vide par défaut.
Donc par défaut tout est libre.


Sur un clic, on ajoute un item dans la base
avec la date correspondante et 1 dans dispo, sur le clic suivant sur la même
case, on efface l'item s'il existe, sinon on ajoute.
Compliqué. On reçoit l'état à mettre (l'inverse de l'état trouvé). Si

l'état nouveau est "LIBRE" on fait un DELETE et basta. Si l'état est
"occupé" on fait un INSERT et on ignore l'éventuel retour "DUPLICATE
KEY" lié au fait qu'on flaggue de nouveau occuppé une date déjà occuppée.

// A PARTIR DE LA CA DELIRE CAR JE NE SAIS PAS LE FAIRE

$req = "SELECT * FROM dispo_gite_ecuries WHERE date='$date'";
$res = mysql_query($req) or die(mysql_error());
if (mysql_num_rows($res) == 0){ // si la recherche ne renvoie rien, on cré
l'enregistrement


Non, si la recherche ne renvoie rien, tout est libre.

Ensuite, modulo la sécurité à apporter aux variables (faible car
intranet, enfin, accès restreint à des gens responsables) :

if(isset($_REQUEST['new_date']) && isset($_REQUEST['new_state']))
{

switch($_REQUEST['new_state'])
{
case 'libre': $query="DELETE FROM dispo_gite_ecuries
WHERE date_dispo='{$_REQUEST['new_date']}' ";
break;
case 'occupe': $query="INSERT INTO dispo_gite_ecuries VALUES(
'$_REQUEST['new_date']}', 1)";
break;
default:exit("Invalid value.");
// break;

$res=mysql_query($query,$dad);
if(!$res)
{
if(mysql_errno($dad)!61) exit("Erreur SQL fatale");
echo "La date était déjà occuppée.";
}// end bad request

} // end switch

}
// affichage normal du calendrier
On select tout ce qui est en base, on remplit les trous, et pour chaque
case on fait un lien qui envoie new_date=la date du jour et
new_state='occupe' si actuellement libre (absent de la table) ou 'libre'
si actuellement occupé (présent en table).

De manière générale, par exemple pour une recherche/modif rapide, pour
une saisie de dates, il vaut mieux faire trois SELECT/OPTIONS, un pour
l'année, le mois, le jour, et valider que la date existe avec
http://fr2.php.net/checkdate mais c'est un autre sujet

HTH
JG

Avatar
MIMATA
Bonjour et merci de te pencher un peu sur mon problème. Tu es le 1er et je
commençais à désespérer.
Juste pour info, "les Ecuries" sont en fait le nom d'un gite..donc pas de
box, ni de chevaux ?



Non, pas puis : si on a reçu une date, on la flague dans l'état reçu.
Ca veut dire quoi "on la flague" ?


En revanche attention à appeler
une colonne "date" car c'est un mot clef réservé du SQL, mettons plutôt
"date_dispo". Là d'ailleurs, à la limite, l'attribut dispo ne sert à rien.
OK, alors j'ai changé ma table avec juste date_dispo et dispo dégage.


Cette table est vide par défaut.
Donc par défaut tout est libre.

Oui



Sur un clic, on ajoute un item dans la base
avec la date correspondante et 1 dans dispo, sur le clic suivant sur la
même
case, on efface l'item s'il existe, sinon on ajoute.
Compliqué. On reçoit l'état à mettre (l'inverse de l'état trouvé). Si

l'état nouveau est "LIBRE" on fait un DELETE et basta. Si l'état est
"occupé" on fait un INSERT et on ignore l'éventuel retour "DUPLICATE
KEY" lié au fait qu'on flaggue de nouveau occuppé une date déjà occuppée.
Euhhhh...ouais...sauf le coup du flaggue encore.



Le nouveau code (avec quelques corrections...je crois, mises en commentaire
et en MAJUSCULE) :

<h1>Disponibilités du gîte « les Ecuries »</h1>
<?php
$req = "SELECT * FROM dispo_gite_ecuries WHERE date_dispo='$date'";
$res = mysql_query($req) or die(mysql_error());

if (mysql_num_rows($res) == 0){ // si la recherche ne renvoie rien, tout est
libre

if(isset($_REQUEST['new_date']) && isset($_REQUEST['new_state'])) //
lancement de la requette d'injection
{
switch($_REQUEST['new_state'])
{
case 'libre': $query="DELETE FROM dispo_gite_ecuries WHERE
date_dispo='{$_REQUEST['new_date']}' ";
break;
case 'occupe': $query="INSERT INTO dispo_gite_ecuries
VALUES('{$_REQUEST['new_date']}', 1)"; // AJOUT DE { DEVANT $_REQUEST
break;
default:exit("Invalid value.");
// break;

$res=mysql_query($query,$dad);
if(!$res)
{
if(mysql_errno($dad)!61) exit("Erreur SQL fatale");
echo "La date était déjà occuppée.";
} // end bad request
} // end switch
}
} // AJOUT d'une }

$m_loc = array(
1=>'Janvier',
2=>'Février',
3=>'Mars',
4=>'Avril',
5=>'Mai',
6=>'Juin',
7=>'Juillet',
8=>'Août',
9=>'Septembre',
10=>'Octobre',
11=>'Novembre',
12=>'Décembre'
);

// numéro de l'année
$a = date("Y");

for($ind=1; $ind<;$ind++){
// numéro du mois
$m = $ind;
// timestamp du 1er du mois à minuit une
$t = mktime(0, 0, 1, $m, 1, $a);
// nombre de jours dans ce mois
$nj = date('t', $t);

// n° du premier jour du mois: on décale le résultat anglais
(premier=0=dimanche) pour obtenir premier=1=lundi
$j = date('w', $t);
if ($j==0) $j = 7; // dimanche=7
else $j = $j; // lundi=1 ... samedi=6

// nombre d'espaces à laisser vides avant le premier jour du mois = numéro
du jour - 1
$sb = $j - 1;

// nombre de lignes au total dans la table
// sachant qu'il faut placer AU MOINS $nj+$sb cases, et qu'on a 7 colonnes
// $nl = ceil(($nj+$sb)/7);

$nl = 6;

// pré-remplissage de la table avec des cases vides (0) partout
$tb = array_fill(0, $nl, array_fill(1,7,0));

// remplissage avec les n° de jours, en sautant les $sb premières cases
for ($i=1; $i<=$nj; $i++) {
$ligne = floor(($i+$sb-1)/7);
$colonne = ($i+$sb-1)%7 + 1;
$tb[$ligne][$colonne] = $i;
}


?>
<table border="1" bordercolorlight="#666666" bordercolordark="#FFFFFF"
cellpadding="2" cellspacing="2">
<tr>
<th class="mois" colspan="7" align="center" valign="middle">
<?php echo $m_loc[$m]; ?>
</th>
</tr>
<tr>
<th class="jours">Lun</th>
<th class="jours">Mar</th>
<th class="jours">Mer</th>
<th class="jours">Jeu</th>
<th class="jours">Ven</th>
<th class="jours">Sam</th>
<th class="jours">Dim</th>
</tr>
<?php foreach ($tb as $l) { ?>
<tr>
<?php foreach ($l as $numjour) { ?>
<?php
// concaténation pour céer la date complète au format mysql 0000-00-00
$date = $a.'-'.$m.'-'.$numjour;

if ($numjour!=0){
if ($date_dispo == 0){
echo '<td class="libre"><a
href="admin_dispo.php?new_date='.$date.'">'.$numjour.'</a>'; }
else {
echo '<td class="occupe"><a
href="admin_dispo.php?new_state='.'occupe'.'">'.$numjour.'</a>'; }
}
else { echo '<td class="pasdebordure">.'; }
?>
</td>
<?php } ?>
</tr>
<?php } ?>
</table>
<?php

}//fermeture FOR
?>


on fait un lien qui envoie new_date=la date du jour et
new_state='occupe' si actuellement libre (absent de la table) ou 'libre'
si actuellement occupé (présent en table).
Mes liens ont cette allure : <a

href="admin_dispo.php?new_date='.$date.'">'.$numjour.'</a> Mais je sais que
c'est pas bon. D'ailleurs ça ne fonctionne pas et ça ne m'étonne pas. Mais
sinon, le reste semble corret ...enfin je crois...

Yannick


Avatar
John GALLET
Re,

Bonjour et merci de te pencher un peu sur mon problème. Tu es le 1er et je
commençais à désespérer.
Toutes les questins n'ont pas nécessairement réponse sur Usenet.


Juste pour info, "les Ecuries" sont en fait le nom d'un gite..donc pas de
box, ni de chevaux ?
:-)) ok, mais ça je ne peux pas le deviner.


Non, pas puis : si on a reçu une date, on la flague dans l'état reçu.
Ca veut dire quoi "on la flague" ?

Anglicisme. "To flag" ça veut dire "marquer". On garde en base le fait

que quelque chose est marqué comme "occuppé".

une colonne "date" car c'est un mot clef réservé du SQL, mettons plutôt
"date_dispo". Là d'ailleurs, à la limite, l'attribut dispo ne sert à rien.
OK, alors j'ai changé ma table avec juste date_dispo et dispo dégage.

Si on part du principe que la présence d'une ligne veut dire "date

occuppée" et l'absence veur dire "date libre", on n'a pas besoin du
"flag" ;-) "dispo".

D'ailleurs maintenant il serait plus logique de l'appeler date_occuppee
que date_dispo :-)


Compliqué. On reçoit l'état à mettre (l'inverse de l'état trouvé). Si
l'état nouveau est "LIBRE" on fait un DELETE et basta. Si l'état est
"occupé" on fait un INSERT et on ignore l'éventuel retour "DUPLICATE
KEY" lié au fait qu'on flaggue de nouveau occuppé une date déjà occuppée.


Euhhhh...ouais...sauf le coup du flaggue encore.
marque, ou enregistre. On "marque", on enregistre de nouveau comme

"occupée". Flagguer, qui n'est absolument pas français, a une
connotation d'une opération très simple et très très courte dans
l'exécution.

$req = "SELECT * FROM dispo_gite_ecuries WHERE date_dispo='$date'";
$res = mysql_query($req) or die(mysql_error());

if (mysql_num_rows($res) == 0){ // si la recherche ne renvoie rien, tout est
libre
Oui mais non, tout ça c'est après le traitement des paramètres.


Mes liens ont cette allure : <a
href="admin_dispo.php?new_date='.$date.'">'.$numjour.'</a>
Il manque new_state.


D'ailleurs ça ne fonctionne pas
Habitude à prendre et à conserver : "ça ne marche pas" ne vient RIEN

DIRE et ne m'aide pas à débugguer. Il faut décrire précisement le
comportement. Selon ce que j'en vois, ou il y a déjà des rangs dans la
table et on ne passe jamais dans le traitement des arguments reçus, ou
la table est vide et on arrive à "invalid value".


Je reprends l'algorithme :
1) si on a reçu une date à modifier, alors la modifier. C'est le pavé
d'instructions qui commence à :
if(isset($_REQUEST['new_date']) && isset($_REQUEST['new_state']))
et termine après le switch.

2) dans tous les cas, qu'on ait à l'instant changé la disponibilité
d'une date ou pas, on affiche le calendrier des disponibilités. Pour ce
faire, on a besoin d'exécuter uen requête SELECT sur la table
dispo_gite_ecurie.

Si on veut seulement avoir la disponibilité pour UN jour donné, on
effectue alors la requête :
SELECT COUNT(date_dispo) as nbre FROM dispo_gite_ecurie WHERE
date_dispo='$_REQUEST['ladatearechercher']' et on fetch le résultat. Si
$row['nbre']==0 alors dispo, sinon, occuppée.

Si on cherche à avoir les dates disponibles du mois de Mars 2006 par
exemple. Alors on va faire la requête suivante :
"SELECT date_dispo FROM dispo_gite_ecurie WHERE date_dispo BETWEEN
(1ermars2006 AND 31mars2006) " [SYNTAXE EXACTE A CHERCHER]

On recevra alors N rangs des dates occupées, qu'on stocke dans un
tableau sans vergogne lors du fetch. Ensuite on faut une boucle for pour
afficher tous les jours du mois de mars. Si le jour est présent dans le
tableau alors il est occuppé. On le met sur un fond de couleur rouge et
on met un lien pour le libérer de la forme :
admin_dispo.php?new_date='.$date.'&new_state=libre">'.$numjour.'</a>

S'il n'est pas dans le tableau des dates occupées venant de la base, on
met un fond vert et on remplace new_state=libre par new_state=occuppe

HTH
JG


Avatar
CrazyCat
MIMATA wrote:
Non, pas puis : si on a reçu une date, on la flague dans l'état reçu.
Ca veut dire quoi "on la flague" ?



Je pense que John entend par là qu'on va changer la valeur d'un champ
indiquant que cette date est prise/libérée.

Sur un clic, on ajoute un item dans la base
avec la date correspondante et 1 dans dispo, sur le clic suivant sur la
même
case, on efface l'item s'il existe, sinon on ajoute.


Compliqué. On reçoit l'état à mettre (l'inverse de l'état trouvé). Si
l'état nouveau est "LIBRE" on fait un DELETE et basta. Si l'état est
"occupé" on fait un INSERT et on ignore l'éventuel retour "DUPLICATE
KEY" lié au fait qu'on flaggue de nouveau occuppé une date déjà occuppée.


Euhhhh...ouais...sauf le coup du flaggue encore.


Je confirme: flagguer = changer l'état d'une variable correspondant à
l'entrée (je vend un dictionnaire JGallet/français d'occasion, beaucoup
servi)

Mes liens ont cette allure : <a
href="admin_dispo.php?new_date='.$date.'">'.$numjour.'</a> Mais je sais que
c'est pas bon. D'ailleurs ça ne fonctionne pas et ça ne m'étonne pas. Mais
sinon, le reste semble corret ...enfin je crois...


Ton script commence par:
$req = "SELECT * FROM dispo_gite_ecuries WHERE date_dispo='$date'";

d'où sort ce $date ?

--
Aide informatique: http://help-info.forumactif.com
Humour: http://www.chatfou.com
Tchattez en liberté: http://www.crazy-irc.net



Avatar
MIMATA
Bonjour,

d'où sort ce $date ?


C'est ma variable qui résulte de la concaténation des autres variables pour
créer la date complète au format mysql 0000-00-00. C'est plus loin dans le
script.
$date = $a.'-'.$m.'-'.$numjour;

Avatar
MIMATA
Toutes les questions n'ont pas nécessairement réponse sur Usenet.
Je sais bien, j'avais posé la question sur des forums aussi ex :

http://www.phpscripts-fr.net/forum1/lire.php?id9443&id29443 et sur
fr.comp.lang.php mais plus personne ne répond et puis j'avais commencé par
me faire jeter comme quoi "la réponse est sur Google alors cherche au lieu
de poser une question archi simple dont tu vas trouver la réponse tout seul
en te donnant la peine...)...enfin.

Juste pour info, "les Ecuries" sont en fait le nom d'un gite..donc pas de
box, ni de chevaux.
:-)) ok, mais ça je ne peux pas le deviner.

Je sais ;-) c'est pour ça que je précise.



D'ailleurs maintenant il serait plus logique de l'appeler date_occuppee
que date_dispo :-)
Oui, mais je m'occuperai de l'adaptation au site de destination

(www.location-gites-lot.com) et de l'application de ce cas pratique aux
différents gîtes et chambres d'hôtes quand ça sera OK. Mais il est vrai que
l'appellation n'est pas très adaptée. On va garder ç a pour l'instant.

$req = "SELECT * FROM dispo_gite_ecuries WHERE date_dispo='$date'";
$res = mysql_query($req) or die(mysql_error());

if (mysql_num_rows($res) == 0){ // si la recherche ne renvoie rien, tout
est
libre
Oui mais non, tout ça c'est après le traitement des paramètres.


Mes liens ont cette allure : <a
href="admin_dispo.php?new_date='.$date.'">'.$numjour.'</a>
Il manque new_state.

Non non, je l'ai mis dans mon dernier post, j'ai marqué :

if ($date_dispo == 0){
echo '<td class="libre"><a
href="admin_dispo.php?new_date='.$date.'">'.$numjour.'</a>'; }
else {
echo '<td class="occupe"><a
href="admin_dispo.php?new_state='.'occupe'.'">'.$numjour.'</a>'; }
}
else { echo '<td class="pasdebordure">.'; }


D'ailleurs ça ne fonctionne pas
Habitude à prendre et à conserver : "ça ne marche pas" ne vient RIEN

DIRE et ne m'aide pas à débuguer. Il faut décrire précisément le
comportement. Selon ce que j'en vois, ou il y a déjà des rangs dans la
table et on ne passe jamais dans le traitement des arguments reçus, ou
la table est vide et on arrive à "invalid value".
Ben ... je sais pas. Tout ce que je constate c'est que rien ne se passe.

J'ai mis 2 dates au hasard (2006-20-01 er 2006-12-20) dans la base pour
tester si ces dates s'affichent comme occupées et ce n'est pas le cas.
Par ailleurs, quand on clique sur une date, rien ne s'enregistre dans la
base. Mon "ça fonctionne pas" voulait dire "rien ne se passe, pas de
changement d'affichage, pas d'enregistrement dans la base".
Maintenant tu as raison : dire, "'j'ai fais des changements mais y'a rien
que se passe" n'aide pas. C'est pour ça que j'ai recopié le code complet
dans mon post, ce que je referais dans mes prochains post jusqu'à ce que
j'arrive à faire fonctionner ce truc. Et c'est aussi pour ça que j'ai
précisé que le résultat en ligne était visible à cette adresse
http://www.mimata6.free.fr/admin_dispo.php (et
http://www.mimata6.free.fr/dispo.php mais pour l'instant on ne s'occupe pas
de cette page).


Je reprends l'algorithme :
1) si on a reçu une date à modifier, alors la modifier. C'est le pavé
d'instructions qui commence à :
if(isset($_REQUEST['new_date']) && isset($_REQUEST['new_state']))
et termine après le switch.
D'ailleurs, dans le switch, la ligne : case 'occupe': $query="INSERT INTO

dispo_gite_ecuries VALUES('{$_REQUEST['new_date']}', 1)";
Le , 1 n'est plus utile puisqu'on a viré le champs dispo de la base
n'est-ce pas ?


2) dans tous les cas, qu'on ait à l'instant changé la disponibilité
d'une date ou pas, on affiche le calendrier des disponibilités.
Si on veut [...cas 1...] [...cas2...] etc.
Je veux que toutes les dispo de l'année soient visible, pas de détails ! Il

y aurait 50 gites je dis pas mais pour 5, je vais faire 5 pages...

On recevra alors N rangs des dates occupées, qu'on stocke dans un
tableau sans vergogne lors du fetch. Ensuite on faut une boucle for pour
afficher tous les jours du mois de mars. Si le jour est présent dans le
tableau alors il est occupé. On le met sur un fond de couleur rouge et
on met un lien pour le libérer de la forme :
admin_dispo.php?new_date='.$date.'&new_state=libre">'.$numjour.'</a>
OK. Mes liens sont donc désormais les suivant :

if ($date_dispo == 0){
echo '<td class="libre"><a
href="admin_dispo.php?new_date='.$date.'&new_state=occupe">'.$numjour.'</a>';
}
else {
echo '<td class="occupe"><a
href="admin_dispo.php?new_date='.$date.'&new_state=libre">'.$numjour.'</a>';
}
}
Si j'ai bien compris, on active le switch en faisant le lien vers la même
page (admin_dispo.php et en mettant ensuite les variables avec leurs
nouvelles valeurs et le script s'exécute à nouveau en attribuant les valeurs
du lien aux variables de la page. J'espère que c'est ça parce que suis
content, j'ai l'impression d'avoir compris un truc....

Bon, pour l'instant ça ne semble pas encore fonctionner (désolé John) mais
je vais faire différents test jusqu'a ce que je trouve une piste.

Merci pour ton aide.

Question subsidiaire : Quand on répond comme je le fais là, pourquoi ça met
des plombes à apparaitre en ligne ? Ca ne me le fait que pour
fr.comp.lang.php, pas avec les autres groupes de discussion auxquels je suis
abonné.


Avatar
John GALLET
Bonjour,

et puis j'avais commencé par
me faire jeter comme quoi "la réponse est sur Google alors cherche au lieu
de poser une question archi simple dont tu vas trouver la réponse tout seul
en te donnant la peine...)


Là c'est un peu plus cilpliqué que ça, même si on trouvera probablement
des exemples de scripts qui font des choses similaires.

Oui, mais je m'occuperai de l'adaptation au site de destination
(www.location-gites-lot.com) et de l'application de ce cas pratique aux
différents gîtes et chambres d'hôtes quand ça sera OK.
Il faudra alors ajouter un identifiant de l'entitée louée dans la clef

de la table, mais sinon pas grand chose à modifier.

Il manque new_state.
Non non,

Si, si.


href="admin_dispo.php?new_date='.$date.'">'.$numjour.'</a>'; }
Et comment on fait maintenant pour le passer à "libre" alors ?


href="admin_dispo.php?new_state='.'occupe'.'">'.$numjour.'</a>'; }
Oui mais là alors il manque la date.


Par ailleurs, quand on clique sur une date, rien ne s'enregistre dans la
base. Mon "ça fonctionne pas" voulait dire "rien ne se passe, pas de
changement d'affichage, pas d'enregistrement dans la base".
Ok, ça c'est précis.


que se passe" n'aide pas. C'est pour ça que j'ai recopié le code complet
dans mon post, ce que je referais dans mes prochains post
.. jusqu'à une certaine taille de code, à partir de laquelle il faudra

mettre un fichier texte ailleurs.

http://www.mimata6.free.fr/admin_dispo.php (et
Moui, enfin j'ai pas nécessairement la possibilité d'y accéder en

permanence.

D'ailleurs, dans le switch, la ligne : case 'occupe': $query="INSERT INTO
dispo_gite_ecuries VALUES('{$_REQUEST['new_date']}', 1)";
Le , 1 n'est plus utile puisqu'on a viré le champs dispo de la base
n'est-ce pas ?
Toutafé.


Je veux que toutes les dispo de l'année soient visible, pas de détails ! Il
y aurait 50 gites je dis pas mais pour 5, je vais faire 5 pages...
Soit, mais ça va pas être nécessairement super lisible ou facile de

viser où cliquer. Enfin c'est un problème d'interface.

OK. Mes liens sont donc désormais les suivant :
if ($date_dispo == 0){
(C'est quoi $date_dispo ?)


echo '<td class="libre"><a
href="admin_dispo.php?new_date='.$date.'&new_state=occupe">'.$numjour.'</a>';
}
else {
echo '<td class="occupe"><a
href="admin_dispo.php?new_date='.$date.'&new_state=libre">'.$numjour.'</a>';
}


Cette partie là semble avoir une bonne tête.

Si j'ai bien compris, on active le switch en faisant le lien vers la même
page (admin_dispo.php et en mettant ensuite les variables avec leurs
nouvelles valeurs et le script s'exécute à nouveau en attribuant les valeurs
du lien aux variables de la page. J'espère que c'est ça parce que suis
content, j'ai l'impression d'avoir compris un truc....


Tout à fait, c'est exactement ça. Un peu de lecture pour les longues
soirées d'hiver : http://www.saphirtech.com/cours.html chapitres sur la
transmission des données et les formulaires.

Bon, pour l'instant ça ne semble pas encore fonctionner (désolé John) mais
je vais faire différents test jusqu'a ce que je trouve une piste.
Ok, sinon tu m'envoies en mail le code, je jetterai un oeil. En enlevant

les login/pass...

Merci pour ton aide.
Np.


Question subsidiaire : Quand on répond comme je le fais là, pourquoi ça met
des plombes à apparaitre en ligne ? Ca ne me le fait que pour
fr.comp.lang.php, pas avec les autres groupes de discussion auxquels je suis
abonné.
Parce qu'on ne poste pas dans un forum Usenet sans avoir lu sa Charte (

http://www.usenet-fr.net/fur/chartes/comp.lang.php.html) et sa FAQ
(http://faqfclphp.free.fr/), où se trouve la réponse à la question.

a++;
JG


Avatar
MIMATA
Bonjour,

http://www.mimata6.free.fr/admin_dispo.php (et
Moui, enfin j'ai pas nécessairement la possibilité d'y accéder en

permanence.
Certes mais je vois pas d'autre solution pour montrer le script en action,

surtout avec la base...


Tout à fait, c'est exactement ça. Un peu de lecture pour les longues
soirées d'hiver : http://www.saphirtech.com/cours.html chapitres sur
la transmission des données et les formulaires.
C'est en marque-page, merci.


Question subsidiaire : Quand on répond comme je le fais là, pourquoi ça
met
des plombes à apparaitre en ligne ? Ca ne me le fait que pour
fr.comp.lang.php, pas avec les autres groupes de discussion auxquels je
suis
abonné.
Parce qu'on ne poste pas dans un forum Usenet sans avoir lu sa Charte
( http://www.usenet-fr.net/fur/chartes/comp.lang.php.html) et sa FAQ
(http://faqfclphp.free.fr/), où se trouve la réponse à la question.
Que j'ai trouvé :-)) : "Le forum fr.comp.lang.php est un forum modéré. Il

est donc normal d'observer un délai avant la parution de votre article. "
OK.


Bon, pour l'instant ça ne semble pas encore fonctionner [...]
Ben maintenant ça marche :-D.


Alors, je me suis quand même bien fait aidé par un spécialiste : je suis
actuellement en formation php notamment mais on n'a pas vraiment commencé le
php...donc, ne pouvant pas attendre, j'ai demandé au formateur.
Les disponibilités des gites sont désormais visible (enfin, quand les
propriétaires que je vais contacter demain auront remplis les plages de
disponibilités car je viens tout juste de boucler le truc.) :
www.location-gites-lot.com/dispo_ecuries.php (par ex mais il y a maintenant
les dispos de chaque hébergement)
Il y aussi eu quelques changements que j'ai apporté ce soir. par exemple, il
y a finalement 2 champs dans ma base car je stocke aussi le nom de chaque
hébergement pour ne pas avoir à créer une table par hébergement. La table se
nomme "disponibilites" et le champs qui stocke les dates s'appelle
"date_occupe". le nom de l'hébergement est passé en variable $nom_gite pour
plus de souplesse. Il y a aussi une requête de plus
$row=mysql_num_rows($res); pour faire je sais pas trop quoi mais ça sert...
On a aussi supprimé quelques bouts de code qui semblaient poser problème
pour je ne sais quelle raison et la variable global $_REQUEST s'est changée
en $_GET car le gars qui m'a aidé ne savait pas bien ce que cette variable
fesait...et moi encore moins.
Je ne peux pas vous montrer la partie admin en action et la démo sur mon
espace www.mimata6 n'est plus fonctionnelle vu les changements apportés au
script et dû au fait que j'ai travaillé directement sur le domaine final.
Mais voici le code :
Résultat des courses pour le fichier d'admin (je mets le code presque
complet une fois de plus car je pense que pour une solution, c'est mieux de
tout avoir sous les yeux) :

<?php include ('connexion.inc.php'); ?>
[...]
/***BON, CA C'EST ENCORE LA GENERATION DES CALENDRIERS - VOIR PLUS BAS***/
<?php
$m_loc = array(
1=>'Janvier',
2=>'Février',
3=>'Mars',
4=>'Avril',
5=>'Mai',
6=>'Juin',
7=>'Juillet',
8=>'Août',
9=>'Septembre',
10=>'Octobre',
11=>'Novembre',
12=>'Décembre'
);

// numéro de l'année
$a = date("Y");

for($ind=1; $ind<;$ind++){
// numéro du mois
$m = $ind;
// timestamp du 1er du mois à minuit une
$t = mktime(0, 0, 1, $m, 1, $a);
// nombre de jours dans ce mois
$nj = date('t', $t);

// n° du premier jour du mois: on décale le résultat anglais
(premier=0=dimanche) pour obtenir premier=1=lundi
$j = date('w', $t);
if ($j==0) $j = 7; // dimanche=7
else $j = $j; // lundi=1 ... samedi=6

// nombre d'espaces à laisser vides avant le premier jour du mois = numéro
du jour - 1
$sb = $j - 1;

// nombre de lignes au total dans la table
// sachant qu'il faut placer AU MOINS $nj+$sb cases, et qu'on a 7 colonnes
// $nl = ceil(($nj+$sb)/7);

$nl = 6;

// pré-remplissage de la table avec des cases vides (0) partout
$tb = array_fill(0, $nl, array_fill(1,7,0));

// remplissage avec les n° de jours, en sautant les $sb premières cases
for ($i=1; $i<=$nj; $i++) {
$ligne = floor(($i+$sb-1)/7);
$colonne = ($i+$sb-1)%7 + 1;
$tb[$ligne][$colonne] = $i;
}
?>
<table border="1" bordercolorlight="#666666" bordercolordark="#FFFFFF"
cellpadding="2" cellspacing="2">
<tr>
<th class="mois" colspan="7" align="center" valign="middle"> <?php echo
$m_loc[$m]; ?> </th>
</tr>
<tr>
<th class="jours">Lun</th>
<th class="jours">Mar</th>
<th class="jours">Mer</th>
<th class="jours">Jeu</th>
<th class="jours">Ven</th>
<th class="jours">Sam</th>
<th class="jours">Dim</th>
</tr>
<?php foreach ($tb as $l) { ?>
<tr>
<?php foreach ($l as $numjour) { ?>

/************************************CA REPREND
LA************************************/
<?php
$date = $a.'-'.$m.'-'.$numjour; // concaténation pour céer la date complète
au format mysql 0000-00-00
$nom_gite = 'ecuries'; // modifier ici le nom de l'hébergement concerné
$req = "SELECT * FROM disponibilites WHERE date_occupe='$date' AND
nom_gite='$nom_gite'";
$res = mysql_query($req) or die(mysql_error());
$row=mysql_num_rows($res);
if ($row == 0){ // si la recherche ne renvoie rien, tout est libre
if(isset($_GET['new_date']) && isset($_GET['new_state'])) // lancement
de la requette d'injection
{
switch($_GET['new_state'])
{
case 'libre': $query="DELETE FROM disponibilites WHERE
date_occupe='{$_GET['new_date']}'";
break;
case 'occupe': $query="INSERT INTO disponibilites
VALUES('{$_GET['new_date']}','$nom_gite')";
break;
default:exit("Invalid value.");
// break;
} // end switch
$res=mysql_query($query);
}
}

if ($numjour!=0){
if ($row == 0){
echo '<td class="libre"><a
href="admin_dispo_'.$nom_gite.'.php?new_date='.$date.'&new_state=occupe">'.$numjour.'</a>';
}
else {
echo '<td class="occupe"><a
href="admin_dispo_'.$nom_gite.'.php?new_date='.$date.'&new_state=libre">'.$numjour.'</a>';
}
}
else { echo '<td class="pasdebordure">.'; }
?>
</td>
<?php } ?>
</tr>
<?php } ?>
</table>
<?php
} // fermeture FOR
?>
[...]

Bon, maintenant, je me rends compte que c'est surement une abbération
d'avoir créé 7 pages différentes pour l'admin et autant pour l'affichage des
dispo en changant juste 1 mot dans chacune (le nom de l'hébergement) alors
que je crois me souvenir qu'on peut passer ce paramètre dans l'url aussi et
au final n'avoir qu'une seule page qui change simplement d'id. Je m'exprime
mal... Mais j'imagine que vous m'avez compris. Ce sera la prochaine
évolution de ce script afin de parvenir à quelque chose qui ressemble plus à
du PHP qu'a du HTML. La transition n'est pas aisée quand on pris l'habitude
de raisonner en terme de vrai pages qui existent vraiement et pas de pages
qui se génèrent en fonction de divers paramètres.

En tout cas merci déjà pour cette première partie.


Avatar
plejeune
Il y a un logiciel très simple et pas cher que beaucoup de
propriétaires se sont procurés : http://roullindeveloppement.free.fr/
Bonne journée. Patrice Lejeune.
Avatar
John GALLET
Bonjour,


Alors, je me suis quand même bien fait aidé par un spécialiste :
Je doute de ce terme quand je lis la suite.


Il y aussi eu quelques changements que j'ai apporté ce soir. par exemple, il
y a finalement 2 champs dans ma base
table pas base. C'est ce que je disais précedemment, s'il y a plusieurs

gites, il faut ajouter un identifiant (son nom par exemple) dans la clef
primaire.

car je stocke aussi le nom de chaque
hébergement pour ne pas avoir à créer une table par hébergement.
Oui bien sûr.


plus de souplesse. Il y a aussi une requête de plus
$row=mysql_num_rows($res); pour faire je sais pas trop quoi mais ça sert...
Lire le manuel de PHP. http://fr2.php.net/mysql_num_rows


On a aussi supprimé quelques bouts de code qui semblaient poser problème
pour je ne sais quelle raison et la variable global $_REQUEST s'est changée
en $_GET car le gars qui m'a aidé ne savait pas bien ce que cette variable
fesait...et moi encore moins.
Dans tous les cas c'est mauvais de l'utiliser directement si ce n'est

pas en intranet/accès protégé avec des gens en qui tu peux avoir
confiance. Voir le cours que j'ai déjà pointé. Mais si le zozo ne sait
pas à quoi ça sert, il y a du soucis à se faire sur le qualificatif
"spécialiste"...

Résultat des courses pour le fichier d'admin (je mets le code presque
complet une fois de plus car je pense que pour une solution, c'est mieux de
tout avoir sous les yeux) :
Oui, mais au delà d'un certain volume de sources, il faudra mettre ça en

fichier quelque part, pas tout publier en direct.

$req = "SELECT * FROM disponibilites WHERE date_occupe='$date' AND
nom_gite='$nom_gite'";
$res = mysql_query($req) or die(mysql_error());
$row=mysql_num_rows($res);
if ($row == 0){ // si la recherche ne renvoie rien, tout est libre
Oui mais on s'en fout. On génère tout le calendrier et on indique ce qui

est occupé, on se fiche du nombre.

case 'occupe': $query="INSERT INTO disponibilites
VALUES('{$_GET['new_date']}','$nom_gite')";
break;
Attention :

1) il faut bien changer la PK afin qu'elle soit (date_occuppee, nom_gite)
2) il faut gérer l'erreur :
$res=mysql_query($query);
Là : si la date est déjà occuppée, et qu'on redemande, le script va se

planter. Il faut vérifier si c'est la PK qui a râlé ou une autre erreur.
On doit TOUJOURS vérifier le retour d'un mysql_query. TOUJOURS.

Bon, maintenant, je me rends compte que c'est surement une abbération
d'avoir créé 7 pages différentes pour l'admin et autant pour l'affichage des
dispo en changant juste 1 mot dans chacune (le nom de l'hébergement)
Oui.


que je crois me souvenir qu'on peut passer ce paramètre dans l'url aussi et
au final n'avoir qu'une seule page qui change simplement d'id. Je m'exprime
mal...
Non, non, c'est exactement ça.


du PHP qu'a du HTML. La transition n'est pas aisée quand on pris l'habitude
de raisonner en terme de vrai pages qui existent vraiement et pas de pages
qui se génèrent en fonction de divers paramètres.
Il faut raisonner à l'envers. On écrit d'abord la logique de

l'application pour en extraire la substantifique moëlle. Et ensuite on
écrit l'interface HTML qui envoie les arguments de manière "conviviale".

a++;
JG

1 2 3 4