Avatar billede sjh Nybegynder
16. august 2006 - 13:02 Der er 13 kommentarer og
1 løsning

Problemer med LAST_INSERT_ID

Jeg har et lille problem med LAST_INSERT_ID() når jeg bruger den i php så får jeg bare 0 (null) men når jeg så prøver den i en SQL-Editor så virker den fint nok..

  $def_Conn = @mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASS);
  mysql_select_db(MYSQL_BASE, $def_Conn);

  $sqlResult = mysql_query("SELECT LAST_INSERT_ID() AS LastID FROM ehk_email;", $def_Conn);
  echo "Rows: ".mysql_num_rows($sqlResult)."\n";
  $arrRow = mysql_fetch_array($sqlResult);
  print_r($arrRow);

/*
  Rows: 7
  Array
  (
    [0] => 0
    [LastID] => 0
  )
*/
?>

Hvad gør jeg forkert ??
Avatar billede nielle Nybegynder
16. august 2006 - 13:17 #1
Hvorfor bruger du egentlig ikke bare den PHP funktion som gørd det samme?

http://dk.php.net/manual/da/function.mysql-insert-id.php
Avatar billede nielle Nybegynder
16. august 2006 - 13:21 #2
I din kode har du ikke nogen INSERT - funktionen LAST_INSERT_ID() ska kaldes efter et INSERT og returnere det id som der blev trukket ved denne.
Avatar billede sjh Nybegynder
16. august 2006 - 13:32 #3
LÆS lige havd jeg skriver:

..men når jeg så prøver den i en SQL-Editor så virker den fint nok..

hvordan kan jeg så det??
Avatar billede sjh Nybegynder
16. august 2006 - 13:33 #4
og jeg har også prøvet function.mysql-insert-id.php den giver også 0 (null)
Avatar billede nielle Nybegynder
16. august 2006 - 13:53 #5
Så-så, vi kan vel godt holde en sober tone?

Du kan ikke forvente at få noget fornuftigt ud af LAST_INSERT_ID() før at der har været en INSERT tidligere i forløbet:

Pointen med LAST_INSERT_ID() er bl.a. at den holder styr på den session man arbejder i. Dette sikre at den er holdbar over for den situation hvor to forskellige brugere er i færd med at bruge dit PHP-script på samme tid: For dem vil LAST_INSERT_ID() så returnere det id som netop deres INSERT trak, og der vil ikke blive problemer med at de to kørsler af skriptet kommer til at blande deres id'er sammen. Det er bl.a. derfor at man bør bruge LAST_INSERT_ID() istedet for at lede efter det højeste id vha. MAX()).

Netop det at det hænger sammen med den session som du køre, kan forklare at du oplever at det virker i din SQL-editor. Editoren holder sin egen session gående, og dette betyder at hvis du på et tidligere tidspunkt (efter at du startede editoren op sidst), har indsat noget i tabellen - ja så får du id'et fra denne INSERT.
Avatar billede nielle Nybegynder
16. august 2006 - 13:54 #6
Ja, mysql-insert-id.php giver det samme resultat som LAST_INSERT_ID() - den er nemlig blot en pæn inpakning af samme. Pointen var no også mere at det gav dig en simplere PHP-kode, men noget færre linjer kode.
Avatar billede sjh Nybegynder
16. august 2006 - 13:57 #7
Har fået det til at virke.. skulle bare fyer den her af først : SHOW TABLE STATUS FROM


<?php
  $def_Conn = @mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASS);
  mysql_select_db(MYSQL_BASE, $def_Conn);

  if (mysql_query("SHOW TABLE STATUS FROM ".MYSQL_BASE.";")) {

    $sqlResult = mysql_query("SELECT LAST_INSERT_ID() AS LastID FROM ehk_email;", $def_Conn);
    echo "Rows: ".mysql_num_rows($sqlResult)."\n";
    $arrRow = mysql_fetch_array($sqlResult);
    print_r($arrRow);

  }
/*
  Rows: 7
  Array
  (
    [0] => 6074
    [LastID] => 6074
  )
*/
?>

Smid et svar
Avatar billede sjh Nybegynder
16. august 2006 - 14:01 #8
Ja nu er det jo ikke givet at MAX(id) er det største.. hvis du sletter nogle af de sidste idér vil du ikke få LAST_INSERT_ID.. MAX(id) viser kun dem som er i din table.. ;)
Avatar billede nielle Nybegynder
16. august 2006 - 14:06 #9
Det er en anden god grund. :^)

Men den med de samtidige brugere er nu ret vigtig.

At din kode i 16/08-2006 13:57:40 skulle virke korrekt, følger ikke af MySQL's egen dokumentation. Men det kan jo sagtens være en af de der udokumenterede features.

Læs iøvrigt MySQL's egne ord om mysql_insert_id() her:

http://mysql.com/doc/refman/5.0/en/mysql-insert-id.html


Jeg tror nu at jeg springer over point på denne her. :^)
Avatar billede sjh Nybegynder
16. august 2006 - 14:18 #10
SHOW TABLE STATUS FROM skulle virke...

  // http://doc.domainepublic.net/mysql/doc.mysql/show-table-status.html
  $sqlResult = mysql_query("SHOW TABLE STATUS FROM ".MYSQL_BASE.";");
  if ($sqlResult)
    echo mysql_result($sqlResult, 0, 10); // Auto_increment = (nummer 10)
  }
Avatar billede sjh Nybegynder
16. august 2006 - 15:10 #11
Når nu er den sq som den skal være..

  // Brug LIKE 'tablename' ellers vælger den bare den sidste brugt table.
  $sqlResult = mysql_query("SHOW TABLE STATUS FROM ".MYSQL_BASE." LIKE 'ehk_email';");
  if ($sqlResult) {
    // Auto_increment = (nummer 10) (-1 er fordi Auto_increment er det næste ID)
    echo mysql_result($sqlResult, 0, 10) -1;
  }
Avatar billede nielle Nybegynder
16. august 2006 - 15:17 #12
Jeg ville nu stole meget mere på det, hvis jeg kunne finde det dokumenteret på MySQL'se egen hjemmeside :^)
Avatar billede ksoren Nybegynder
16. august 2006 - 15:22 #13
Den løsning går nok også ret hurtigt i stykker, hvis der er mere end een bruger på sitet
Avatar billede sjh Nybegynder
16. august 2006 - 15:33 #14
Ja man skal selfølige bruge mysql_insert_id() hvis det er noget som skal bruges i forbindelse med INSERT INTRO...

men jeg skal bruge det til at vise noget statik.. så betyder det ikke så meget.. dog skal den ikke vise 0 (null) :D
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