2008-11-25 6 views
1

Je suis bloqué pour essayer de résoudre ce problème pendant quelques jours. J'ai même abandonné pendant un moment, et depuis que je suis un débutant PHP, j'ai besoin d'aide.Aide sur la requête SQL

Ceci est mon problème: J'ai une requête qui sélectionne tous les enregistrements appropriés dans un tableau « hôtels » et pour chaque hôtel cherche chambre réservée de certains types dans le tableau « de booked_rooms » et tout cela pendant une certaine période. Donc d'abord, je retire tous les hotel_ids de 'hotel_table', en fonction de l'emplacement fourni par le formulaire de recherche, et pour chaque hotel_id, je parcours la table 'reserved_rooms'.

Voici le code:

if(isset($_GET['book'])){ 
$sql=mysql_query("SELECT hotel_id FROM 'hotels' WHERE city='$city") or die(mysql_error()); 
while($row=mysql_fetch_array($sql)){ 
    $sql_2=mysql_query("SELECT * FROM `booked_rooms` WHERE hotel_id='$hotel_id' 
    AND arrival_date BETWEEN '$arrival_date' AND '$departure_date' 
    OR departure_date BETWEEN '$arrival_date' AND '$departure_date'") 
or die(mysql_error()); 
} 

while($row_2=mysql_fetch_array($sql_2)){ 
    print_r($row_2); 
} 

} 
// $city, $arrival_date and $departure date are values retrieved from the search form 

Le problème est que je reçois une boucle à travers la table « hôtel » et obtenir toutes les hotel_ids appropriés à l'emplacement, mais ai rien avec l'impression du tableau de row_2 de $. J'ai essayé d'utiliser JOINS dans la boucle SQL foreach, mais pas de chance non plus. Je sais que c'est une question triviale, mais je continue d'apprendre, donc tout conseil est très bien accueilli. Merci d'avance.

Répondre

5

Ne connaissant pas PHP, pouvez-vous le faire en une seule requête?

SELECT booked_rooms.*, hotels.* FROM 'hotels' 
JOIN 'booked_rooms' ON hotels.hotel_id = booked_rooms.hotel_id 
WHERE 
    hotels.city='$city" AND 
    (
    booked_rooms.arrival_date BETWEEN '$arrival_date' AND '$departure_date' OR 
    booked_rooms.departure_date BETWEEN '$arrival_date' AND '$departure_date') 

Cochez la case « » entre guillemets vos tables que nécessaires pour les chaînes PHP etc ...

1

Tout d'abord, vous avez une erreur dans votre premier SQL que vous ne l'avez pas cité votre cityname correctement. Ensuite, vous ne récupérez pas le hotel_id hors du jeu de résultats. Et puis vous avez la deuxième boucle au mauvais endroit.

les opérations suivantes:

if(isset($_GET['book'])) { 
    $sql = mysql_query("SELECT hotel_id FROM 'hotels' WHERE city='".mysql_real_escape_string($city)."'") or die(mysql_error()); 

    $arrival_date = mysql_real_escape_string($arrival_date); 
    $departure_date = mysql_real_escape_string($departure_date); 
    while($row = mysql_fetch_assoc($sql)) { 
     $hotel_id = $row['hotel_id']; 
     $sql_2 = mysql_query("SELECT * 
      FROM `booked_rooms` 
      WHERE hotel_id = ".$hotel_id." 
       AND (
        arrival_date BETWEEN '".$arrival_date."' AND '".$departure_date."' 
        OR departure_date BETWEEN '".$arrival_date."' AND '".$departure_date."' 
       )") 
     or die(mysql_error()); 

     while($row_2 = mysql_fetch_assoc($sql_2)) { 
      print_r($row_2); 
     } 
    } 

} 

// $city, $arrival_date and $departure date are values retrieved from the search form 

Je vous recommande également d'être plus généreux dans votre espace. Cela rend le PHP plus facile à lire.

+0

Vous n'avez pas besoin de parenthèses autour de la deuxième section de votre clause where? Sinon, la préséance de ces prédicats n'est pas claire ...? – Codewerks

+0

Dang. Oui tu as raison. Je voulais ajouter ceux-ci, mais j'ai été distrait. C'est réparé. – staticsan

1

Veuillez ne pas mettre les requêtes SQL de génération depuis l'extérieur, les données non fiables. C'est le problème des tables Bobby.

Veuillez voir une page comme this one pour plus de détails sur l'utilisation des instructions paramétrées.

+0

Ce lien semble être obsolète - est maintenant à http://en.wikibooks.org/wiki/PHP_Programming/SQL_Injection#Use_Parameterized_Statements par le look de celui-ci –