2008-11-25 128 views
1

我一直在试图解决这个问题一天。 我甚至放弃了一段时间,因为我是一个PHP新手,我需要帮助。帮助SQL查询

这是我的问题: 我有一个查询,选择表中'酒店'的所有适当的记录,然后为每个酒店查找某个表中'某些类型的预订房间'和所有这些在某个时间段。 因此,我首先根据搜索表单提供的位置从“hotel_table”中取出所有hotel_id,并对每个hotel_id通过'booked_rooms'表循环。

下面的代码:

if(isset($_GET['book'])){ 
$sql=mysql_query("SELECT hotel_id FROM 'hotels' WHERE city='$city") or die(mysql_error()); 
while($row=mysql_fetch_array($sql)){ 
    $sql_2=mysql_query("SELECT * FROM `booked_rooms` WHERE hotel_id='$hotel_id' 
    AND arrival_date BETWEEN '$arrival_date' AND '$departure_date' 
    OR departure_date BETWEEN '$arrival_date' AND '$departure_date'") 
or die(mysql_error()); 
} 

while($row_2=mysql_fetch_array($sql_2)){ 
    print_r($row_2); 
} 

} 
// $city, $arrival_date and $departure date are values retrieved from the search form 

的问题是,我得到一个循环通过“酒店”表,并得到所有适当的位置hotel_ids,但一无所获与打印$ row_2阵列。 我试着在'foreach'循环中使用JOINS,但也没有运气。 我知道这是一个微不足道的问题,但我还在学习,所以任何提示都非常受欢迎。 在此先感谢。

回答

5

不知道PHP,你可以在一个查询中做到这一点?

SELECT booked_rooms.*, hotels.* FROM 'hotels' 
JOIN 'booked_rooms' ON hotels.hotel_id = booked_rooms.hotel_id 
WHERE 
    hotels.city='$city" AND 
    (
    booked_rooms.arrival_date BETWEEN '$arrival_date' AND '$departure_date' OR 
    booked_rooms.departure_date BETWEEN '$arrival_date' AND '$departure_date') 

检查'所必需的PHP字符串等在你的桌子报价...

1

首先,你必须在你的第一个SQL的错误你有没有引用您的城市名正常。然后,您不会从结果集中获取hotel_id。然后你在错误的地方有第二个循环。

尝试以下操作:

if(isset($_GET['book'])) { 
    $sql = mysql_query("SELECT hotel_id FROM 'hotels' WHERE city='".mysql_real_escape_string($city)."'") or die(mysql_error()); 

    $arrival_date = mysql_real_escape_string($arrival_date); 
    $departure_date = mysql_real_escape_string($departure_date); 
    while($row = mysql_fetch_assoc($sql)) { 
     $hotel_id = $row['hotel_id']; 
     $sql_2 = mysql_query("SELECT * 
      FROM `booked_rooms` 
      WHERE hotel_id = ".$hotel_id." 
       AND (
        arrival_date BETWEEN '".$arrival_date."' AND '".$departure_date."' 
        OR departure_date BETWEEN '".$arrival_date."' AND '".$departure_date."' 
       )") 
     or die(mysql_error()); 

     while($row_2 = mysql_fetch_assoc($sql_2)) { 
      print_r($row_2); 
     } 
    } 

} 

// $city, $arrival_date and $departure date are values retrieved from the search form 

我也建议是在你的空白更慷慨。它使PHP更易于阅读。

+0

你不需要在where子句的第二部分围绕括号吗?否则,这些谓词的优先级不清楚......? – Codewerks 2008-11-25 03:30:49

+0

当。你是对的。我的意思是添加这些,但分心。它是固定的。 – staticsan 2008-11-25 05:06:39

1

请不要将来自外部的不可信的数据构建S​​QL查询。这是鲍比表问题。

有关使用参数化语句的详细信息,请参阅this one这样的页面。