Avatar billede kongfjong Nybegynder
23. august 2006 - 08:46 Der er 14 kommentarer og
1 løsning

mysql_insert_id-værdi indsættes ikke korrekt i tabel

Hej igen igen...:)

Jeg har noget kode:

$behandling = explode("-", $_POST['produkt_behandling']);
$tekst = $_POST['produkt_tekst'];
$navn = $_POST['produkt_navn'];
       
$behandling_id = $behandling[0];
$tabel = $behandling[1];
       
$insert_behandling = mysql_query("INSERT INTO produkter (id, navn) VALUES ('', '$navn')") or die(mysql_error());

if ($insert_behandling == 1) {
    $produkt_id = mysql_insert_id();
    $insert_info = mysql_query("INSERT INTO produkter_info (produkt_id, behandling_id, tekst, tabel) VALUES ($produkt_id,        $behandling_id, '$tekst', '$tabel')") or die(mysql_error());

    if ($insert_info == 1)
    {
    $_SESSION['query_ok'] = 'produkter';
    header("Location: index.php?action=forside&id=$produkt_id");
    exit;
    }
}

Det skulle gerne gøre sådan, at det id der indsætter i auto-increment kolonnen 'id' i den første INSERT-query, bliver indsat i den anden INSERT-query, men dette er ikke tilfældet. Den indsætter enten bare tallet 1 eller 2, selvom $produkt_id, bliver sat helt perfekt til den sidste id-værdi fra den første INSERT-query.

Tabel-strukturen for produkter_info-tabellen er:

