Avatar billede klgn Nybegynder
21. april 2002 - 12:01 Der er 54 kommentarer og
1 løsning

Syntaks ved brug af last_insert_id

Hejsa!!

Hvordan er syntaks, når jeg opdaterer mysql vha. last_insert_id

Jeg har prøvet:
mysql_query("UPDATE nyheder set billede = '$billede_name' WHERE id = last_insert_id()") or die(mysql_error());

Men der bliver ikke tilføjet noget til databasen

/klgn
Avatar billede limemedia Nybegynder
21. april 2002 - 12:03 #1
... en anden sql der udføre en insert ...

$lastid = last_insert_id();
mysql_query("UPDATE nyheder set billede = '$billede_name' WHERE id = '$lastid'") or die(mysql_error());
Avatar billede erikjacobsen Ekspert
21. april 2002 - 12:04 #2
Det ser rigtigt ud. Men gør du det umiddelbart efter en INSERT?

tag også lige at

  mysql_query(....) or die(mysql_error());

så du kan se om der er fejl
Avatar billede tipsen Nybegynder
21. april 2002 - 12:04 #3
Der findes følgende funktion som du måske kan bruge:

int mysql_insert_id ( [resource link_identifier])
Avatar billede erikjacobsen Ekspert
21. april 2002 - 12:05 #4
"tilføjet noget til databasen" .... skal du tilføje skal du da ikke bruge en UPDATE ??
Avatar billede erikjacobsen Ekspert
21. april 2002 - 12:05 #5
ljweb/tipsen: man behøver jo ikke bruge PHP-funktionen, når der findes
en udmærket i SQL.
Avatar billede tipsen Nybegynder
21. april 2002 - 12:05 #6
Er last_insert_id() en mysql funktion!?
Avatar billede tipsen Nybegynder
21. april 2002 - 12:06 #7
OK - jeg klapper bare i :-)
Avatar billede klgn Nybegynder
21. april 2002 - 12:06 #8
min fejl - jeg skal opdatere min database

/klgn
Avatar billede erikjacobsen Ekspert
21. april 2002 - 12:07 #9
Man kan jo altid lære noget nyt, tipsen :)
Avatar billede erikjacobsen Ekspert
21. april 2002 - 12:08 #10
klgn: Du skal altså bruge UPDATE forstår jeg. Men er der et felt med
pågældende id?
Avatar billede klgn Nybegynder
21. april 2002 - 12:09 #11
ja, jeg skal indsætte under en eksisterende id og det skal være den senest oprettede...
Avatar billede erikjacobsen Ekspert
21. april 2002 - 12:10 #12
Så virker det også .... kommer der en fejl med die?

Og har du lavet en INSERT umiddelbart før?
Avatar billede klgn Nybegynder
21. april 2002 - 12:11 #13
jeg kan lige poste scriptet, hvis det er...
Avatar billede erikjacobsen Ekspert
21. april 2002 - 12:11 #14
ja tak
Avatar billede klgn Nybegynder
21. april 2002 - 12:12 #15
Her it is
<?

  require("n-include.php");
  require("../../mysql-funktioner.php");

  aabn_forbindelse_og_vaelgdb();

  if ($d && $m && $y && $overskrift && $tekst && $forfatter) {

      $dato      = addslashes("$y-$m-$d");
      $overskrift = addslashes($overskrift);
      $tekst      = addslashes($tekst);
      $id        = addslashes($id);
      $forfatter  = addslashes($forfatter);

      if ($id) {
        mysql_query("UPDATE nyheder SET dato = '$dato', overskrift = '$overskrift', tekst = '$tekst', forfatter = '$forfatter' WHERE id = '$id'") or die(mysql_error());
      }

      else {
        mysql_query("INSERT INTO nyheder (dato, overskrift, tekst, forfatter) VALUES ('$dato', '$overskrift', '$tekst', '$forfatter')") or die(mysql_error());
      }

      }
     
  ?>
 
 

<HTML>
<HEAD>
<TITLE>Admin til nyheder part 2 (tilføj billede)</TITLE>
</HEAD>
<BODY>
<H1>Dette er teksten:</H1>

