2017-12-15 3 views
0

Ich versuche, das gleiche insertId in ein paar Link-Tabellen einzufügen, jedoch habe ich entdeckt, dass offenbar der Einsatz id auf Null zurückgesetzt wird, nachdem die erste Methode ausgeführt wird. Diese Methoden sind getrennt, da sie an anderen Stellen wiederverwendet werden. Sie sind in getrennten Klassen.PDO Einfügen letzt Einsatz-ID in zwei Tabellen

Es gibt im Wesentlichen drei Verfahren genannt werden, aber ich bin vor allem mit diesen beiden Updates, von denen eine der anderen aufhebt.

if($resource->createResource()){ 

    $author->resourceAuthor(); 
    $subject->resourceSubject(); 

} 

Die beiden Methoden sind im Wesentlichen identisch. Jeder fügt Daten in eine separate Verknüpfungstabelle ein (viele zu viele).

Die erste ist dies:

function resourceAuthor() 
{ 

    $query = "INSERT INTO authors_has_resource (resource_id, author_id) VALUES (?,?)"; 

    $last_id = $this->conn->lastInsertId(); 

    $stmt = $this->conn->prepare($query); 


    if(!empty($this->id)) { 
     foreach($_POST['author_id'] as $id) { 


      $stmt->execute(array(
       $last_id, 
       $id 
      )); 
     } 
    } 
} 

und das zweite ist dies:

function resourceSubject() 
{ 

    $query = "INSERT INTO resource_has_subjects (resource_id, subject_id) VALUES (?,?)"; 

    $last_id = $this->conn->lastInsertId(); 

    $stmt = $this->conn->prepare($query); 


    if(!empty($this->id)) { 
     foreach($_POST['subject_id'] as $id) { 


      $stmt->execute(array(
       $last_id, 
       $id 
      )); 
     } 
    } 
} 

Was auch immer, das ich zuerst laufen, funktioniert gut, aber die zweite tritt gerade die RESOURCE_ID als 0 (die anderen Zeilen, dh author_id oder subject_id in ihren jeweiligen Tabellen gehen gut, aber natürlich am Ende mit doppelten Schlüsseln, da 0 natürlich nicht der Primärschlüssel ist, zumindest in diesem Fall)

Gibt es eine einfache Möglichkeit, dies zu umgehen? Ich habe versucht, die Einfüge-ID als eine Variable im ersten Skript zu erstellen, es scheint keine Wirkung zu haben.

bearbeiten

ich so etwas wie dies versucht haben:

if($resource->createResource()){ 

    $last_id = $db->lastInsertId(); 
    print_r($last_id); 
    $resource->resourceSubjectAuthor($last_id); 


} 

Und dann, ein neues Verfahren zu schaffen nichts bekommt

function resourceSubjectAuthor($last_id) 
{ 

    $query = "INSERT INTO authors_has_resource (resource_id, author_id) VALUES (?,?)"; 


    $stmt = $this->conn->prepare($query); 


    $query2 = "INSERT INTO resource_has_subjects (resource_id, subject_id) VALUES (?,?)"; 


    $stmt2 = $this->conn->prepare($query2); 
    if(!empty($this->id)) { 
     foreach($_POST['author_id'] as $id) { 


      $stmt->execute(array(
       $last_id, 
       $id 
      )); 
     } 

     foreach($_POST['subject_id'] as $ids) { 


      $stmt2->execute(array(
       $last_id, 
       $ids 
      )); 
     } 
    }  


} 

Die letzte id korrekt erstellt wird, aber dann

ausgeführt
+0

[Wie ein Minimal, Vollständig, erstellen und Nachprüfbares Beispiel für ein PDO-Problem] (https://phddelusions.net/pdo/mcve) –

+0

@YourCommonSense Vielen Dank für Ihren Versuch, aber das hilft mir nicht wirklich viel; Ich habe ein spezifisches Problem, wie man eine Einfüge-ID über zwei Methoden behält. Ich habe ein paar Versuche zum Debuggen dieses gemacht und versuche, eine Antwort zu finden, aber jede Hilfe, die Sie zur Verfügung stellen können, wäre sehr hilfreich – nomistic

+0

Oh, nein. Ich versuche nicht zu helfen. Es ist das, was Sie tun müssen, um sich selbst zu helfen, um Ihre Frage offen zu halten. Ansonsten wird es als Off-Thema geschlossen. –

Antwort

1

Ok, Ich habe es geschafft, das zu lösen. Das Problem stand in direktem Zusammenhang mit dem Zurücksetzen der Einfüge-ID nach einer Ausführung. Ich musste nur die Einfüge-ID definieren, bevor beide Methoden aufgerufen wurden, und dann diese Variable an die Methoden vor deren Ausführung übergeben.

if($resource->createResource()){ 

    $last_id = $db->lastInsertId(); 
    $author->resourceAuthor($last_id); 
    $subject->resourceSubject($last_id); 
} 

und dann in beiden Verfahren, geben Sie einfach die Variable, anstatt es wie so zu erklären:

function resourceSubject($last_id) 
{ 

    $query = "INSERT INTO resource_has_subjects (resource_id, subject_id) VALUES (?,?)"; 


    $stmt = $this->conn->prepare($query); 


    if(!empty($this->id)) { 
     foreach($_POST['subject_id'] as $id) { 


      $stmt->execute(array(
       $last_id, 
       $id 
      )); 
     } 
    } 
} 

und ähnlich:

function resourceAuthor($last_id) 
{ 

    $query = "INSERT INTO authors_has_resource (resource_id, author_id) VALUES (?,?)"; 
    $stmt = $this->conn->prepare($query); 


    if(!empty($this->id)) { 
     foreach($_POST['author_id'] as $id) { 


      $stmt->execute(array(
       $last_id, 
       $id 
      )); 
     } 
    } 
} 
Verwandte Themen