2016-02-29 96 views
2

我有兩個表格:MySQL查詢陣列

-1 - 酒店[ID,名稱,演員]

2(酒店柱額外我已經選擇爲每一個的名稱) - 額外[ID ,名稱(這裏是酒店的額外像無線網絡,電視,游泳...)

$name = $_GET['name']; 
$hotels_q = mysql_query("SELECT * FROM `hotels` WHERE `name`='$name'") or die (mysql_error()); 
$hotels_row = mysql_fetch_array($hotels_q); 
$id = $hotels_row['id'];  
$extras = explode(",", $hotels_row['extras']); 

$ekstras_q = mysql_query("SELECT * FROM `extras` order by id") or die(mysql_error()); 
      While($ekstras_row = mysql_fetch_array($ekstri_q)){ 
       $eid = $ekstras_row['id']; 
       $ename = $ekstri_row ['name']; 
      echo '<ul><li><input type="checkbox" name="extras['.$eid.'][]" value="'.$ename.'"'; 
      if (in_array($eid, $ekstras)) echo'checked';    
       echo'/>'.$ename.'</li></ul>'; 

問題是在這裏extras_q顯示從表時選中的所有條目,但我只想要只顯示選中的項目!

+0

ID列是extras酒店ID嗎? –

+0

@DarshanMehta因爲桌子會很大! – 1mnumb1

+2

您需要第三個表格將酒店加入(extra_id,hotel_id,extra_id)。也停止使用mysql折舊的API和您對SQL注入攻擊的打開 – 2016-02-29 22:27:53

回答

3

既然你存儲在一列以逗號分隔字符串的額外的ID,我想你應該能夠爆炸該值,然後使用CSV字符串作爲在IN標準,要做到這一點你第二個查詢。

//... 
$extras = $hotels_row['extras']; // don't explode 

// Use IN with the $extras CSV here 
$ekstras_q = mysql_query("SELECT * FROM `extras` 
          WHERE id IN ($extras) ORDER BY id") or die(mysql_error()); 

如果你可以修改你的數據庫,可以改爲創建多到多加入一個表來參加這兩個項目一起,而不是目前使用的是CSV列作爲你的酒店和演員之間的關係是。這可以更容易地編寫查詢來選擇相關記錄。

如果您添加第hotel_extras列第hotel_idextra_id,您可以爲每個酒店的每個額外插入一行。例如,如果與ID爲1的酒店有幾個不同的演員,其在該表中的條目是這樣的:

table: hotel_extras 
_______________________ 
| hotel_id | extra_id | 
======================= 
| 1  |  1 | 
| 1  |  3 | 
| 1  |  4 | 
----------------------- 

下面是使用的你怎麼可以從這樣的設置中查詢數據PDO爲例:

$sql = "SELECT e.id, e.name 
FROM hotels h 
    INNER JOIN hotel_extras he ON h.id = he.hotel_id 
    INNER JOIN extras e ON he.extra_id = e.id 
WHERE h.`name` = ?"; 

$stmt = $pdo->prepare($sql); 
$stmt->bindValue(1, $_GET['name']); 
$stmt->execute(); 

while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { 
    $eid = $row['id']; 
    $ename = $row['name']; 
    '<li><input type="checkbox" name="extras['.$eid.'][]" value="'.$ename.'" checked/>'.$ename.'</li>'; 
} 
+0

我得到了警告:in_array()期望參數2是數組,在這一行給出的字符串 - if(in_array($ eid,$ ekstras))echo'checked'; – 1mnumb1

+0

哦,如果你這樣做,你不應該需要這條線,只需從數據庫中獲取與該酒店相關的數據,它們都將被檢查,所以您可以每次在HTML中包含「checked」。 –

+0

是的作品!但是,如果我用第三張表來加入其他人,那麼需要查看查詢。 – 1mnumb1