<?
  $result = mysql_query("SELECT id, overskrift, tekst, forfatter, billede, DATE_FORMAT(dato, '%d-%m-%Y') AS formateretdato FROM nyheder order by id desc limit 1") or die(mysql_error());
 
 

            print "<table cellspacing=\"0\" cellpadding=\"2\">\n";

            while ($row = mysql_fetch_array($result)) {

                $bgcolor = $a++ % 2 ? '#DEDEDE' : '#F0F0F0';

                $row[overskrift] = htmlentities(stripslashes($row[overskrift]));
                $row[tekst]      = htmlentities(stripslashes($row[tekst]));
                list($d, $m, $y) = explode('-', $row[formateretdato]);

                $new_date = month($m)." $y";

               

                print "<tr>";
        print "    <tr><td bgcolor=\"$bgcolor\">Dato: $d/$m-$y</td></tr>";
        print "    <tr><td bgcolor=\"$bgcolor\">Overskrift: $overskrift</td></tr>";
        print "    <tr><td bgcolor=\"$bgcolor\">Tekst: $tekst</td></tr>";
        print "    <tr><td bgcolor=\"$bgcolor\">Forfatter: $forfatter</td></tr>";
        print "</tr>\n";

                $old_date = $new_date;

            }

          print "</table>\n";

        if(isset($billede))
    {
    $desti="../../billeder/";// stien hvor filen skal gemmes
    $desti.=$billede_name;
    if (copy($billede,$desti)) {
        print "Billede tilføjet";
      echo mysql_query("UPDATE nyheder set billede = '$billede_name' WHERE id = $lastid") or die(mysql_error());
    }

    else {
        print "Der skete en fejl, billede ikke tilføjet";
    }
    unlink($billede);
   
    }
?>
<H1>Tilføj billede til teksten</H1>

<FORM ENCTYPE="multipart/form-data" ACTION="add_picture.php" METHOD="post">
<INPUT TYPE="hidden" name="MAX_FILE_SIZE" value="102400">
<INPUT NAME="billede" TYPE="file">
<INPUT TYPE="submit" VALUE="Tilføj billede">
</FORM>

</BODY>
</HTML>
Avatar billede klgn Nybegynder
21. april 2002 - 12:14 #16
i stedet for $lastid skulle der stå: last_insert_id
Avatar billede erikjacobsen Ekspert
21. april 2002 - 12:15 #17
Du kan ikke gøre det af to omgange. Det skal ske umiddelbart efter din
INSERT. Jeg læser ovenstående som at du først indsætter et nyhed,
og så i en ny form vælger et billede. Er det korrekt?

Vi kan sagtens fixe det, hvis det er det...
Avatar billede klgn Nybegynder
21. april 2002 - 12:15 #18
ja, det er korrekt forstået...
Avatar billede erikjacobsen Ekspert
21. april 2002 - 12:18 #19
Nede i billedformen laver du så et

<INPUT TYPE="hidden" name="billedid" value="<?= last_insert_id()?>">

og bruger $billedid til din update.
Avatar billede klgn Nybegynder
21. april 2002 - 12:23 #20
Jeg får en fejlmeddelse:
Fatal error: Call to undefined function: last_insert_id() in c:\apache\htdocs\ntk\admin\nyheder\add_picture.php on line 89
Avatar billede erikjacobsen Ekspert
21. april 2002 - 12:26 #21
Nå ja  mysql_insert_id()
Avatar billede klgn Nybegynder
21. april 2002 - 12:27 #22
Billedet bliver fint uploadet, men det bliver ikke tilføjet i databasen
Avatar billede klgn Nybegynder
21. april 2002 - 12:29 #23
værdien af billedid er også tom...
Avatar billede erikjacobsen Ekspert
21. april 2002 - 12:29 #24
Står der en fornuftig værdi i formen (vis kilde) ?
Avatar billede klgn Nybegynder
21. april 2002 - 12:34 #25
næh, der står ingenting (den er tom)
Avatar billede klgn Nybegynder
21. april 2002 - 12:48 #26
det er underligt. Jeg har sat den til at gemme billedid lige efter, der er blevet indsat - og jeg kan også printe den rigtige værdi ud - men jeg kanh ikke opdatere under den id...
Avatar billede jakoba Nybegynder
21. april 2002 - 12:59 #27
Hvad med at sige

$res = mysql_query("SELECT MAX(id) as mx FROM tabelnavn") or die( mysql_error() );
if ( $row = mysql_fetch_array($res) ) {
    $maxid = $row[mx];
} else {
    $maxid = 0;
}

