2012-09-26 113 views
5

我有一個父子關係的數據庫。我需要先插入到父表中,然後獲取ID,然後將數據插入到子表中。PDO lastInsertId();問題php

以下是我正用來插入數據庫的代碼片段。這是我第一次使用PDO課程。我得到的錯誤;未定義的屬性:在非對象數據庫:: $ db上調用成員函數lastInsertId()。我必須承認我對PHP相當陌生。謝謝


{ 

    public function __construct($DB_TYPE, $DB_HOST, $DB_NAME, $DB_USER, $DB_PASS) 
    { 
     parent::__construct($DB_TYPE.':host='.$DB_HOST.';dbname='.$DB_NAME, $DB_USER, $DB_PASS); 
} 

$this->db = new database(DB_TYPE, DB_HOST, DB_NAME, DB_USER, DB_PASS); 

$this->db->insert('images', array(
     'image_userID' => $data['image_userID'], 
     'image_date' => $data['image_date'] 
    )); 

/** 
* insert 
* @param string $table A name of table to insert into 
* @param string $data An associative array 
*/ 
public function insert($table, $data) 
{ 
    $fieldNames = implode('`, `', array_keys($data)); 
    $fieldValues = ':' . implode(', :', array_keys($data)); 

    $sth = $this->prepare("INSERT INTO $table (`$fieldNames`) VALUES ($fieldValues)"); 

    foreach ($data as $key => $value) { 
     $sth->bindValue(":$key", $value); 
    } 

    $sth->execute(); 

$result= $this->db->lastInsertId(); 
return $result; 
} 

回答

6

最後插入ID來自活動語句,而不是來自數據庫句柄。所以,你的代碼的最後一行改成這樣:

$return = $sth->lastInsertId(); 
+0

非常感謝您的回覆,我得到了lastInsertID()的工作,並期待爲您談到另外兩個問題,我刪除了分號,你在哪裏就在那裏,但如果我從fieldname刪除反引號,我的函數不再插入。 – denn

+0

正如你所看到的,我刪除了綁定的一部分。看着它。至於backtick,我看到在內爆中也添加了反引號,所以查詢中的反引號都是正確的。到了一天早些時候,沒有足夠的咖啡。對不起。 – JvdBerg

+4

這個答案不正確。 lastInsertId來自PDO對象,而不是語句。 http://php.net/manual/en/pdo.lastinsertid.php – jsgoupil