2012-04-02 24 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"?