last_insert_id

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • last_insert_id

    Hallo,

    ich habe eine Problem, oder ich versteh was falsch ( was auch durchaus im Bereich des möglichem liegt)

    Ich habe eine Tabelle

    Quellcode

    1. TABLE `test` (
    2. `id` int(11) NOT NULL auto_increment,
    3. `tid` int(11) NOT NULL,
    4. `text` text collate latin1_german1_ci,
    5. PRIMARY KEY (`id`)


    und möchte nun ein Datensatz einfügen, der "id" Wert wird automatisch hoch gezählt. Der Wert "tid" soll auch nun den Wert von "id" bekommen.

    So habe ich mir das gedacht :

    Quellcode

    1. INSERT INTO `test` ( `id` , `tid` , `text` )
    2. VALUES (
    3. NULL , LAST_INSERT_ID( ) , 'Test'
    4. );


    Eigentlich sollte nun bei "tid" der wert von "id" stehen oder nicht? Würde nur ungerne ein zweite SQL Anweisung schreiben die dann das Feld "tid" mit den Wert füllt.

    Gruß
    Stephan
  • Es soll ja nicht immer den gleich wert haben. Nur wenn ich in die SQL Anweisung LAST_INSERT_ID() übergebe für den Wert "tid".

    Ganz ganz soll für ein Forum werden. ID ist vorlaufend und der thread id wir den ersten neuen Eintrag hinzugfügt.

    z.b.

    id = 5 pid = 0 tid=5 Thread "Hallo"
    id = 6 pid = 1 tid=5 Thread "Hallo" Antwort
    id = 7 pid = 0 tid=7 Thread "Hallo Welt"

    usw.

    ich hoffe das System Funktioniert auch, bin grade dabei das zu Implementieren :)
  • Du verstehst da glaube ich etwas falsch.
    Benutzt du phpMyAdmin?

    Und auch andernfalls kannst du bereits beim erstellen der Datenbankstruktur angeben, dass MySQL für eine Spalte in einer Datenbank eine Zahl einfügt, die bei jedem Eintrag um einen erhöht wird (auto_increment). So brauchst du gar keine id mehr von PHP aus zu übergeben und kannst dich um die anderen Inhalte kümmern, was natürlich auch dafür sorgt, dass die id immer eine andere ist.
  • "Matrixstyle" schrieb:

    Die "ID" ist auch nicht das Problem sondern "tid". Ich möchte gerne wenn

    z.B.

    ID=5, pid=0 und tid=5 = Neuer Beitrag im Forum
    ID=6, pid=6 und tid=5 = Antwort auf neuer Beitrag im Forum

    ich kann das natürlich in zwei SQL Anweisung machen, aber ich hätte das gern in einer.


    Hallo,

    Du solltest Dein Konzept evtl. nochmal überdenken:

    Warum muss im ersten Beispiel tid=5 sein? Warum nicht einfach auf 0 setzten?
    Das ist ja eigentlich eine einfache hierachische Struktur, wo jede Antwort einen Vater (tid) hat. Der Vater selbst ist ein "Root-Objekt" und hat keinen Vater => tid=0.

    BTW was ist denn "pid"?

    70abc
    We raise hopes, here ... until they're old enough to fend for themselves.
    - Mike Callahan
  • Mit dem Konzept bin ich mir auch noch nicht so ganz schlüssig! Aber dein Ansatz verstehe ich nicht ganz!

    Warum nicht einfach auf 0 setzten?
    Das ist ja eigentlich eine einfache hierachische Struktur, wo jede Antwort einen Vater (tid) hat. Der Vater selbst ist ein "Root-Objekt" und hat keinen Vater => tid=0.


    Also das ob war nur ein Beispiel für Last_insert_id()

    Die Tabelle hat am Anfang 3 Spalten mit ID, pid,tid wobei p=posting,t=thread steht.
    Die pid kann man erstmal vernachlässigen.

    ID ist immer vorlaufend und tid beschriebt ein neuen Beitrag im Forum der sich bei jedem posting nicht ändert. Um das zu erkennen habe ich mir gedacht das Wenn ID = tid ist, handelt es sich um den Anfang eines neuen Beitrags. Aber über andere Denkansätze wäre ich nicht abgeneigt.

    Gruß
    Stephan
  • Re: last_insert_id

    "Matrixstyle" schrieb:


    So habe ich mir das gedacht :

    Quellcode

    1. INSERT INTO `test` ( `id` , `tid` , `text` )
    2. VALUES (
    3. NULL , LAST_INSERT_ID( ) , 'Test'
    4. );


    Eigentlich sollte nun bei "tid" der wert von "id" stehen oder nicht? Würde nur ungerne ein zweite SQL Anweisung schreiben die dann das Feld "tid" mit den Wert füllt.


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

    Die Idee mit der Referenzierung der Zeilen ist garnicht so schlecht (imho). Du musst nur "von Hand" speichern zu welchem original Post dieser Post gehört. So etwas kannst du nicht mit MySQL eigenen Mitteln lösen.
  • "Matrixstyle" schrieb:

    Mit dem Konzept bin ich mir auch noch nicht so ganz schlüssig! Aber dein Ansatz verstehe ich nicht ganz!

    Die Tabelle hat am Anfang 3 Spalten mit ID, pid,tid wobei p=posting,t=thread steht.
    Die pid kann man erstmal vernachlässigen.

    ID ist immer vorlaufend und tid beschriebt ein neuen Beitrag im Forum der sich bei jedem posting nicht ändert. Um das zu erkennen habe ich mir gedacht das Wenn ID = tid ist, handelt es sich um den Anfang eines neuen Beitrags. Aber über andere Denkansätze wäre ich nicht abgeneigt.


    Also:

    ID=25, tid=0 = Neuer Beitrag im Forum
    ID=40, tid=25 = Antwort auf Beitrag 25
    ID=47, tid=40 = Antwort auf Beitrag 40
    ID=50, tid=25 = Antwort auf Beitrag 25

    Einträge deren tid = 0 sind neue Beiträge (Anfang eines neuen Beitrags)
    Beiträge deren tid > 0 sind sind Antworten auf einen Beitrag

    Mit einer rekursiven Funktion kannst Du die Stuktur durchlaufen und hierarchisch ausgeben.

    Aus performance Gründen wäre es evtl noch nützlich eine Sortierung und die Id des ersten Beitrags mit zu speichern, dann kannst Du Beiträge mit einem Querry flach aus der DB holen aund ausgeben:

    ID=25, tid=0, sort=1, root=0 = Neuer Beitrag im Forum
    ID=40, tid=25, sort=2, root=25 = Antwort auf Beitrag 25
    ID=47, tid=40, sort=3, root=25 = Antwort auf Beitrag 40
    ID=50, tid=25, sort=4, root=25 = Antwort auf Beitrag 25

    Flach:

    Quellcode

    1. Beitrag 25
    2. Beitrag 40
    3. Beitrag 47
    4. Beitrag 50


    Hierarchisch:

    Quellcode

    1. Beitrag 25
    2. Beitrag 40
    3. Beitrag 47
    4. Beitrag 50


    70abc
    We raise hopes, here ... until they're old enough to fend for themselves.
    - Mike Callahan
  • "Matrixstyle" schrieb:

    Teil 1 habe ich soweit verstanden, anstatt gleich mit tid auf den gleichen wert wie id zusetzen, wird 0 gesetzt. Ansonsten ist es gleich richtig, wie meine Vorschlag?

    zum zweiten Teil, muss ich wieder sagen. Das verstehe ich leider nicht :(

    Für was ist Sort und root?


    Gruß
    Stephan


    'sort' ist eine Zahl die hoch gezählt wird [INSERT INTO test (..., sort) VALUES(...,sort+1)], also die Sortierung.
    'root' is die Id des ersten Beitrags (im meinem Bsp hat der die Id 25).

    Dadurch kannst Du alle Beiträge mit einem Query flach aus der Db holen:


    Quellcode

    1. $strQuery = '
    2. SELECT
    3. *
    4. FROM
    5. test
    6. WHERE
    7. root = 25
    8. ORDER BY
    9. sort';


    Die flache Darstellung entspricht dem was Du z.B. hier im Forum siehst.
    Willst Du aber einen Thread-Tree darstellen, wie es ihn z.B. im heise Forum gibt, dann brauchst du eine hierachische Struktur.

    Mit meinem Vorschlag sollte sich beides recht leicht umsetzen lassen...

    70abc
    We raise hopes, here ... until they're old enough to fend for themselves.
    - Mike Callahan
  • Marcus Gnaß schrieb:

    Die Sortierung kannst du bei einem Forum doch durch die Zeit realisieren. aAlso beim INSERT einfach date_created=NOW() und beim SELECT ein ORDER BY date_created verwenden.

    Das ist aber sehr oft nicht gewünscht. Wichtig ist es meistens, dass eine einigermaßen feste Struktur erhalten bleibt. Threads kommen vielleicht täglich neue dazu, die Foren jedoch ändern sich nicht, sodass man hier meistens vorsortieren möchte. Ich habe auch die Erfahrung gemacht, dass diese Technik handlicher ist.