Den skulle da give den største brugte id-værdi i databasen uafhængingt af om der er blevet indsat noget lige før eller ikke.

mvh JakobA
Avatar billede klgn Nybegynder
21. april 2002 - 13:06 #28
Jeps - det virker satme, JakobA

Post et svar - og der er points!!

/klgn
Avatar billede erikjacobsen Ekspert
21. april 2002 - 13:53 #29
man skal ikke - aldrig - bruge max til at finde den sidste id.

Er der to der opdaterer samtidigt kommer der en fejl.
Avatar billede eeyore Nybegynder
22. april 2002 - 05:38 #30
erikjacobsen > er det egentlig ikke det samme problem med last_insert_id() ?
Avatar billede erikjacobsen Ekspert
22. april 2002 - 07:21 #31
Nej, med last_insert_id() / mysql_insert_id() registreres den
autonummererede id pr. connection. Dermed er den sikker.
Så min anbefaling er klart at finde ud af i ovenstående kode hvordan
man holder styr på den. Det kan ikke være så svært. Men ok, hvis
spørgeren er tilfreds - fx hvis han er den eneste der bruger
systemet - så er det jo godt nok.
Avatar billede klgn Nybegynder
22. april 2002 - 18:06 #32
øøh, jeg er selvfølgelig interesseret i den mest sikre løsning. Jeg konstaterede blot, at JakobAs løsning fungede, hvilket ikke var tilfældet med last_insert_id() eller mysql_insert_id

Hvis nogle har bud på, hvordan disse kan implementeres tilfredsstillende i koden er jeg lydhør
Avatar billede eeyore Nybegynder
22. april 2002 - 18:10 #33
erikjacobsen > kan samtidige requests ikke bruge hinandens connection? Hmm... nu burde jeg jo nok oprette et spørgsmål selv, for det er noget jeg har tænkt lidt over... men hvis du lige vidste det, kunne det jo være rart at vide....
Avatar billede erikjacobsen Ekspert
22. april 2002 - 18:31 #34
Du siger jo mysql_connect på hver side og hver af disse har deres styr på det her.

Ellers var der jo ikke noget der virkede.... Men pas på hvis du bruger tråde, der deles
om en connection
Avatar billede eeyore Nybegynder
22. april 2002 - 18:35 #35
grunden til, at jeg tvivlede lidt var, at MySQL jo ikke håndterer transaktioner, og en sådan opførsel for last_insert_id() ville jo være noget der lignede en transaktion....

Men nok om det, jeg vælger at tro på dig *s*
Avatar billede erikjacobsen Ekspert
22. april 2002 - 18:35 #36
klgn: Jo, du skal jo holde styr på hvor de oplysninger du har brug for kommer fra.
Hvorfor oploader man ikke billeder med det samme? Kan det ikke gøres samtidigt
skal du så blot finde ud af hvor den tomme værdi, du så før kommer fra.

he he, ja altså hvorfor den er tom...
Avatar billede erikjacobsen Ekspert
22. april 2002 - 18:38 #37
Nej, det er ikke en transaktion, Enhver "INSERT" er atomisk, og den skal bare
aflevere værdien. Bliver det mere kompliceret hedder det transaktioner!
Avatar billede klgn Nybegynder
22. april 2002 - 18:49 #38
erikjacobsen-> ja, det ku jeg godt have sagt mig selv... Problemet er blot, at mit kendskab til disse funktioner er ret begræsent - for ikke at sige ikke-eksisterende.
Jeg har virkelig kigge på koden - og jeg kan ikke finde ud af, hvordan den værdi pludselig skal blive nullet - især ikke når jeg beder mysql_insert_id() ind lige efter insert into...

