Avatar billede jakobdo Ekspert
11. oktober 2004 - 09:17 Der er 14 kommentarer og
1 løsning

Smart måde at indsætte i database, hvis den ikke allerede er der.

Hej,
jeg er ved at lave en side med noget XML-feed.
Og i den xml har jeg nogle værdier, hvis de ikke findes i databasen, skal de indsættes.
Hvordan laver jeg dette lettest?

XML indholder oftest omkring 20-30 items.

Så er det lettest at lave SELECT item FROM database WHERE navn = $navn;
if ($fundet)
  INSERT INTO blabla...

Eller er der en smartere måde?
Avatar billede stois Nybegynder
11. oktober 2004 - 10:30 #1
Hmm... jeg er ikke god til XML, men burde du ikke skrive et XML spørgsmål i XML katagorien?

// no offence :-)
Avatar billede jakobdo Ekspert
11. oktober 2004 - 10:56 #2
Hvis du læser videre, så ser du SQL sætninger, så måske jo!

Men jeg koder selve siden i PHP, og min database er MYSQL og feedet er XML, så der kan vel godt godkendes her i PHP.
Avatar billede stois Nybegynder
11. oktober 2004 - 11:33 #3
Sorry, som sagt no offence...

og jeg aner ikke en hat om XML, så jeg holder bare min kæft nu ;-)
Avatar billede jakoba Nybegynder
11. oktober 2004 - 12:14 #4
det er indbygget i mysql (og næsten alle andre SQL varianter)

  INSERT INTO tabelnavn IGNORE
  blabla ...

fra: http://dev.mysql.com/doc/mysql/en/INSERT.html
"If you specify the IGNORE keyword in an INSERT with many rows, any rows that duplicate an existing UNIQUE index or PRIMARY KEY value in the table are ignored and are not inserted. If you do not specify IGNORE, the insert is aborted if there is any row that duplicates an existing key value. You can determine with the mysql_info() C API function how many rows were inserted into the table."

du skal dog huske at erklære de felter der ikke må være dubletter af som UNIQUE idet du opretter tabellen.

mvh JakobA
Avatar billede jakobdo Ekspert
11. oktober 2004 - 14:32 #5
Ok, når jeg bruger SQL:

INSERT IGNORE INTO table (unique,felt1,felt2) VALUES ('1','Test1','Test2'),('2','Test1','Test2'),('3','Test1','Test2'),('4','Test1','Test2'),('2','Test1','Test2'),('4','Test1','Test2')

Altså så bør den inserte 4 rækker, men 2 af dem bør ikke sættes ind.
Hvordan får jeg de rækker som ikke sættes ind?
Avatar billede jakoba Nybegynder
11. oktober 2004 - 15:49 #6
jeg forstår ikke. jeg troede du ville smide væk dem der ikke skal sættes ind.

prøv at forklare noget mere.
Avatar billede jakoba Nybegynder
11. oktober 2004 - 15:52 #7
PS pas på med at give et felt navnet 'unique' eller et andet navn der samtidig har en specifik betydning i SQL
Avatar billede jakobdo Ekspert
11. oktober 2004 - 16:18 #8
Jeg vil gerne have de rækker som ikke sættes ind også!
unique brugte jeg bare for at vise hvad jeg mente...

Jeg har nu lavet det på følgende måde:

insert ignore into value (bla),(bla1),(bla2)
Og så trækker jeg alle data ud igen...
Avatar billede coderdk Praktikant
11. oktober 2004 - 16:53 #9
Indsæt dem én ad gangen, og check på mysql_affected_rows() hvilke der bliver sat ind.
Avatar billede jakoba Nybegynder
11. oktober 2004 - 16:58 #10
hvor vil du have dem?, hvornår vil du have dem?, i hvilken form vil du have dem? hvorfor vil du have dem?
(er du jakobdo's lillebror der har lånt hans brugernavn?)
Avatar billede jakobdo Ekspert
11. oktober 2004 - 19:01 #11
Hvad mener du med: (er du jakobdo's lillebror der har lånt hans brugernavn?)
Jeg skulle gerne være mig selv, og ingen anden!

Jeg har en database, hvor nogle items vil være...
Så feeder jeg den med nye items, nogle er der måske allerede, andre er ikke...
Jeg vil så have en liste, hvor dem som allerede var i databasen, markeres sådan, dem som er nye markeres sådan!

Og hvad jeg sådan nærmere skal bruge det til, må jeg ikke sige, så bliver jeg nød til at slå jer ihjel! :o)
Avatar billede jakoba Nybegynder
11. oktober 2004 - 20:16 #12
OK, jeg troede du snakkede om at få fat i dem der IKKE blev indsat.

Hvis du har et id-felt der autoincrementerer for hver insert kan du bruge funktionen mysql_insert_id()
  http://dk.php.net/manual/en/function.mysql-insert-id.php
i situationen hvor du lige har insertet flere rækker vil den give dig id nummeret på den første af dem, så:
$sql_kommando = "
    SELECT *
    FROM tabelNavn
    WHERE id >= " .mysql_insert_id();

vil hente de rækker der lige er blevet indsat.

mvh JakobA
Avatar billede jakobdo Ekspert
11. oktober 2004 - 21:09 #13
Jeg takker for jeres forslag, men har valgt følgende måde:

INSERT IGNORE INTO table....
SELECT * FROM table WHERE bla = 1 OR bla = 2, osv...

Men Jakoba, smid et svar...
Avatar billede jakobdo Ekspert
08. december 2004 - 09:11 #14
Skal Jakoba have pointene?
Avatar billede jakoba Nybegynder
08. december 2004 - 09:19 #15
sorry.
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
Vi tilbyder markedets bedste kurser inden for webudvikling

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