Avatar billede freya1000 Nybegynder
21. november 2006 - 13:58 Der er 15 kommentarer og
1 løsning

Insert i 3 forskellige tabellere på een gang

Er det muligt at indsætte i 3 forskellige tabeller på een gang?

Har en formular, som skal gemme de indtastede oplysninger i en database. Den skal gemme det i 3 forskellige tabeller. Den ene er en billedetabel, nummer 2 noget info og den sidste en tabel der kæder infoet og billedet sammen.

Når man trykker på submit kommer man over til filen opret.php, hvor selve indsættelsen skal finde sted, og det er her jeg har brug for hjælp:

Mine 3 tabeller:
1)tabel billede
billed_id (auto_increment)
beskrivelse
filnavn    
filtype       
filindhold

2)tabel info
info_id
info_navn
info_adr

3)tabel har
info_id
billed_id
Avatar billede fsconsult.dk Nybegynder
21. november 2006 - 14:06 #1
Der er intet der i opret.php forhindrer dig i at kalde MySQL 3 gange, for at få lavet de 3 forskellige inserts.

Du kan indkapsle de 3 inserts i en transaktion, hvis det er vigtigt at alle 3 inserts sker samtidigt, eller at der ikke indsættes noget hvis det fejler.  Dette forudsætter dog at du bruger InnoDB tabeller.
Avatar billede freya1000 Nybegynder
21. november 2006 - 14:21 #2
Kan du komme med et eksempel på sådan en transaktion?

Man kan vel ikke bare:

sql = "insert ....";
sql .= " bla bla";

og så koble denne på:

sql .= "and insert ....";
Avatar billede fsconsult.dk Nybegynder
21. november 2006 - 14:31 #3
nej, du skal lave et BEGIN statement til at starte med, og så tilsidst lave et COMMIT statement hvis det skal gemems, eller et ROLLBACK statement hvis ændringerne skal droppes.

Se http://www.devarticles.com/c/a/MySQL/Using-Transactions-with-MySQL-4.0-and-PHP/
Avatar billede freya1000 Nybegynder
21. november 2006 - 14:37 #4
Det er ikke nødvendigt med en transaktion kan jeg se, men jeg vil gerne have et eksempel på hvordan man sætter ind i 3 tabeller ved et kald
Avatar billede fsconsult.dk Nybegynder
21. november 2006 - 14:58 #5
du skal bruge 3 kald til at indsætte i 3 tabeller ...  (medmindre du bruger stored procedures, men det er meget nyt i MySQL)
Avatar billede freya1000 Nybegynder
21. november 2006 - 16:16 #6
Ja den er jeg med på. Har bare et problem. Billed_id og info_id er primær nøgler i de to første tabeller som autogenereres. Deres værdier skal så sættes ind i tabellen har. Hvordan gøres det?

Har prøvet med GET og POST, men det virker ikke:
$sql  = "INSERT INTO har (billed_id, info_id) ";
      $sql .= "VALUES ";
      $sql .= " ('".$_GET['billed_id']."', '".$_GET['info_id']."')";
      $result = mysql_query($sql, $conn);
Avatar billede zynzz Praktikant
21. november 2006 - 16:31 #7
mysql_query("INSERT INTO har (billed_id, info_id) VALUES ('".$_GET['billed_id']."','".$_GET['info_id']."')
")or die(mysql_error());
Avatar billede fsconsult.dk Nybegynder
21. november 2006 - 16:35 #8
efter insert i hhv. billed og info tabellerne, skal du kalde mysql_insert_id for at få det autogenerede id:  http://dk2.php.net/mysql_insert_id
Avatar billede freya1000 Nybegynder
21. november 2006 - 18:02 #9
zynzz: Din gør det samme som min, nemlig ingenting :(

fsconsult.dk: Kan ikke få det til at virke...

Har sat $b_id= mysql_insert_id; og $i_id= mysql_insert_id; ind efter insert og dens værdier, og så:
$sql  = "INSERT INTO har (billed_id, info_id) ";
      $sql .= "VALUES ";
      $sql .= " ('".$b_id."', '".$i_id."')";
      $result = mysql_query($sql, $conn);

Men 'har' forbliver tom
Avatar billede fsconsult.dk Nybegynder
21. november 2006 - 18:19 #10
har du husket () efter?

dvs.  $b_id=mysql_insert_id(); og ikke $b_id=mysql_insert_id;
Avatar billede freya1000 Nybegynder
21. november 2006 - 18:38 #11
Ja, men der sker stadig ikke noget
Avatar billede fsconsult.dk Nybegynder
21. november 2006 - 19:01 #12
du har noget lign:

$sql="INSERT INTO billede (beskrivelse,filnavn) VALUES('x', 'y')";
mysql_query($sql, $conn);
$b_id=mysql_insert_id();
$sql="INSERT INTO info (navn,adr) VALUES('z1', 'z2')";
mysql_query($sql, $conn);
$i_id=mysql_insert_id();
$sql  = "INSERT INTO har (billed_id, info_id) ";
      $sql .= "VALUES ";
      $sql .= " ('".$b_id."', '".$i_id."')";
      $result = mysql_query($sql, $conn);

har du prøvet at tilføje for at se om den finder noget:
echo "b_id=$b_id<br>\ni_id=$i_id<br>\n";
bliver der oprettet noget i billed og info tabellerne?
Avatar billede fsconsult.dk Nybegynder
21. november 2006 - 19:02 #13
prøv evt. at paste de relevante dele af din kode herind, hvis vi skal kunne finde dit problem...
Avatar billede freya1000 Nybegynder
21. november 2006 - 19:26 #14
OK fik det til at virke.
$i_id=mysql_insert_id(); skal stå efter mysql_query($sql, $conn);, hvor $b_id=mysql_insert_id(); ikke behøver????

Og så fandt jeg ud af at jeg brugte zynzz' kode, som der er en syntaks fejl i ;)

Tak for hjælpen, du får alle 100 point selvom det måske er lidt meget
Avatar billede fsconsult.dk Nybegynder
21. november 2006 - 19:32 #15
og ja, mysql_insert_id() skal stå umiddelbart efter mysql_query($sql), da det er fra seneste insert den returnerer værdi
Avatar billede freya1000 Nybegynder
21. november 2006 - 19:39 #16
Bare mærkeligt at den ikke behøver ved billedet
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester