2017-04-03 3 views
-1

Ich habe drei Tabellen in meiner mySQL-Datenbank. Einfach gesagt, sie sindmySQL-Abfrage zum Verbinden von 3 Tabellen

CREATE TABLE hotel (
h_id 
) 

CREATE TABLE amenities_map (
am_id, 
h_id, 
amenity_id, 
amenity_text 
) 

CREATE TABLE amenities (
amenity_id, 
amenity_name, 
amenity, 
amenity_text 
) 

Mit Hilfe dieser Tabellen kann ich die Annehmlichkeiten in einer Liste von Hotels angezeigt werden, mit einer variablen Anzahl von Annehmlichkeiten in jedem. Jetzt muss ich eine Admin-Seite erstellen, um die Annehmlichkeiten jedes Hotels hinzuzufügen, zu ändern und zu löschen.

Ich habe mit einer einfachen Abfrage auf der Annehmlichkeiten Tabelle gestartet:

$query_amenities = "SELECT * FROM amenities ORDER BY amenity_id ASC"; 

Das bin ich eine Tabelle erstellen können alle möglichen Annehmlichkeiten zeigt.

<?php while ($row_amenities = $amenities->fetch_assoc()) {?> 
<tr> 
<td><?php echo $row_amenities['amenity_name'] ?></td> 
<td><input type="checkbox" name="amenity[]" value="<?php echo $row_amenities['amenity'] ?>" <?php echo $chk_allinc ?>></td> 
<td><input name="amenity_text[]" type="text" value="<?php echo $row_amenities['amenity_text'] ?>" disabled> 
<input type="hidden" name="amenity_id" value="<?php echo $row_amenities['amenity_id'] ?>"></td> 
</tr> 

ich herausfinden kann, welche Ausstattung gibt es im Hotel mit

$query_amenities2 = "SELECT amenity_id, amenity_text FROM amenities_map WHERE h_id='$h_id'"; 

Jetzt ist hier, wo ich stecken. Wenn eine amenity_id in der Abfrage von advancements2 angezeigt wird, muss dieser amenity_text-Wert in der Tabelle anstelle des ersten verwendet werden. (Ich muss auch das entsprechende Kästchen als "checked" markieren.) Ich möchte die "advanced2" -Abfrage nicht in die "where" -Schleife setzen, da sie dadurch etwa 30 Mal laufen wird. Gibt es eine Möglichkeit, es stattdessen in die Abfrage "Ausstattung" aufzunehmen? Vielleicht mit JOIN in irgendeiner Weise?

+0

zeigen eine Probe von dem, was man aus diesem erhalten erwarten. Es scheint mir, als müssten Sie tatsächlich nachschauen, wie Sie Joins in sql – Takarii

Antwort

1

SQL:

SELECT a.amenity_id, a.amenity_name, a.amenity, coalesce(m.amentiy_text, a.amenity_text) as amenity_text 
    , case when m.h_id is NULL THEN '' ELSE 'checked' END as Checked 
FROM amenities a 
LEFT JOIN amenities_map m on m.amenity_id = a.amenity_id 
WHERE m.h_id = '$h_id' 
ORDER BY amenity_id ASC 

Ich kenne nur ein wenig php, aber der $h_id Wert hier sieht verdächtig es gefährlich anfällig für SQL-Injection-Attacken ist. Stellen Sie sicher, dass Sie vorbereitete Anweisungen dafür verwenden.

PHP:

<?php while ($row_amenities = $amenities->fetch_assoc()) {?> 
<tr> 
    <td><?php echo $row_amenities['amenity_name'] ?></td> 
    <td><input type="checkbox" name="amenity[]" value="<?php echo $row_amenities['amenity'] ?>" <?php echo $row_amenities['Checked'] ?>></td> 
    <td><input name="amenity_text[]" type="text" value="<?php echo $row_amenities['amenity_text'] ?>" disabled> 
     <input type="hidden" name="amenity_id" value="<?php echo $row_amenities['amenity_id'] ?>"></td> 
</tr> 
<?php } ?> 
+0

verwenden. Das ist fantastisch. Ich habe ein wenig Zeit damit verbracht zu verstehen, was du dort gemacht hast, was mir jetzt ein bisschen mehr über mySQL beigebracht hat. Das einzige, was ich tun musste, war die WHERE-Zeile zu entfernen, da dies die Abfrage auf nur die ausgewählten Werte beschränkte. Keine Sorge wegen der SQL-Injection-Schwachstelle: Ich habe versucht, StackOverflow so einfach wie möglich darzustellen. – TrapezeArtist