[MySQL/PHP] Auto-increment verhoogt niet

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • edeboeck
  • Registratie: Maart 2005
  • Laatst online: 11-09 13:47

edeboeck

mie noow noooothing ...

Topicstarter
Probleem:
In foreach-loop een INSERT-statement uitvoeren (het pk-veld dat auto-incrementeel is, geef ik niet op of NULL als value)
... 1e keer loopt het goed (haalt het correcte volgende id op)
... 2de keer geeft het foutmelding owv duplicate key ... hij haalt niet de volgende incrementele waarde op

Omgeving:
phpMyAdmin 2.5.3-rc2 >> MySQL 4.0.20a-nt
Current PHP version: 4.3.9

Zoekpogingen:
Google
GoT

Codepogingen:
Ik heb LAST_INSERTED_ID (mySQL) en mysql_insert_id() (PHP) geprobeerd, maar beiden geven 0 terug. Het veld weglaten deed ik in het begin, maar ook dit werkt niet.

max()+1 zie ik niet echt als een oplossing aangezien meerdere gebruikers tegelijk de webpagina kunnen oproepen.

PHP:
1
2
3
4
5
6
foreach ($varrPCs as $vPC) {
    $sql = "INSERT INTO Sessies(ID, Toestel, Slot, Datum, Begeleider) VALUES(IF(" . mysql_insert_id() ."=0, NULL," . mysql_insert_id() ."), $vPC, $vSlot, $vDatum, '$vBegeleider')";
    $result = mysql_query($sql)
        or die("Ongeldige query (invoegen reservatie $vPC): " .mysql_error() . "<br/><br/>$sql");
    $devFeedback .= $sql . "<br/>";
}


Vraag:
Het probleem ligt duidelijk in het feit dat mySQL de teller niet ophoogt (aangezien hij hem wel correct ophaalt voor het eerste record, maar nadien dienst weigert). Iemand een idee hoe het komt en, meer nog, hoe op te lossen of te omzeilen?

Extra info:
een ander veld waarop een default value gespecifieerd is (datumveld met default value now()) blijft leeg (0 in dit geval)

thx 4 hlp

[ Voor 16% gewijzigd door edeboeck op 21-10-2005 14:24 . Reden: Benadrukken dat het veld niet vermelden ook al geprobeerd is. ]


Acties:
  • 0 Henk 'm!

Verwijderd

Haal dat van ID eens helemaal weg... Je hoeft daar helemaal geen waarde aan te geven, als je hem 0 geeft gaat het idd 1e keer goed, maar de 2e keer probeert hij weer 0.

Autoincrement geeft automatisch een waarde, TENZIJ je er zelf een waarde aan geeft.

Acties:
  • 0 Henk 'm!

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 18:44

gorgi_19

Kruimeltjes zijn weer op :9

Na iedere insert zal je opnieuw de mysql_insert_id moeten opvragen, maar waarom wil je een auto-increment-veld handmatig van een waarde voorzien dmv een insert?

