2016-02-29 93 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