Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PHP & MySQL
PHP & MySQL Forum d'entraide sur les fonctions MySQL avec PHP. Avant de poster -> FAQ MySQL, Cours MySQL et Sources MySQL. Pour les questions concernant le moteur MySQL plutôt que les fonctions PHP, merci d'utiliser le forum MySQL.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 31/01/2011, 01h10   #1
Membre confirmé
 
Inscription : mars 2003
Messages : 674
Détails du profil
Informations forums :
Inscription : mars 2003
Messages : 674
Points : 242
Points : 242
Par défaut Une table pour des réservations

Bonjour,

Je fais un site pour des réservations à la semaine et j'aimerai bien savoir comment je peux construire la table.

J'ai pensé à une table "semainier" du genre :
- id_logement (qui fait référence à la table des logements)
- semaine1 (où j'indiquerai un tarif)
- statut1 (où j'indiquerai 0 pour libre et 1 pour non disponible)
- semaine2
- statut2
- semaine3
- statut3
etc... jusqu'à la semaine 52

Ma requete serait
Code sql :
SELECT * FROM semainier WHERE id_logement = $id_logement;
Ensuite je crée un tableau que je complète avec toutes les semaines en lisant les champs de la table

Citation:
01/01/2011 08/01/2011 200 blanc si 0
08/01/2011 15/01/2011 250 X si non disponible
15/01/2011 22/01/2011 250 blanc si 0
Je voudrais avoir des avis sur cette façon de traiter les réservations car je n'ai pas envie de créer une table avec 105 champs, de créer le tableau des réservations si quelqu'un peut me proposer une façon de faire plus simple.

Est ce que je ne risque pas d'avoir un problème pour traiter le mois de février ?

Merci d'avance
philippef est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2011, 05h54   #2
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 544
Points : 9 544
Citation:
Reservations(id_logement, id_semaine, statut)
Semaines(id_semaine, Debut, Fin, Annee)
Code :
1
2
3
4
Select * 
From Reservations R
  Inner Join Semaines On R.id_semaine = S.id_Semaine
Where id_logement = $id_logement
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2011, 10h57   #3
Membre confirmé
 
Inscription : mars 2003
Messages : 674
Détails du profil
Informations forums :
Inscription : mars 2003
Messages : 674
Points : 242
Points : 242
Merci pour la réponse.

Dans ton exemple je ne vois pas où je mets le prix des réservations par semaine. Surement dans la table reservations ?

Comment je fais la maintenance de la table semaines ? manuellement ? ou alors je crée une requête qui s'exécute automatiquement -ou pas- au changement d'année ?
philippef est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2011, 13h27   #4
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 544
Points : 9 544
Citation:
Envoyé par philippef Voir le message
Merci pour la réponse.

Dans ton exemple je ne vois pas où je mets le prix des réservations par semaine. Surement dans la table reservations ?
si c'est le prix appliqué à chaque réservation, oui.
Citation:
Envoyé par philippef Voir le message
Comment je fais la maintenance de la table semaines ? manuellement ?
Manuellement ? Tu veux dire, comme si tu étais un opérateur de saisie ?


Citation:
Envoyé par philippef Voir le message
ou alors je crée une requête qui s'exécute automatiquement -ou pas- au changement d'année ?
oui, ou plus simplement, tu peux calculer à l'avance les cent prochaines années, ce qui devrait t'assurer qu'on ne viendrait pas te demander de venir corriger le bug de l'an 2111.
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2011, 15h43   #5
Membre confirmé
 
Inscription : mars 2003
Messages : 674
Détails du profil
Informations forums :
Inscription : mars 2003
Messages : 674
Points : 242
Points : 242
Citation:
Envoyé par Antoun Voir le message
si c'est le prix appliqué à chaque réservation, oui.
oui c'est 1 prix par semaine par logement donc je vais ajouter un champ

Citation:
Envoyé par Antoun Voir le message
Manuellement ? Tu veux dire, comme si tu étais un opérateur de saisie ?
Je suis d'accord ce n'est pas une bonne idée.


Citation:
Envoyé par Antoun Voir le message
oui, ou plus simplement, tu peux calculer à l'avance les cent prochaines années, ce qui devrait t'assurer qu'on ne viendrait pas te demander de venir corriger le bug de l'an 2111.
Que veux-tu dire par calculer les 100 prochaines années ? c'est prévoir les requetes de mises à jour ou créer les tables que l'on supprimerait au fil des ans. Je crois que je me conterai de 10 à 20 ans.
Il serait quoi ce bug de 2111 ? Bien sur c'est par curiosité parce que cette année je n'aurai plus mal aux dents
philippef est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2011, 15h48   #6
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 544
Points : 9 544
Citation:
Envoyé par philippef Voir le message
Que veux-tu dire par calculer les 100 prochaines années ? c'est prévoir les requetes de mises à jour ou créer les tables que l'on supprimerait au fil des ans.
Non, faire une seule table avec toutes les années.
Citation:
Envoyé par philippef Voir le message
Je crois que je me conterai de 10 à 20 ans.
Il serait quoi ce bug de 2111 ? Bien sur c'est par curiosité parce que cette année je n'aurai plus mal aux dents
Et bien, si tu crées aujourd'hui un calendrier couvrant les 100 prochaines années, et que ton application perdure jusque-là, en 2111 ils vont s'apercevoir que le calendrier ne contient plus de date utilisable... Si tu ne fais que 10 ans, cela arrivera en 2021.
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2011, 16h13   #7
Membre confirmé
 
Inscription : mars 2003
Messages : 674
Détails du profil
Informations forums :
Inscription : mars 2003
Messages : 674
Points : 242
Points : 242
Au moment où je crée les tables je me pose une question.

Dans la table semaines Debut et Fin sont de quel format : DD-MM ?
philippef est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2011, 16h29   #8
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 990
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 990
Points : 18 241
Points : 18 241
Envoyer un message via MSN à CinePhil
Citation:
Semaines(id_semaine, Debut, Fin, Annee)
En fait tu peux très bien te passer de l'année et mettre les colonnes Debut et Fin de type DATE, donc au format 'aaaa-mm-jj'.

pour plus d'infos sur la gestion des calendriers, voir chez SQLPro.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2011, 02h40   #9
Membre confirmé
 
Inscription : mars 2003
Messages : 674
Détails du profil
Informations forums :
Inscription : mars 2003
Messages : 674
Points : 242
Points : 242
Je reviens car j'ai avancé un peu dans mon projet

Le code qui suit donne les dates de tous les samedi lorsqu'on entre une date qui correspond à un samedi.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?php
if (isset($_POST['date']))	$date = $_POST['date'];
else $date ="";
?>
<br />Calcul des semaines du samedi au samedi<br /><br />
<form name="calculsemaines" method="POST" action="index.php?page=acces">
Entrez ci-contre le 1er samedi d'une année 
JJ/MM/AAAA &nbsp;&nbsp; <input type="text" name="date" value="<?php echo $date;?>" style="width:100px"> 
<br /><br />
 
<input type="submit" name="valid" value= "calculer">
<br />
<?php
if (!empty($date)){
	$joursem = array('dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi');
	list($jour, $mois, $annee) = explode('/', $date);
	$timestamp = mktime (0, 0, 0, $mois, $jour, $annee);
	if ($joursem[date("w",$timestamp)] == 'samedi'){
		$dateA = $annee.'-'.$mois.'-'.$jour;
		echo "<br />Date de départ = $dateA<br />";
  		//fonction donnant tous les samedi 
		for ($i=$jour; $i<190; $i=$i+7) { 
			$timestampDebut = mktime (0,0,0,$mois,$jour,$annee);
			$DateDebut = date("Y-m-d", $timestampDebut);
			$jour = $i;
			$timestampFin = mktime (0,0,0,$mois,$jour,$annee);
			$DateFin = date("Y-m-d", $timestampFin);
			if ($DateDebut <> $DateFin){
 				echo "<br />Date de début = $DateDebut  , Date de fin = $DateFin ";
  			}
		}
	}
	else { echo "Le $date est un "; echo $joursem[date('w',$timestamp)];}
}
?>
</form>
Maintenant ce que je voudrais faire dans les 1ers jours d'une année c'est supprimer la table "semaines" en cours et recréer une nouvelle table avec les nouvelles valeurs.
Le problème c'est que je ne sais pas alimenter une table avec boucle comme ci-dessus

Merci de me dire où je peux trouver un tuto ou me dire comment faire.
philippef est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2011, 10h33   #10
Membre confirmé
 
Inscription : mars 2003
Messages : 674
Détails du profil
Informations forums :
Inscription : mars 2003
Messages : 674
Points : 242
Points : 242
Je n'ai eu de réponse mais je pense avoir trouvé la soltion
eh oui la nuit porte conseil

A mon avis ma requete va se trouver ici à l'intérieur de la boucle :
Code :
1
2
3
4
5
6
 
if ($DateDebut <> $DateFin){
           $sql = "INSERT INTO semaines (id_semaine, debut, fin)
                    VALUES ('', '$DateDebut', '$DateFin')";
           mysql_query($sql) or die('Erreur SQL !'.$sql.'<br>'.mysql_error());
}
Je teste et je reviens
philippef est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2011, 14h47   #11
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 544
Points : 9 544
Je ne comprends pas pourquoi tu veux créer une nouvelle table à chaque fois, alors que ta table va être la même, modulo les dates de début et de fin.

Si tu veux faire une table des semaines, qui serais par exemple celle-ci :

Code SQL :
1
2
3
4
5
6
7
CREATE TABLE semaines(
  Annee YEAR NOT NULL,
  Num TINYINT NOT NULL,
  Debut DATE NULL,
  Fin DATE NULL,
  PRIMARY KEY (Annee, Num)
) ;

Tu peux utiliser une table des chiffres de 0 à 9 pour créer facilement les mille semaines à partir du lundi 3 janvier 2011 et être ainsi tranquille jusqu'en 2030.

Code SQL :
1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE TABLE chiffres ( Num tinyint(1) UNSIGNED NOT NULL ) ;
INSERT INTO chiffres (Num) VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9) ;
 
INSERT INTO semaines (Annee, Num, Debut, Fin)
SELECT YEAR(Lundi), WEEK(Lundi), Lundi, Lundi + INTERVAL 6 DAY
FROM (
  SELECT '2011-01-03' 
    + INTERVAL (U.Num + 10 * D.Num + 100 * C.Num) * 7 DAY AS Lundi
  FROM Chiffres U
    CROSS JOIN Chiffres D
    CROSS JOIN Chiffres C
) tmp
ORDER BY Lundi ;
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2011, 06h14   #12
Membre confirmé
 
Inscription : mars 2003
Messages : 674
Détails du profil
Informations forums :
Inscription : mars 2003
Messages : 674
Points : 242
Points : 242
Merci de continuer cette discussion.

En fait je ne détruis la table des semaines, je la vide chaque année puis je la reconstruis. L'avantage est que l'id_semaine me donne automatiquement le n° de la semaine celui-ci étant utilisé par par pas mal de gens.

Je vais regarder de plus près les codes que tu me donnes car je ne comprends pas tout. exemple je ne comprends pas pourquoi YEAR est une clé primaire.
Le code pour insérer les valeurs dans la table des semaines ne me parle pas trop. Le mieux c'est peut être que je l'utilise pour me permettre de comprendre.
C'est surtout cette partie où je bute
Code :
1
2
3
4
5
6
7
... FROM (
  SELECT '2011-01-03' 
    + INTERVAL (U.Num + 10 * D.Num + 100 * C.Num) * 7 DAY AS Lundi
  FROM Chiffres U
    CROSS JOIN Chiffres D
    CROSS JOIN Chiffres C
) tmp
Je comprends bien que ces tables sont statiques mais est ce que plus de 1000 enregistrements ne ralentiraient pas les temps de réponses ?
philippef est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2011, 10h57   #13
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 544
Points : 9 544
Citation:
Envoyé par philippef Voir le message
Merci de continuer cette discussion.

En fait je ne détruis la table des semaines, je la vide chaque année puis je la reconstruis. L'avantage est que l'id_semaine me donne automatiquement le n° de la semaine celui-ci étant utilisé par par pas mal de gens.
En termes d'architecture, c'est une aberration. Je ne dis pas que ça ne marche pas, ni même que c'est sous-performant (je n'en sais rien), mais glaobalement, faire des efforts pour perdre de l'information, c'est quand même une drôle de façon de faire

