Fehler in Funktionsweise "mysql_insert_id()" ?

shorty

Erfahrenes Mitglied
Guten Abend,

ich arbeite zurzeit an einem Forum und verwende für den Eintrag eines neuen Themas verbunden mit einem Beitrag die MySQL-Funktion "mysql_insert_id()". Laut Manual sollte sie ja die zuletzt eingetragene ID zurückliefern. Allerdings ist mir bei der Funktion etwas aufgefallen.

Wenn die IDs (AUTO_INCREMENT) nicht fortlaufend sind, sondern unterbrochen, durch Löschen einzelner Beiträge im Nachhinein, nimmt "mysql_insert_id()" nicht den zuletzt eingetragenen ID-Wert an, sondern wird gefüllt mit den offenstehenden IDs, die zuvor aus der DB gelöscht werden.

Beispiel:

ID Beitrag ...
1 Test1
2 Test2
3 Test3
4 Test4
5 Test5

Wird nun die Überschrift mit der ID 3 gelöscht und ein neues Thema erstellt, so erhält mysql_insert_id() den Wert "3", trotzdem erhält das neu erstellte Thema den Wert "6".

Kann mir jemand erklären, weshalb das der Fall ist?

Ich verwende zwei Mal die Funktion "mysql_insert_id()", allerdings bei zwei verschiedenen Queries.

PHP:
...
$query1 = mysql_query("INSERT INTO forum_threads ...");
$query2 = mysql_query("INSERT INTO forum_postings (id_fk, text, ...) VALUES ('".mysql_insert_id()."', '".$_POST["text"]."', ....)");
// Hier habe ich eine Klasse, die für die Weiterleitung zuständig ist.
// Ich möchte hier nun auf das neu erstellte Thema mit dem Beitrag zugreifen.
// Daher:
$url->change("index.php?inc=forum&forumid".$_GET["forumid"]."&topicid=".mysql_insert_id());
...
 
Du könntest es alternativ mit der SQL Funktion LAST_INSERT_ID() probieren.

Kann mir das Problem allerdings nicht erklären, bei mir funktioniert es genau richtig, auch bei lückenhafter Nummierung.

Es könnte damit zu tun haben, dass das Query nicht richtig verarbeitet wurde, zumindest steht in den php.net Comments davon einiges. Probiere es mal so:

PHP:
$query1 = mysql_query("INSERT INTO forum_threads ...");
if($query1) {
$query2 = mysql_query("INSERT INTO forum_postings (id_fk, text, ...) VALUES ('".mysql_insert_id()."', '".$_POST["text"]."', ....)");
}
 
Was meinst du mit "nicht richtig verarbeitet"? Beide Queries werden in die Datenbank eingetragen und ich erhalte auch keine Fehlermeldung bei dem Vorgang.
 
Ne, tut mir leid. Sie hat den Typ "INT".
Ich habe aber mittlerweile etwas herausgefunden. Ich hätte vielleicht erwähnen sollen, dass ich zum Aufruf von Queries usw. eine MySQL-Klasse geschrieben habe. Tut mir leid, wenn ich das erst jetzt erwähne, aber ich nahm an, dass es egal ist, ob man mit Klassen arbeitet oder nicht.

Fakt ist, ich habe anstatt meiner Funktion "$db->insert_id()" "mysql_insert_id()" eingefügt und schwupps hats funktioniert. Nun frage ich mich eher, weshalb es mit "mysql_insert_id()" funktioniert :). Dabei belassen möchte ich es eigentlich nicht, da es irgendwo "unschön" aussieht, wenn ich im gesamten Skript mit Klassen arbeite und dann auf einmal wieder MySQL-Funktionen verwende.

Die Funktion innerhalb meiner Klasse für "mysql_insert_id" sieht folgendermaßen aus:

PHP:
...
function insert_id () {
    $this->insert_id = mysql_insert_id();
    return $this->insert_id;
}
...
 
Zurück