2016-04-05 12 views
0

Ich fühle mich wie ich dieses ganze Szenario wirklich übermäßig verkomplizieren. Hoffentlich kann jemand helfen.PHP PDO lastinsertid der vorherigen Funktion

Ich habe ein Formular, das Daten an zwei Tabellen übermittelt (items und uploads). Die Formulardaten gehen an items und der Anhang an uploads. Grundsätzlich möchte ich, dass beide Tabellen eine entsprechende itemId Spalte haben.

Meine beiden Funktionen create() und uploadFile() funktionieren beide. Ich bin mir jedoch nicht sicher, wie ich den lastInsertId-Wert $crud->create() in meiner Variablen $itemId verwenden soll - siehe Kommentare in meinem Code.

Reduzierte Versionen meiner Funktionen sind unten, einschließlich der Kommentare.

class.crud.php

class crud { 

private $db; 

function __construct($DB_con) { 
    $this->db = $DB_con; 
} 

public function create($inv, $ip, $make){ 
    $stmt = $this->db->prepare("INSERT INTO items (inv,ip,make) VALUES (:inv,:ip,:make"); 
    $stmt->bindparam(":inv", $inv); 
    $stmt->bindparam(":ip", $ip); 
    $stmt->bindparam(":make", $make); 
    $stmt->execute(); 
    return true; 
} 

public function uploadFile($itemId, $inv, $file, $file_type, $file_size) { 
    $stmt = $this->db->prepare("INSERT INTO uploads (itemId,inv,file,type,size) VALUES (:itemId,:inv,:file,:file_type,:file_size)"); 
    $stmt->bindParam(":itemId", $itemId); // inserts 777 
    $stmt->bindParam(":inv", $inv); 
    $stmt->bindparam(":file", $file); 
    $stmt->bindparam(":file_type", $file_type); 
    $stmt->bindparam(":file_size", $file_size); 
    $stmt->execute(); 
    return true; 
} 

}

Add-data.php

if (isset($_POST['btn-save'])) { 
    $itemId = '777'; //this successfully inserts 777 into the uploads.itemId teble, but i'd like to insert the lastInsertId value of $crud->create() 
    $inv = $_POST['inv']; 
    $ip = $_POST['ip']; 
    $make = $_POST['make']; 
    $file = rand(1000, 100000) . "-" . $_FILES['file']['name']; 
    $file_loc = $_FILES['file']['tmp_name']; 
    $file_size = $_FILES['file']['size']; 
    $file_type = $_FILES['file']['type']; 
    $folder = "uploaded_files/"; 

    if ($crud->create($inv, $ip, $make)) { 
     echo 'success'; 
    } else { 
     echo 'error';; 
    } 

    if (move_uploaded_file($file_loc, $folder . $file)) { 
      $crud->uploadFile($itemId, $inv, $file, $file_type, $file_size); 
     } 
} 

<form method='post' enctype="multipart/form-data"> 
    <input type='text' name='inv'> 
    <input type='text' name='ip'> 
    <input type='text' name='make'> 
    <input type='file' name='file'> 
    <button type="submit" name="btn-save"></button> 
</form> 

Die Struktur meiner beiden Tabellen sind wie folgt;

Artikel(itemId primär ist, einzigartig und Auto-Inkrement)

+--------+---------+-----------------+-------+ 
| itemId | inv  | ip    | make | 
+--------+---------+-----------------+-------+ 
| 1  | 1293876 | 123.123.123.123 | Dell | 
+--------+---------+-----------------+-------+ 
| 2  | 4563456 | 234.234.234.234 | Dell | 
+--------+---------+-----------------+-------+ 
| 3  | 7867657 | 345.345.345.345 | Apple | 
+--------+---------+-----------------+-------+ 

Artikel(upload_id primär ist, einzigartig und Auto-Inkrement)

+-----------+--------+-----+----------+------------+------+ 
| upload_id | itemId | inv | file  | type  | size | 
+-----------+--------+-----+----------+------------+------+ 
| 56  | 777 | 123 | test.txt | text/plain | 266 | 
+-----------+--------+-----+----------+------------+------+ 
| 57  | 777 | 123 | test.txt | text/plain | 266 | 
+-----------+--------+-----+----------+------------+------+ 
| 58  | 777 | 123 | test.txt | text/plain | 266 | 
+-----------+--------+-----+----------+------------+------+ 

Bitte vergib den unordentlichen Code. Ich versuche nur, die Logik zu korrigieren und dann kann ich daran arbeiten.

Jeder Rat wird geschätzt.

+0

Anstatt 'true' in Ihren Funktionen zurückzugeben, versuchen Sie' $ this-> db-> lastInsertId(); 'zurückzugeben und sehen Sie, was Sie bekommen. – Maximus2012

+0

Was gibt 'var_dump ($ crud-> create ($ inv, $ ip, $ make))', nachdem Sie Änderungen an der Funktion vorgenommen haben? – Maximus2012

+0

Dies ist nur für die Funktion 'create()' und nicht für die Funktion 'uploadFile()'. Laut Ihrem Code hat '$ itemId' nichts mit Ihrer' create() 'Funktion zu tun.Wenn Sie bereits Änderungen an der Funktion 'create()' vorgenommen haben, um 'lastInsertId()' zurückzugeben, hilft Ihnen 'var_dump' beim Testen. – Maximus2012

Antwort

0

Also mit Hilfe von @ Maximus2012 konnte ich das lösen.

Ich änderte meine create() Funktion, um lastInsertId() anstelle von nur wahr oder falsch zurückzukehren. Dann habe ich den von der Funktion create() zurückgegebenen Wert einer Variablen zugewiesen, anstatt einen statischen Wert zu verwenden.

So sieht mein Arbeitscode jetzt so aus;

public function create($inv, $ip, $make){ 
    $stmt = $this->db->prepare("INSERT INTO items (inv,ip,make) VALUES (:inv,:ip,:make"); 
    $stmt->bindparam(":inv", $inv); 
    $stmt->bindparam(":ip", $ip); 
    $stmt->bindparam(":make", $make); 
    $stmt->execute(); 
    return $this->db->lastInsertId(); 
} 

Dann in meiner add-data.php Seite habe ich einfach eine vcariable zu folgenden geändert;

$itemId = $crud->create($inv, $ip, $make); 

Gelöst.