2009-08-19 4 views
2

Je travaille actuellement sur un système de réservation d'équipement pour mon école.Système de réservation PHP/MySQL

est ici essentiellement ce que mes tableaux ressemblent:

tblEquipment:

 
    id name   description 
     1 Camera  Takes pictures 
     2 Projector  Projects images 
     3 Stereo  Plays music 

tblEvents:

 
     id  equipmentID  start    end 
     1   2,3   1251312300  1251315900 //Should I use comma delimited entries for equipmentID? 
     2   1   1251312300  1251315900  

En ce qui concerne mon projet, j'ai quelques questions:

1) Si plusieurs équipements sont réservés (ce qui arrivera plus souvent qu'autrement), les "equipmentIDs" doivent-ils être délimités par des virgules dans le champ equipmentID?

2) Actuellement, lorsqu'un utilisateur effectue une réservation, il sélectionne d'abord ses "heures demandées", puis présente les articles disponibles à ce moment-là. Voici ce que j'utilise pour cette requête:

$start = //user's requested time 
$start = //user's requested time 

SELECT equipmentID FROM tblEvents 
WHERE ($start >= start && $start <= end) 
OR ($end >= start && $end <= end) 
OR ($start <= start && $end >= end 

while($row = mysql_fetch_array($data)) { 

    echo $row['equipmentID']; //Would echo something like: 
    echo "<br>";    // 2,3 
          // 1 

} 

Ma question est la suivante:

Comment puis-je prendre les « résultats » de la requête ci-dessus pour ensuite re-interroger la table de « tblequipment », mais exclure les éléments qui figuraient dans les «résultats» ci-dessus (parce qu'ils ne seraient pas disponibles). En gardant à l'esprit que ma requête ci-dessus peut renvoyer plusieurs lignes.

Toute aide sur ce serait génial, merci!

Répondre

5

Concernant le n ° 1: Non! Non non Non Non Non! Si vous avez plusieurs équipements en réserve, alors vous devriez avoir plusieurs lignes dans la table des réservations (ce qui ressemble à tblEvents ici). Pour éviter de dupliquer les champs autres dans tblEvents, vous créez généralement une troisième table, peut-être tblEventEquipment qui répertorie simplement l'équipement auquel appartient cet événement.

Si vous avez besoin d'une liste séparée par des virgules pour la sortie (ce qui ne semble pas probable), vous pouvez toujours en générer une avec GROUP_CONCAT(), mais dans la table vous voulez une ligne par équipement réservé. Sinon, SQL ne peut pas déterminer efficacement (ou efficacement) quel équipement est réservé à un moment donné.

En ce qui concerne # 2, vous voulez une requête comme:

SELECT * 
FROM tblEquipment 
WHERE NOT EXISTS (
    SELECT 1 
    FROM tblEvents 
    WHERE tblEvents.equipmentID = tblEquipment.equipmentID 
    AND $end >= start AND $start <= end 
) 

Ceci permet de sélectionner l'équipement pour lequel il n'est pas une réservation. Notez que j'ai simplifié votre logique pour déterminer si l'équipement est réservé ou non en faisant seulement deux comparaisons. Enfin, une note sans rapport: je recommande fortement de ne pas stocker les horodatages comme des entiers dans la table de la base de données. Utilisez le type intégré DATETIME de MySQL. Si vous devez convertir vers/depuis un horodatage, vous pouvez utiliser les fonctions UNIX_TIMESTAMP() et FROM_UNIXTIME().

2
  1. Non, n'utilisez pas de valeurs séparées par des virgules. Si vous voulez un utilisateur d'avoir la possibilité de check-out plusieurs éléments, vous aurez besoin d'une nouvelle table:

    Tables: Utilisateurs, Propriété, Commander

    La nouvelle table de Google Checkout ont les champs suivants:

    • id
    • person_id
    • property_id
    • checkout_date
    • checkin_date

    Ce tableau peut avoir plusieurs entrées pour un utilisateur particulier.Un utilisateur peut être là une fois pour un ordinateur portable d'entreprise, et encore pour un projecteur d'entreprise:

    1 | 12 | 23 | 2009-08-17 | 0000-00-00
    2 | 12 | 28 | 2009-08-17 |

  2. 0000-00-00
  3. Comme pour vérifier si un article est réservé, je en tant que champ dans la propriété table pour contenir une valeur booléenne:

    is_reserved (BOOL)

    Trouver des articles qui sont disponibles n'est rien de plus que la vérification de tous les éléments avec une valeur BOOL de false, et pas de présence dans la table de sortie couplée avec aucun checkin_date.

Questions connexes