2010-03-06 7 views
0

Je construis une base de données pour faire des réservations d'hôtel. Une table appelée «réservations» contient les détails généraux de la réservation, tandis qu'une autre appelée «chambres» contient des détails sur des chambres spécifiques (chaque réservation a plusieurs chambres, chaque chambre appartient à une seule réservation). Je voudrais être capable de générer facilement des enregistrements de réservations en double (à l'exception de la clé primaire, bien sûr). Mon problème est de générer les données des pièces sous forme de tableau qui est ensuite inséré dans la table des pièces tout en étant associé à sa réservation. Je suis venu aussi loin que le code trivial suivant (dépouillé à l'essentiel pour des fins de discussion).php/mysql créer des enregistrements en double avec plusieurs tables

if (isset($_POST['action']) and $_POST['action'] == 'Duplicate') 
{ 
    include $_SERVER['DOCUMENT_ROOT'] . '/includes/connect.inc.php'; 
    $id = mysqli_real_escape_string($link, $_POST['id']); 

// retrieve reservation 
$sql = "SELECT type_of_reservation FROM reservations WHERE id='$id'"; 
$result = mysqli_query($link, $sql); 
$row = mysqli_fetch_array($result); 
$type_of_reservation = $row['type_of_reservation']; 
// create new reservation record 
$sql = "INSERT INTO reservations SET type_of_reservation ='$type_of_reservation'"; 
$id = mysqli_insert_id($link); 

// retrieve rooms 
$sql = "SELECT reservation_id, in_date FROM rooms WHERE reservation_id='$id'"; 
$result = mysqli_query($link, $sql); 
while ($row = mysqli_fetch_array($result)) 
{ 
    $rooms[] = array('reservation_id' => $row['reservation_id'], 'in_date' => $row['in_date']); 
} 

La grande question est, maintenant quoi? Tout ce que j'ai essayé génère une erreur ou pas de nouvelles entrées, et je n'arrive pas à trouver une discussion qui répond à ce besoin spécifique. Merci de votre aide.

Répondre

1

PeterC, il n'y a pas code indiqué que vous montre l'insertion des informations d'enregistrement ROOM. Dans la section // Retrieve Room de votre code, vous extrayez les données et vous les placez dans un tableau. Si vous voulez vraiment créer des enregistrements en double, j'utiliserais dans insert dans la base de données, alors vous n'avez pas à sortir les enregistrements juste pour les remettre en place.

Le bit de code que vous voulez sera quelque chose comme ça. Il sera en place du code de chambres // récupérer vous avez indiqué: (code psuedo) [Note: $ id représente l'ID nouvellement sélectionné de votre insert sql pour la réservation en double]

INSERT INTO rooms (res_id, other , data) SELECT $ id, other, data DE rooms O WH id = $ _POST ['id']; Cela vous permettra de dupliquer les données de la salle, en ajoutant le nouveau droit de réservation à l'intérieur de la base de données. Pas besoin de retirer les enregistrements, créer des inserts, puis les remettre. Vous pouvez en savoir plus sur les instructions INSERT INTO ... SELECT ici: http://dev.mysql.com/doc/refman/5.0/en/ansi-diff-select-into-table.html

+0

Merci beaucoup! L'instruction INSERT INTO ... SELECT est évidemment quelque chose dont je dois me renseigner! Je veux bien essayer. – PeterC

1
// create new reservation record 
    $sql = "INSERT INTO reservations SET type_of_reservation ='$type_of_reservation'"; 
     //ADD HERE CODE BELOW 
    $id = mysqli_insert_id($link); 

avec mysql_insert_id vous obtenez l'identifiant inseted, mais vous devez l'insérer dans db .. il faut donc ajouter

mysqli_query($link, $sql);

avant que les données

récupération
+0

Merci, mais ce fut une chose que j'avais dépouillé du code ci-dessus à des fins de discussion - il est dans la vérification d'erreur du code réel . – PeterC

+0

J'ai essayé d'utiliser foreach() mais je n'arrive pas à trouver la bonne syntaxe: par ex. foreach ($ rooms as $ room => $ reservation_id) renvoie une erreur ... – PeterC

1

Si vous avez simplement besoin de dupliquer des enregistrements, vous pouvez le faire chemin:

INSERT INTO 
    reservations 
    (
    SELECT 
     null, # assume first column is auto incrementing primary key, so leave null 
     `all`, 
     `other`, 
     `column`, 
     `names` 
    FROM 
     reservations 
    WHERE 
     reservation_id = $oldReservationId # id of reservation to duplicate 
    ) 

Ensuite, pour les chambres utilisent le dernier id inséré (par exemple récupéré avec mysql_insert_id), comme ceci:

INSERT INTO 
    rooms 
    (
     SELECT 
      null, # assume first column is auto incrementing primary key, so leave null 
      $newReservationId, # this is the new reservation id 
      `all`, 
      `other`, 
      `column`, 
      `names` 
     FROM 
      rooms 
     WHERE 
      reservation_id = $oldReservationId # id of reservation to duplicate 
    ) 
+0

Merci beaucoup - je vais essayer. – PeterC

Questions connexes