Avatar billede clausga Nybegynder
06. april 2005 - 09:56 Der er 22 kommentarer

Finde næste ID i tabel ?

Jeg hvordan kan jeg udskrive hvad det næste id vil blive i min tabel ?? MySQl (database) feltnavn hedder kunde !
Avatar billede bromer Nybegynder
06. april 2005 - 09:58 #1
Benyt Pears DB klasse, da den laver nogle sequences.
Avatar billede clausga Nybegynder
06. april 2005 - 09:59 #2
kan du lave et eksempel ?
Avatar billede bromer Nybegynder
06. april 2005 - 10:04 #3
Jeg ved ikke om jeg kan lave så gode eksempler. Det kræver som sagt at du har Pears DB klasse. Du kan hente den på [1]. Klassen understøtter sequences [2] så hvis du giver en sequences samme navn som en tabel så kan du få det næste id ved

$peardbobjectinstance->nextId('tablename');

[1] http://pear.php.net/package/db/redirected
[2] http://pear.php.net/manual/en/package.database.db.intro-sequences.php
Avatar billede detox Nybegynder
06. april 2005 - 10:08 #4
I virkeligheden kan du vel bare tage det højeste id og lægge 1 til.
Avatar billede clausga Nybegynder
06. april 2005 - 10:08 #5
jamen det må da kunne laves et lille eksempel :) det kan da ikke fylde så meget!
Avatar billede detox Nybegynder
06. april 2005 - 10:10 #6
echo mysql_result(mysql_query("SELECT id FROM tabel ORDER BY id DESC LIMIT 1"),0)+1;
Avatar billede bromer Nybegynder
06. april 2005 - 10:15 #7
detox: Det vil været et fint gyldigt id, men det vil ikke nødvendigvis være det _næste_, hvis det højeste id er blevet slettet.
Avatar billede detox Nybegynder
06. april 2005 - 10:16 #8
bromer -> Det er korrekt, det var en tanketorsk!
Avatar billede barklund Nybegynder
06. april 2005 - 10:21 #9
Og der kan altid komme nogle andre indimellem som også får fat på samme højeste id - og så tror begge samtidige tråde, at det id, som de holder, vil være deres kommende id. Derfor er det smartere at gøre omvendt (uden Pear DB) - altså indsætte og bagefter spørge, hvilket id man fik - via mysql_insert_id[1].

[1] http://dk.php.net/mysql_insert_id

--
Morten Barklund
Avatar billede bromer Nybegynder
06. april 2005 - 10:21 #10
detox: ikke nødvendigvis, for clausga har ikke beskrevet, hvad id'et skal bruges til. Det er jo muligt at han bare skal bruge et id som kan indsættes i tabellen uden problemer, men gerne vil vise det til brugeren først. I så fald kan din metode brugers.

clausga: Hvis du netop gerne vil vise et id først anbefaler jeg at du indsætter en tom række og derefter finder id ved mysql_last_inserted_id(). Så kan du senere lave en update mod denne tabel og indsætte data. Grunden til denne - lettere besværlig metode - er at detox's løsning kan skabe problemer, hvis du har to simulante brugere der vil tilføje til tabellen.
Avatar billede bromer Nybegynder
06. april 2005 - 10:23 #11
Nu har jeg så ikke brugt metoderne i et stykke tid, men der var ikke super langt fra mysql_last_inserted_id() til mysql_insert_id() :)
Avatar billede bromer Nybegynder
06. april 2005 - 10:25 #12
simulante er et mærkelig ord
Avatar billede cpfrande Nybegynder
06. april 2005 - 10:36 #13
Hvis du vil have den ud, kan du benytte:

SELECT LAST_INSERT_ID() as lastId FROM tabelNavn;

og så når du gemmer det i et array via php, kan du udskrive med $arrayNavn['lastId'];

Vil dog som bromer siger til sidst, anbefale at du opretter den først i databasen og så updater indholdet ind. Herved slipper du også for, at hvis to brugere sidder på samme side, får samme "næste ID" frem, da de ikke vil få den i sidste ende.

Det har dog sin ulempe, da en evt. bruger, der forlader en formular, har fået oprettet en tom tupel i din database. :-)
Avatar billede bromer Nybegynder
06. april 2005 - 10:37 #14
Problemet med en tom række kan meget let undgås ved at tilføje et felt der indikerer hvorvidt en række er aktiv, og så først markere en række aktiv når man har udført en update mod den.
Avatar billede cpfrande Nybegynder
06. april 2005 - 10:41 #15
Jep, men så skal have et cronjob, der tjekker om f.eks. en ikke-aktiv række efter et bestemt tidsinterval eksisterer, for derefter at slette dem...

Jeg ser det ikke som et problem med hensyn til output på en evt. side, men derimod at slippe for redundante data.
Avatar billede barklund Nybegynder
06. april 2005 - 10:42 #16
SQL-funktionen LAST_INSERT_ID er den samme som C API funktionen mysql_insert_id - sidstnævnte er dog lidt lettere at bruge.
Avatar billede bromer Nybegynder
06. april 2005 - 10:44 #17
Det er for det første ikke redundant data, men derimod bare en mængde tomme rækker. Det er ikke et problem jeg ville opsætte et cronjog til at klare men derimod gøre det manuelt, hvis det blev et problem på det tidspunkt.
Avatar billede cpfrande Nybegynder
06. april 2005 - 10:47 #18
Jep, bortset fra, at SQL-metoden tager forbehold mod BIGINT, gør den anden ikke :-)
Avatar billede sukos Juniormester
06. april 2005 - 10:49 #19
$get_query  = "SHOW TABLE STATUS FROM database LIKE 'table_name'";
$result      = mysql_query($get_query) or die(mysql_error());
$showtable    = mysql_fetch_array($result);

if(isset($showtable["Auto_increment"])) {
echo $showtable["Auto_increment"];
}
Avatar billede cpfrande Nybegynder
06. april 2005 - 10:50 #20
Bromer: Det er redundante data, da det er ens data, der er unødvendige. Det er ikke specielt effektivt, at fylde sin database bare med tomme tubler. Så hellere fastsætte et script til at tømme den for det - men det afhænger også af, hvor ofte systemet benyttes.
Avatar billede clausga Nybegynder
06. april 2005 - 19:29 #21
tak for det mange svar :D fik det til at virke... smid et svar
Avatar billede cpfrande Nybegynder
07. april 2005 - 07:01 #22
Det smider jeg her...
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