2012-04-02 26 views
2

我在我的phpMyAdmin之類的數據庫,它包含兩個表查詢數據庫中的2個不同的表:
難度使用SQL PHP文件中

  1. tennisCourts
    courtID
    courtName
    bookingFee

  2. tenniscourts_Availability
    courtID
    court_dateBooked

我使用PEAR庫寫一個PHP程序,我奮力創建代碼,讓我:

就拿用戶選擇預約日期並僅在用戶選擇的日期尚未被其他用戶使用時顯示tennisCourts表中的所有字段。我在tenniscourts_Availability表中輸入了虛擬數據。

SELECT and DISPLAY all fields 
from the tennisCourts table (courtID, courtName, bookingFee) 
WHERE court_dateBooked = $CHOSEN_BOOKING_DATE 
    *($_GET is used here to retrieve the booking date enetered by 
    the user in a seperate html document.) 

這裏是我當前的代碼: -

$db_table_tennisCourts = "tennisCourts"; 
$court_ID = "courtID"; 
$court_Name = "courtName"; 
$booking_Fee = "bookingFee"; 


$db_table_tenniscourts_Availability = "tenniscourts_Availability"; 
$court_ID = "courtID"; 
$court_dateBooked = "court_dateBooked"; 

$CHOSEN_BOOKING_DATE = $_GET['user_dateField']; //GET's input data from user form in my other html document. 


$database->setFetchMode(MDB2_FETCHMODE_ORDERED); 


$myQuery = "SELECT $court_ID , $court_dateBooked FROM $db_table_ WHERE $CHOSEN_BOOKING_DATE != $court_dateBooked"; 

$queryResult =& $db->query($myQuery); 

if (PEAR::isError($queryResult)) { 
    die($queryResult->getMessage()); 
} 


while ($Col =& $queryResult->fetchRow()) { 

echo $queryResult[0].' '; //shows courtID 

    $queryResult[1]; 
    list($y,$m,$d)=explode('-',$queryResult[1]); 
echo $d.'/'.$m.'/'.$y.'/<br/>'; 
} 

?> 

我還是新的PHP和SQL所以請原諒我,如果我沒有說清楚。我一直在網上進行調查,各種消息來源說要使用SQL UNION或JOIN?有人能告訴我他們如何在上下文中用於我的場景嗎?我非常感謝任何幫助。感謝您檢查我的問題。

+0

您的問題與本身矛盾。另外tenniscourts_Availability表的目的是什麼?它是否存儲法院可用的所有日期?或法院預訂的所有日期? – liquorvicar 2012-04-02 16:52:51

+0

它基本上存儲了預定法院的所有日期。我只是努力構建我的sql代碼,以便只顯示可用的courtNames而不是已經預訂的那些。 – 2012-04-02 17:25:55

回答

3

查詢改成這樣:

$myQuery = " 
    SELECT DISTINCT 
     c.courtID, 
     c.courtName, 
     c.bookingFee 
    FROM 
     tennisCourts c 
     INNER JOIN tenniscourts_Availability a ON c.courtID = a.courtID 
    WHERE 
     a.court_dateBooked = '". mysql_real_escape_string($CHOSEN_BOOKING_DATE) ."' 
"; 

這將檢索所指定日期預訂所有法院的法庭信息。如果你想獲得所有法院的法庭信息預訂在指定的日期,然後使用該查詢:

$myQuery = " 
    SELECT 
     courtID, 
     courtName, 
     bookingFee 
    FROM 
     tennisCourts 
    WHERE 
     courtID NOT IN (SELECT courtID FROM tenniscourts_Availability WHERE court_dateBooked = '". mysql_real_escape_string($CHOSEN_BOOKING_DATE) ."' 
"; 

有幾件事情需要注意你的代碼:

  1. 您用於表名($db_table_)的PHP變量似乎沒有被定義。
  2. 不知道你是否有這樣做的特殊原因,但是從你發佈的代碼中,我沒有看到需要在PHP變量中存儲列的名稱。它只是混淆了你的例子中的東西。
  3. 確保您清理任何用戶輸入。直接從$_GET使用輸入容易受到SQL injection的影響。
+0

感謝您的時間。我是否必須在c.courtName之前添加'$'才能讓PHP從變量中獲取值或者上面的代碼是否正常工作?再次感謝你的幫助。 – 2012-04-02 17:18:28

+0

那麼,這是我的問題在我的答案在2號。是否有理由需要此列名來自PHP變量?如果沒有,你應該像在我的回答中一樣使用它。如果有特殊原因,那麼你應該使用'c。$ court_Name',或者爲了清楚起見,我更喜歡使用括號:'c。{$ court_Name}'。 – Travesty3 2012-04-02 18:14:27

0

假設事物只在被預訂時插入到可用性表中,我認爲這是你想要的。

SELECT c.courtID, c.courtName, c.bookingFee, a.court_dateBooked FROM tennisCourts c 
LEFT JOIN tenniscourt_Avaliability a ON c.courtID=a.courtID 
WHERE b.court_dateBooked=$CHOSEN_BOOKING_DATE 

然後,您可以通過檢查court_dateBooked是否爲空來篩選出哪些已被預訂。

請參閱以下關於左連接的更多信息:What is the difference between "INNER JOIN" and "OUTER JOIN"?