Jeg savner noget konkret...
Avatar billede erikjacobsen Ekspert
22. april 2002 - 18:50 #39
Og det samme gør vi :) Det er svært at sige hvad der er galt når vi ikke kan se din kode ...
Avatar billede klgn Nybegynder
22. april 2002 - 18:51 #40
den er sgu da postet længere oppe
Avatar billede klgn Nybegynder
22. april 2002 - 19:14 #41
men den kommer da bare her igen...

  if ($d && $m && $y && $overskrift && $tekst && $forfatter) {

      $dato      = addslashes("$y-$m-$d");
      $overskrift = addslashes($overskrift);
      $tekst      = addslashes($tekst);
      $id        = addslashes($id);
      $forfatter  = addslashes($forfatter);

      if ($id) {
        mysql_query("UPDATE nyheder SET dato = '$dato', overskrift = '$overskrift', tekst = '$tekst', forfatter = '$forfatter' WHERE id = '$id'") or die(mysql_error());
      }

      else {
        mysql_query("INSERT INTO nyheder (dato, overskrift, tekst, forfatter) VALUES ('$dato', '$overskrift', '$tekst', '$forfatter')") or die(mysql_error());
     
        $maxid=mysql_last_insert();
      }

      }
     
  ?>
 
 

<HTML>
<HEAD>
<TITLE>Admin til nyheder part 2 (tilføj billede)</TITLE>
</HEAD>
<BODY>
<H1>Dette er teksten:</H1>

<?
 
  $result = mysql_query("SELECT id, overskrift, tekst, forfatter, billede, DATE_FORMAT(dato, '%d-%m-%Y') AS formateretdato FROM nyheder order by id desc limit 1") or die(mysql_error());
 
 

            print "<table cellspacing=\"0\" cellpadding=\"2\">\n";

            while ($row = mysql_fetch_array($result)) {

                $bgcolor = $a++ % 2 ? '#DEDEDE' : '#F0F0F0';

                $row[overskrift] = htmlentities(stripslashes($row[overskrift]));
                $row[tekst]      = htmlentities(stripslashes($row[tekst]));
                list($d, $m, $y) = explode('-', $row[formateretdato]);

                $new_date = month($m)." $y";

               

                print "<tr>";
        print "    <tr><td bgcolor=\"$bgcolor\">Dato: $d/$m-$y</td></tr>";
        print "    <tr><td bgcolor=\"$bgcolor\">Overskrift: $overskrift</td></tr>";
        print "    <tr><td bgcolor=\"$bgcolor\">Tekst: $tekst</td></tr>";
        print "    <tr><td bgcolor=\"$bgcolor\">Forfatter: $forfatter</td></tr>";
       
        print "</tr>\n";

                $old_date = $new_date;

            }

          print "</table>\n";

        if(isset($billede))
    {
    $desti="../../billeder/";// stien hvor filen skal gemmes
    $desti.=$billede_name;
    if (copy($billede,$desti)) {
        print "Billede tilføjet";
      echo mysql_query("UPDATE nyheder set billede = '$billede_name' WHERE id = '$maxid'") or die(mysql_error());
   
    }

    else {
        print "Der skete en fejl, billede ikke tilføjet";
    }
    unlink($billede);
   
    }
?>
<H1>Tilføj billede til teksten</H1>

<FORM ENCTYPE="multipart/form-data" ACTION="add_picture.php" METHOD="post">
<INPUT TYPE="hidden" name="MAX_FILE_SIZE" value="102400">
<INPUT NAME="billede" TYPE="file">
<INPUT TYPE="submit" VALUE="Tilføj billede">
</FORM>
</BODY>
</HTML>
Avatar billede erikjacobsen Ekspert
22. april 2002 - 20:01 #42
Du har jo ikke gjort som jeg skrev i

  Kommentar fra erikjacobsen 
  21/04-2002 12:18:35
Avatar billede klgn Nybegynder
23. april 2002 - 17:25 #43
well, hvis du læser mine svar til dit pågældende indlæg, så er det pårøvet uden held...

Det virker ikke
Avatar billede erikjacobsen Ekspert
23. april 2002 - 17:27 #44
Og der er det jeg bliver "sur". Du viser os ikke hvad du har prøvet,
og udelukker dermed at vi kan finde fejlen for dig.
Avatar billede klgn Nybegynder
23. april 2002 - 18:17 #45
Alright - godt ord igen!!

Her er det, jeg har prøvet - uden held...

  if ($d && $m && $y && $overskrift && $tekst && $forfatter) {

      $dato      = addslashes("$y-$m-$d");
      $overskrift = addslashes($overskrift);
      $tekst      = addslashes($tekst);
      $id        = addslashes($id);
      $forfatter  = addslashes($forfatter);

      if ($id) {
        mysql_query("UPDATE nyheder SET dato = '$dato', overskrift = '$overskrift', tekst = '$tekst', forfatter = '$forfatter' WHERE id = '$id'") or die(mysql_error());
      }

      else {
        mysql_query("INSERT INTO nyheder (dato, overskrift, tekst, forfatter) VALUES ('$dato', '$overskrift', '$tekst', '$forfatter')") or die(mysql_error());
     
      }

      }
     
  ?>
 
 