[ Voor 42% gewijzigd door gorgi_19 op 21-10-2005 13:57 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Acties:
  • 0 Henk 'm!

  • sig69
  • Registratie: Mei 2002
  • Laatst online: 20:53
Voor zover ik weet kan je het id van het laatst opgeslagen record pas ophalen nadat de query is uitgevoerd, niet in de query zelf.

Roomba E5 te koop


Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Je nieuwe pogingen proberen het ID van de vorige insert te gebruiken. Als je het veld altijd leeg laat:
PHP:
1
2
$sql = "INSERT INTO Sessies(ID, Toestel, Slot, Datum, Begeleider) VALUES("", $vPC, $vSlot, $vDatum, '$vBegeleider')"; 
$result = mysql_query($sql)

Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 22:34
Je hoeft een auto increment niet op te geven, die wordt automagisch ingevuld.
code:
1
INSERT INTO Sessies(Toestel, Slot, Datum, Begeleider) VALUES (I$vPC, $vSlot, $vDatum, '$vBegeleider')"

Zou dus voldoende moeten zijn.

mysql_insert_id() gebruik je om de laatste toegekende auto_incrementwaarde op te halen. Dat is bijvoorbeeld nuttig om gerelationeerde tabellen te vullen.

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

  • edeboeck
  • Registratie: Maart 2005
  • Laatst online: 11-09 13:47

edeboeck

mie noow noooothing ...

Topicstarter
Bedankt allemaal voor de reacties ... ze komen eigenlijk op hetzelfde neer: het betrokken veld weglaten.
Dit heb ik geprobeerd voor ik mijn code veranderde, maar dit gaf hetzelfde probleem.
Het veld weglaten deed ik in het begin, maar ook dit werkt niet
Code zoals ze eerst was:
PHP:
1
2
3
4
5
6
foreach ($varrPCs as $vPC) {
    $sql = "INSERT INTO Sessies(Toestel, Slot, Datum, Begeleider) VALUES($vPC, $vSlot, $vDatum, '$vBegeleider')";
    $result = mysql_query($sql)
        or die("Ongeldige query (invoegen reservatie $vPC): " .mysql_error() . "<br/><br/>$sql");
    $devFeedback .= $sql . "<br/>";
}

Acties:
  • 0 Henk 'm!

  • edeboeck
  • Registratie: Maart 2005
  • Laatst online: 11-09 13:47

edeboeck

mie noow noooothing ...

Topicstarter
sig69 schreef op vrijdag 21 oktober 2005 @ 13:56:
Voor zover ik weet kan je het id van het laatst opgeslagen record pas ophalen nadat de query is uitgevoerd, niet in de query zelf.
Daarom dat ik het in de SQL-IF() zet ... de eerste keer is het inderdaad 0 omdat het nog nooit is gebeurd. Als alles goed werkt, zou het nadien moeten ingevuld zijn van de vorige INSERT.

Acties:
  • 0 Henk 'm!

  • Wacky
  • Registratie: Januari 2000
  • Laatst online: 05-09 21:19

Wacky

Dr. Lektroluv \o/

Gewoon leeg laten, werkt prima! :)

Nu ook met Flickr account


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

edeboeck schreef op vrijdag 21 oktober 2005 @ 14:10:
Bedankt allemaal voor de reacties ... ze komen eigenlijk op hetzelfde neer: het betrokken veld weglaten.
Dit heb ik geprobeerd voor ik mijn code veranderde, maar dit gaf hetzelfde probleem.

[...]


Code zoals ze eerst was:
PHP:
1
2
3
4
5
6
foreach ($varrPCs as $vPC) {
    $sql = "INSERT INTO Sessies(Toestel, Slot, Datum, Begeleider) VALUES($vPC, $vSlot, $vDatum, '$vBegeleider')";
    $result = mysql_query($sql)
        or die("Ongeldige query (invoegen reservatie $vPC): " .mysql_error() . "<br/><br/>$sql");
    $devFeedback .= $sql . "<br/>";
}
Zijn toestel, slot en datum niet toevallig varchar velden?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • edeboeck
  • Registratie: Maart 2005
  • Laatst online: 11-09 13:47

edeboeck

mie noow noooothing ...

Topicstarter
Wacky schreef op vrijdag 21 oktober 2005 @ 14:18:
Gewoon leeg laten, werkt prima! :)
NEEN, dit werkt niet! Ik heb dat hierboven al gezegd. De eerste insert is ok, maar voor de 2de wil hij hetzelfde ID gebruiken als bij de eerste en uiteraard werkt dat niet (het gaat om een PK-veld).

Toevoeging TS: een ander veld waarop een default value gespecifieerd is (datumveld met default value now()) blijft leeg (0 in dit geval).

Acties:
  • 0 Henk 'm!

  • edeboeck
  • Registratie: Maart 2005
  • Laatst online: 11-09 13:47

edeboeck

mie noow noooothing ...

Topicstarter
-NMe- schreef op vrijdag 21 oktober 2005 @ 14:21:
[...]