Quant au numéro de semaine, je l'ai bien inclus dans ma table.

Citation:
Envoyé par philippef Voir le message
Je vais regarder de plus près les codes que tu me donnes car je ne comprends pas tout. exemple je ne comprends pas pourquoi YEAR est une clé primaire.
La colonne Annee n'est pas UNE clé primaire. LA clé primaire de la table est la combinaison Annee / Numéro de semaine parce que c'est une table qui couvre plusieurs années. Donc pour identifier une semaine précise, il faut dire "la semaine 24 de l'année 2011", et pas seulement "la semaine 24".

Une autre variante serait de mettre la clé primaire sur la date de Debut.

Citation:
Envoyé par philippef Voir le message
Le code pour insérer les valeurs dans la table des semaines ne me parle pas trop. Le mieux c'est peut être que je l'utilise pour me permettre de comprendre.
En première analyse, disons que c'est juste une astuce pour remplir ton calendrier sans te fatiguer. L'important c'est plutôt l'utilisation d'une table calendrier permanente, pas la manière de la remplir.
Citation:
Envoyé par philippef Voir le message

C'est surtout cette partie où je bute
Code :
1
2
3
4
5
6
7
... FROM (
  SELECT '2011-01-03' 
    + INTERVAL (U.Num + 10 * D.Num + 100 * C.Num) * 7 DAY AS Lundi
  FROM Chiffres U
    CROSS JOIN Chiffres D
    CROSS JOIN Chiffres C
) tmp
Pour expliquer : la base de tout ça est ma table des Chiffres, qui fait 10 lignes. Je fais un premier produit cartésien entre une instance de cette table nommée U (Unités) et une deuxième nommée D (Dizaines) ; cela me donne les 100 combinaisons possibles entre deux chiffres, soit un nombre de 0 à 99, que j'obtiens par la formule 10 * D.Num + U.Num.

