PHP / MySQL Rezervasyon Sistemi

2 Cevap php

Şu anda benim okul için bir donatım Rezervasyon Sistemi üzerinde çalışıyorum.

İşte benim tablolar neye temelde:

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    

Benim proje ile ilgili, ben birkaç soru var:

1) birden fazla donanım) değil daha fazla kez gerçekleşecek olan (saklıdır ediliyor ise "equipmentIDs" virgül equipmentID alanında ayrılmış olmalıdır?

Bir kullanıcı bir rezervasyon yaptığında 2) Şu anda, ilk önce kendi "istenen kez" seçeneğini, o anda mevcut öğeleri ile sunulmaktadır. İşte o sorgu için kullanıyorum ne:

$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

 }

Benim soru şudur:

(Onlar kullanılabilir olmaz çünkü) Nasıl sonra yeniden sorgu 'tblequipment' masaya Yukarıdaki sorgu 'sonuçları' alır, ancak yukarıda sonuçlarına 'vardı öğeleri hariç tutabilirsiniz. Yukarıda benim sorgu birden fazla satır döndürebilir ki, akılda tutulması.

Bu konuda herhangi bir yardım büyük olurdu, teşekkürler!

2 Cevap

İlgili # 1: Hayır! Hayır, hayır, hayır, hayır, hayır! Eğer ayrılmış olan çoklu parçaları varsa, o zaman (tblEvents burada neye benzediğini) rezervasyonları tabloda birden rows olmalıdır. tblEvents olarak other alanlarını çoğaltarak önlemek için, genellikle belki tblEventEquipment bu sadece ne olayla ait ne donanımları listeler, üçüncü bir tablo oluşturmak istiyorum.

(Muhtemelen görünmüyor) çıkış amaçları için bir virgülle ayrılmış listesini gerekiyorsa, her zaman GROUP_CONCAT() ile bir oluşturabilir, ancak tablonun içine Eğer ekipman saklıdır birim başına bir satır istiyorum. Aksi takdirde, SQL değil, etkin (ya da verimli bir şekilde) belirli bir zamanda ayrılmış ne ekipman belirleyebilirsiniz.

# 2 ile ilgili olarak, sizin gibi bir sorgu istiyorum:

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

Bu ekipmanı seçer var ki isn't rezervasyon için. Ben ekipman sadece iki karşılaştırmalar yaparak ayrılmış olup olmadığının belirlenmesi için mantık basitleştirilmiş unutmayın.

Son olarak, alakasız bir not: Ben veritabanı tablosunda tamsayılar olarak damgalarını saklamak karşı şiddetle öneririz. MySQL yerleşik DATETIME yazın kullanın. Bir zaman damgası / dönüştürmek için gerekiyorsa, UNIX_TIMESTAMP() ve FROM_UNIXTIME() işlevlerini kullanabilirsiniz.

  1. Hayır, virgülle ayrılmış değerler kullanmayın. Check-out için birden çok öğe yeteneğine sahip bir kullanıcı istiyorsanız, yeni bir tablo gerekir:

    Tablolar: Users, Property, Checkout

    Yeni Ödeme tablosu aşağıdaki alanları olacaktır:

    • kimlik
    • person_kimlik
    • property_kimlik
    • checkout_date
    • checkin_date

    Bu tablo, herhangi bir kullanıcı için birden çok girdi olabilir. Bir kullanıcı bir kez bir şirket dizüstü bilgisayar için orada olacak, ve yine bir şirket projektör için olabilir:

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

  2. Bir öğe saklıdır eğer, ben bir Boole değeri tutmak için property tabloda bir alan olarak yaptığınız kontrol gelince:

    is_reserved (BOOL)

    Mevcut öğeleri bulma false bool değere sahip tüm öğeleri denetimi daha hiçbir şey ve hiçbir checkin_date ile birleştiğinde ödeme tablosunda hiçbir varlığıdır.