Zijn toestel, slot en datum niet toevallig varchar velden?
Was al zeker van niet, maar omdat je zulke zaken al snel over het hoofd ziet, heb ik het nog eens opgesnord:
VeldTypeAttributenNullStandaardwaardeExtra
IDtinyint(4)Neeauto_increment
Toesteltinyint(3)UNSIGNEDNee0
Slottinyint(3)UNSIGNEDNee0
Begeleiderchar(3)Nee
DatumdateNee0000-00-00
DatumAanvraagdateNee0000-00-00

Acties:
  • 0 Henk 'm!

  • edeboeck
  • Registratie: Maart 2005
  • Laatst online: 11-09 13:47

edeboeck

mie noow noooothing ...

Topicstarter
Bedankt voor de hulp die iedereen geboden heeft, maar het was de reactie van -NME- die me op het juiste spoor bracht:
-NMe- schreef op vrijdag 21 oktober 2005 @ 14:21:
[...]

Zijn toestel, slot en datum niet toevallig varchar velden?
Types waren allemaal ok, maar hij struikelde over het type "TINYINT" (had het al eens aangepast naar INT, maar de lengte vergeten weg te doen 8)7 , waardoor hij feitelijk met een TINYINT bleef zitten) vanaf het moment dat de default waarde groter dan 127 moest worden. Blijkbaar geeft SQL dan dezelfde waarde terug ipv een out-of-range error oid. Veranderen naar INT (zonder lengte-opgave) just works fine :)

Misschien dat iemand hier ooit nog iets mee is ...

Acties:
  • 0 Henk 'm!

  • sig69
  • Registratie: Mei 2002
  • Laatst online: 20:53
Ik probeer het nog een keer uit te leggen.
Stel je voert onderstaande query uit:
PHP:
1
2
$sql = "INSERT INTO Sessies(ID, Toestel, Slot, Datum, Begeleider) 
VALUES(IF(" . mysql_insert_id() ."=0, NULL," . mysql_insert_id() ."), $vPC, $vSlot, $vDatum, '$vBegeleider')";

mysql_insert_id() is 0, dus jouw IF statement zet er NULL in. Dat gaat goed.
Daarna voer je weer deze query uit:
PHP:
1
2
$sql = "INSERT INTO Sessies(ID, Toestel, Slot, Datum, Begeleider) 
VALUES(IF(" . mysql_insert_id() ."=0, NULL," . mysql_insert_id() ."), $vPC, $vSlot, $vDatum, '$vBegeleider')";

mysql_insert_id() is nu niet 0, maar de id van je vorige query. Feitelijk probeer je nu dus een tweede record op te slaan met hetzelfde id, vandaar de duplicate key exception.

Maw: jij probeert het laatst opgeslagen id op te halen voordat deze is opgeslagen.

Edit:
Hmmm het werkt nu? Dan kan je bovenstaande als geblaat beschouwen.
Geen geblaat dus.

[ Voor 17% gewijzigd door sig69 op 21-10-2005 15:20 ]

Roomba E5 te koop


Acties:
  • 0 Henk 'm!

  • edeboeck
  • Registratie: Maart 2005
  • Laatst online: 11-09 13:47

edeboeck

mie noow noooothing ...

Topicstarter
sig69 schreef op vrijdag 21 oktober 2005 @ 14:45:
Ik probeer het nog een keer uit te leggen.
Stel je voert onderstaande query uit:
PHP:
1
2
$sql = "INSERT INTO Sessies(ID, Toestel, Slot, Datum, Begeleider) 
VALUES(IF(" . mysql_insert_id() ."=0, NULL," . mysql_insert_id() ."), $vPC, $vSlot, $vDatum, '$vBegeleider')";

...
mysql_insert_id() is nu niet 0, maar de id van je vorige query. Feitelijk probeer je nu dus een tweede record op te slaan met hetzelfde id, vandaar de duplicate key exception.

Maw: jij probeert het laatst opgeslagen id op te halen voordat deze is opgeslagen.

Edit:
Hmmm het werkt nu? Dan kan je bovenstaande als geblaat beschouwen.
Het werkt nu idd, maar ik beschouw wat jij getypt hebt niet als geblaat, integendeel: je hebt gelijk.
thx!

[ Voor 34% gewijzigd door edeboeck op 21-10-2005 15:09 ]

Pagina: 1