Je fais ensuite un second produit cartésien par une troisième instance de Chiffres, nommée C (Centaines). J'obtiens ainsi mille lignes, numérotées de 0 à 999 par la formule 100 * C.Num + 10 * D.Num + U.Num.

Il ne reste plus qu'à transformer ces numéros en semaines. Pour cela, je pars du lundi 3 janvier 2011, et j'ajoute 0 jours, 7 jours, 14 jours, etc. jusqu'à 999 * 7 jours. J'obtiens ainsi les mille lundis à partir de 2011, et il ne me reste plus qu'à utiliser les fonctions classiques YEAR et WEEK pour générer les infos manquantes.
Citation:
Envoyé par philippef Voir le message
Je comprends bien que ces tables sont statiques mais est ce que plus de 1000 enregistrements ne ralentiraient pas les temps de réponses ?
Non, pas avec un index sur les colonnes que tu utilises pour tes filtres ou tes jointures (Annee et Semaine ou Debut et Fin, selon ton utilisation).
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2011, 19h36   #14
Membre confirmé
 
Inscription : mars 2003
Messages : 674
Détails du profil
Informations forums :
Inscription : mars 2003
Messages : 674
Points : 242
Points : 242
Déjà je tiens à te remercier Antoun pour toutes tes explications et ta patience.