CREATE TABLE `produkter_info` (
  `produkt_id` tinyint(3) unsigned NOT NULL default '0',
  `behandling_id` tinyint(3) unsigned NOT NULL default '0',
  `tekst` tinytext character set latin1 collate latin1_danish_ci NOT NULL,
  `tabel` varchar(22) character set latin1 collate latin1_danish_ci NOT NULL default '',
  KEY `produkt_id` (`produkt_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

Jeg kan simpelthen ikke få ind i mit lille hoved hvad jeg har gjort galt...
Avatar billede mortenkjeldberg Nybegynder
23. august 2006 - 10:30 #1
Du har ikke et felt der hedder navn har du?

/Morten
Avatar billede mortenkjeldberg Nybegynder
23. august 2006 - 10:31 #2
undskyld, blandede lige createn sammen med den forkerte table.
Avatar billede kongfjong Nybegynder
23. august 2006 - 10:40 #3
Hehe ok:)
Avatar billede skagen Nybegynder
23. august 2006 - 13:10 #4
Ja, det ser mærkeligt ud. Hvad sker der hvis du ændrer

INSERT INTO produkter (id, navn) VALUES ('', '$navn')

til

INSERT INTO produkter (navn) VALUES ('$navn')

Jeg mener ikke det er nødvendigt at angive et autoincrement felt i en INSERT. Jeg ha r ikke prøvet, men måske gør det en forskel. Prøv.
Avatar billede Slettet bruger
23. august 2006 - 13:26 #5
En detalje, som ikke burde være direkte relateret til dit problem:

Returværdien fra mysql_query() kan ikke være tallet 1. For en INSERT kan den kun returnere true og false - og når du har "or die()" på den, så vil scriptet dø, når den returnerer false, så dermed kan man vide med 100% sikkerhed, at hvis php bare kommer til linien efter dine insert, så er resultatet true.
Avatar billede kongfjong Nybegynder
23. august 2006 - 13:30 #6
Ah okay, så kunne nøjes med at skrive:

if ($insert_behandling) f.eks.?
Avatar billede kongfjong Nybegynder
23. august 2006 - 13:30 #7
@skagen, jeg prøver lige:)
Avatar billede kongfjong Nybegynder
23. august 2006 - 13:34 #8
For hunde skagen, det hjalp dælme:) Hvad skulle jeg gøre uden exp.dk:) tak for hjælpe:)
Avatar billede Slettet bruger
23. august 2006 - 13:46 #9
I dit tilfælde (så længe du beholder or die) kunne du klare dig helt uden if.

Jeg ville dog vælge at beholde dem og lave dem om sådan som du selv foreslår, for hvis du nu på et tidspunkt fjerne or die fra mysql_query'erne.

Eller måske endda som dette (inklusiv skagens rettelse):

$behandling = explode("-", $_POST['produkt_behandling']);
$tekst = $_POST['produkt_tekst'];
$navn = $_POST['produkt_navn'];
     
$behandling_id = $behandling[0];
$tabel = $behandling[1];
     
if (mysql_query("INSERT INTO produkter (navn) VALUES ('$navn')"))
{
  $produkt_id = mysql_insert_id();
  $insert_info =  or die(mysql_error());

  if (mysql_query("INSERT INTO produkter_info (produkt_id, behandling_id, tekst, tabel) VALUES ($produkt_id, $behandling_id, '$tekst', '$tabel')"))
  {
    $_SESSION['query_ok'] = 'produkter';
    header("Location: index.php?action=forside&id=$produkt_id");
    exit;
  }
  else
  {
    die(mysql_error());
  }
}
else
{
  die(mysql_error());
}
Avatar billede Slettet bruger
23. august 2006 - 13:48 #10
Hov, jeg manglede lige at slette lidt:

$behandling = explode("-", $_POST['produkt_behandling']);
$tekst = $_POST['produkt_tekst'];
$navn = $_POST['produkt_navn'];
     
$behandling_id = $behandling[0];
$tabel = $behandling[1];
     
if (mysql_query("INSERT INTO produkter (navn) VALUES ('$navn')"))
{
  $produkt_id = mysql_insert_id();
  if (mysql_query("INSERT INTO produkter_info (produkt_id, behandling_id, tekst, tabel) VALUES ($produkt_id, $behandling_id, '$tekst', '$tabel')"))
  {
    $_SESSION['query_ok'] = 'produkter';
    header("Location: index.php?action=forside&id=$produkt_id");
    exit;
  }
  else
  {
    die(mysql_error());
  }
}
else
{
  die(mysql_error());
}
Avatar billede skagen Nybegynder
23. august 2006 - 15:43 #11
Velbekomme! Det var bare et skud, men nogen gange har man jo lov at være heldig ;-) Det kunne tyde på en bug i mysql_insert_id() ...

Lige en ting jeg ikke forstår helt: Du skriver at "$produkt_id, bliver sat helt perfekt til den sidste id-værdi fra den første INSERT-query". Hvordan kan du sige det? Det må være på grundlag af noget andet kode - der muligvis indeholder en anden bug. Hvis $produkt_id "bliver sat helt perfekt" i den kode du angiver, så SKAL den anden insert også få den rigtige værdi i feltet produkt_id. Da feltet IKKE får den rigtige værdi tror jeg godt vi kan blive enige om at $produkt_id heller ikke har den rigtige værdi.

OK. Bare skidtet virker kan det jo være lidt ligegyldigt - men husk det næste gang du poster.
Avatar billede Slettet bruger
23. august 2006 - 17:22 #12
skagen: som jeg forstod indlægget 23/08-2006 13:34:13 er problemet løst med dit forslag, så jeg vil tro, du skal lægge et svar ;-)
Avatar billede kongfjong Nybegynder
23. august 2006 - 21:51 #13
Skagen, det var fordi jeg havde lavet denne kode:

header("Location: index.php?action=forside&id=$produkt_id");

Hvor jeg så kunne se at id=det_rigtige_produkt_ID:)
Avatar billede skagen Nybegynder
24. august 2006 - 00:05 #14
OK. Her er så er svar :-)

En sidste kommentar: Jeg slog mysql_insert_id op på http://dk.php.net/mysql_insert_id og der opfordres man faktisk til at bruge MySQL funktionen LAST_INSERT_ID(). I bruger noterne på siden er der indtil flere eksempler på hvordan den bruges. Bemærk Ephraim's kommentar, der så vidt jeg kan se, omhandler det problem du oplevede.
Avatar billede kongfjong Nybegynder
24. august 2006 - 07:10 #15
Ah ja okay, syntes også jeg havde taget et kig i den manual, men ikke læst kommentarerne grundigt nok så...:)
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