2012-06-29 6 views
2

У меня возникла проблема. У меня есть форма, которую я пытаюсь добавить страницу редактирования для вставки в mysql. Я получаю все номера из одной таблицы, а затем я должен проверить, проверены ли они в другом столе.Checkboxes check from mysql

Table 1 (HotelRooms): 
ID | HotelRoom | Hid 
--------------------- 
1 | Standard | 20 
2 | Deluxe | 20 
2 | Basic  | 20 

Table 2 (HotelPromos) 
ID | Promo | Rooms | Hid 
------------------------- 
1 | 10% | deluxe, standard | 20 

Теперь в моей форме, я в первую очередь необходимо найти все номера, принадлежащие к гостинице с хид 20. так вот мой выбор заявление о том, что:

<?php 
$getRooms = mysql_query("SELECT HotelRoom FROM HotelRooms WHERE HotelId = '$hid'") or die(mysql_error()); 
$rr = 1; 
$numRooms = mysql_num_rows($getRooms); 
if($numRooms == 0){ 
    echo "Lo sentimos pero no hay habitaciones registrados para este hotel. Favor de agregar habitacion para poder agregar una promocion."; 
    } 
while($ro = mysql_fetch_array($getRooms)){ 
    $roomName = $ro['HotelRoom']; 
    ?> 
    <input type="checkbox" name="room<?php echo $rr ?>" /><?php echo $roomName ?> 
    <?php 
    $rr++; 
    } 
?> 

Кто-нибудь знает, как я могу проверить HotelPromos таблицу, чтобы увидеть, находится ли она под столбцом «Номера» и добавить проверочный флажок «проверено» на него ???

Любая помощь была бы значительно оценена !!!

+0

Почему две записи в HotelRooms имеют одинаковый идентификатор? Это должно быть уникальным, если это первичный ключ. Является ли идентификатор в этой таблице ссылкой на конкретную комнату или тип комнаты внутри отеля? – FlyingMolga

+0

После извлечения HotelPromos.Rooms из запроса вы можете использовать [функцию разрыва PHP] (http://www.php.net/manual/en/function.explode.php), чтобы разбить результат и сравнить его с тем of HotelRooms.HotelRoom Но если вы можете изменить данные в таблице, возможно, лучше нормализовать столбец Rooms, чтобы вы могли выполнить полное сравнение с запросом. Кроме того, поскольку в случае с Room и HotelRoom разные, вам может потребоваться преобразовать HotelRoom в нижний регистр в PHP. – FlyingMolga

ответ

1

Я предполагаю, что идентификатор Basic на самом деле 3, а не 2, и это опечатка.

Прежде всего, в HotelPromos вам следует использовать идентификаторы комнат (1, 2), а не имена (Deluxe, Standard).

Во-вторых, вы должны разделить HotelPromos на две таблицы в соответствии с «Первой нормальной формой», частью Database Normalization.

Да, это немного сложнее разработать, и вам придется изменить свой код, но он делает сложные запросы намного проще для записи.

PromoCodes 
ID | Promo 
---------- 
1 | 10% 

HotelPromos 
RoomID | PromoID 
---------------- 
1  | 1 
2  | 1 

Теперь вы можете получить все номера в отеле соответствие ID

SELECT HotelRooms.ID, HotelRooms.HotelRoom as Name, HotelPromos.PromoID 
    FROM HotelRooms 
    LEFT JOIN HotelPromos 
     ON HotelRooms.ID = HotelPromos.RoomID 
    WHERE HotelId = '$hid' 

LEFT JOIN означает, что я хочу все номера в отеле 20 независимо от того, имеют ли они промо. PromoID будет либо идентификатором промо-кода, либо NULL, если код не доступен, и вы можете использовать это, чтобы решить, следует ли устанавливать этот флажок.

while($ro = mysql_fetch_assoc($getRooms)){ 
    $roomName = $ro['Name']; 
?> 
<input type="checkbox" name="room<?= $rr ?>" <?php if($ro['PromoID']) { echo 'checked="checked" '; } ?>/><?php echo $roomName ?> 
<?php 
    $rr++; 
} 

И последнее дело, я думаю, вы должны использовать $ro['ID'] вместо новой переменной $rr

0

Не уверен в вашей схеме таблиц, но что-то вроде следующего. Затем проверьте, установлен ли идентификатор. PS, избегайте ввода!

SELECT HotelRoom, hp.id 
FROM HotelRooms AS hr 
LEFT OUTER JOIN HotelPromos AS hp ON hp.hid=hr.id 
WHERE HotelId = '$hid'"