Donc je viens de créer les tables.
Tout fonctionne bien mais...
Le problème est que les réservations se font du samedi au samedi et dois afficher les semaines du samedi au samedi.
Donc j'ai remplacé les valeurs Lundi par Samedi et j'ai changé la date de départ : 2011-01-01
Quand je regarde la table semaines, certains n° de semaines commencent par 0 !!!

Y a t-il une solution à ce problème ?
philippef est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2011, 22h11   #15
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 544
Points : 9 544
MySQL prévoit plusieurs modes de numérotation des semaines (cf http://dev.mysql.com/doc/refman/5.1/...#function_week), mais après test, aucun d'entre eux ne permet de numéroter 1 une semaine commençant un samedi.

Je pense que le plus simple est de rester calé sur le lundi 03/01/2011, et de reculer ensuite les dates de début et fin de 2 jours :

Code :
update semaines set deb = deb - interval 2 day, fin = fin - interval 2 day ;
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/02/2011, 02h41   #16
Membre confirmé
 
Inscription : mars 2003
Messages : 674
Détails du profil
Informations forums :
Inscription : mars 2003
Messages : 674
Points : 242
Points : 242
Tout cela est parfait.

Il me reste maintenant à créer un tableau HTML pour la sélection des semaines et à entrer les réservations dans la table des réservations.

Encore merci
philippef est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h34.


 
 
 
 
Partenaires

Hébergement Web