Mysql查询数组

时间:2016-02-29 22:21:51

标签: php mysql

我有两张桌子:

1 - 酒店[id,name,extras](我为每个人选择的附加栏名称的酒店名称)

2 - 额外[id,name](这里是酒店的附加设施,如wifi,电视,游泳......)

$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显示所有带表格中已检查条目的条目,但我只想显示已检查的项目!

1 个答案:

答案 0 :(得分: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_id列和extra_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>';
}