<HTML>
<HEAD>
<TITLE>Admin til nyheder part 2 (tilføj billede)</TITLE>
</HEAD>
<BODY>
<H1>Dette er teksten:</H1>

<?

  $result = mysql_query("SELECT id, overskrift, tekst, forfatter, billede, DATE_FORMAT(dato, '%d-%m-%Y') AS formateretdato FROM nyheder order by id desc limit 1") or die(mysql_error());
 
 

            print "<table cellspacing=\"0\" cellpadding=\"2\">\n";

            while ($row = mysql_fetch_array($result)) {

                $bgcolor = $a++ % 2 ? '#DEDEDE' : '#F0F0F0';

                $row[overskrift] = htmlentities(stripslashes($row[overskrift]));
                $row[tekst]      = htmlentities(stripslashes($row[tekst]));
                list($d, $m, $y) = explode('-', $row[formateretdato]);

                $new_date = month($m)." $y";

               

                print "<tr>";
        print "    <tr><td bgcolor=\"$bgcolor\">Dato: $d/$m-$y</td></tr>";
        print "    <tr><td bgcolor=\"$bgcolor\">Overskrift: $overskrift</td></tr>";
        print "    <tr><td bgcolor=\"$bgcolor\">Tekst: $tekst</td></tr>";
        print "    <tr><td bgcolor=\"$bgcolor\">Forfatter: $forfatter</td></tr>";
       
        print "</tr>\n";

                $old_date = $new_date;

            }

          print "</table>\n";

        if(isset($billede))
    {
    $desti="../../billeder/";// stien hvor filen skal gemmes
    $desti.=$billede_name;
    if (copy($billede,$desti)) {
        print "Billede tilføjet";
      echo mysql_query("UPDATE nyheder set billede = '$billede_name' WHERE id = '$maxid'") or die(mysql_error());
   
    }

    else {
        print "Der skete en fejl, billede ikke tilføjet";
    }
    unlink($billede);
   
    }
?>
<H1>Tilføj billede til teksten</H1>

<FORM ENCTYPE="multipart/form-data" ACTION="add_picture.php" METHOD="post">
<INPUT TYPE="hidden" name="MAX_FILE_SIZE" value="102400">
<INPUT TYPE="hidden" name="maxid" value="<? mysql_insert_id()?>">
<INPUT NAME="billede" TYPE="file">
<INPUT TYPE="submit" VALUE="Tilføj billede">
</FORM>
</BODY>
</HTML>
Avatar billede klgn Nybegynder
23. april 2002 - 18:19 #46
jeg har også prøvet med last_insert_id()
Avatar billede klgn Nybegynder
23. april 2002 - 18:20 #47
og - jeg har indsat semikolonet - stadig uden held...
Avatar billede erikjacobsen Ekspert
23. april 2002 - 18:29 #48
Tag et kursus i læsning :)

<?= mysql_insert_id()?>
Avatar billede klgn Nybegynder
23. april 2002 - 18:31 #49
okay okay - du vinder - det virker;)

Jeg synes ellers, jeg havde prøvet det - nu vil jeg lige teste, om det virker, når jeg updater...

/Kristian
Avatar billede klgn Nybegynder
23. april 2002 - 18:33 #50
jeps, det funger - men hvorfor det ligmedstegn??
Avatar billede erikjacobsen Ekspert
23. april 2002 - 18:34 #51
vinder? måske jeg skulle til at spille lotto  ;)
Avatar billede klgn Nybegynder
23. april 2002 - 18:34 #52
skriv det som svar - og du får points...
Avatar billede erikjacobsen Ekspert
23. april 2002 - 18:35 #53
Ok, <?= xxx ?> er en forkortelse for <? print xxx; ?>
Så skal man ikke skrive så meger
Avatar billede erikjacobsen Ekspert
23. april 2002 - 18:35 #54
meget

nå, ja, svar
Avatar billede klgn Nybegynder
23. april 2002 - 18:49 #55
siger mange tak for hjælpen - points afsendt...

Kendte ikke den med = - men man skal jo også blive klogere hver dag:)
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