2012-10-19 25 views
10

Tôi có truy vấn chèn và tôi muốn lấy ID từ bảng. Tôi đã tìm kiếm và tôi đã tìm thấy lastInsertId() cho PDO. Khi tôi muốn sử dụng nó, tôi nhận được lỗi PHP.phương thức chưa xác định PDO lastInsertId

Đây là mã của tôi:

$db = new database(); 
$naam = $db->quoteQuery($_POST['naam']); 
$barcode = $db->quoteQuery($_POST['barcode']); 
$sql = "INSERT INTO products(name, barcode) VALUES (".$name.",".$barcode.")"; 
$results = $db->executeQuery($sql); 
$lastid = $results->lastInsertId(); 

Nhưng điều này mang lại một lỗi, điều này một:

Fatal error: Call to undefined method PDOStatement::lastInsertId() in /home/onlineweuh/domains/onlinewebapps.nl/public_html/vsb/admin/add-product.class.php on line 297 

My lớp cơ sở dữ liệu:

class database 
{ 
    private $handleDB; 
    public function __construct() 
    { 
     $host = ; 
     $user = ; 
     $database = ; 
     $password = ; 
     try 
     { 
      $this->handleDB = new PDO('mysql:host='.$host.';dbname='.$database, $user, $password); 
     } 
     catch (PDOException $e) 
     { 
      print_r($e); 
     } 

     $this->handleDB->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING); 
    } 

Tôi hy vọng ai đó có thể giúp tôi giải quyết nó, tôi muốn ID được đưa ra tại truy vấn chèn.

Trả lời

21

Bạn nhận được lastinsertid từ đối tượng PDO chứ không phải đối tượng kết quả của bạn.

Hãy thử $db->lastInsertId()

chỉnh sửa bên dưới.

Lớp cơ sở dữ liệu của bạn đang đóng gói đối tượng handleDB/PDO của bạn. Vì biến handleDB là riêng tư, bạn không thể truy cập biến này bên ngoài lớp của bạn. Bạn sẽ cần phải làm cho nó công khai như vậy;

class database 
{ 
    public $handleDB; 
    public function __construct() 
    { 
     $host = 'removed'; 
     $user = 'removed'; 
     $database = 'removed'; 
     $password = 'removed'; 
     try 
     { 
      $this->handleDB = new PDO('mysql:host='.$host.';dbname='.$database, $user, $password); 
     } 
     catch (PDOException $e) 
     { 
      print_r($e); 
     } 

     $this->handleDB->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING); 
    } 

} 

Bây giờ bạn có thể gọi $db->handleDB->lastInsertId();

Hoặc bạn có thể phơi bày các handleDB->lastInsertId() như một chức năng như:

class database 
{ 
    private $handleDB; 
    public function __construct() 
    { 
     $host = 'remove'; 
     $user = 'removed'; 
     $database = 'removed'; 
     $password = 'removed'; 
     try 
     { 
      $this->handleDB = new PDO('mysql:host='.$host.';dbname='.$database, $user, $password); 
     } 
     catch (PDOException $e) 
     { 
      print_r($e); 
     } 

     $this->handleDB->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING); 
    } 

    public function lastInsertId(){ 
     return $this->handleDB->lastInsertId(); 
    } 

} 

Bạn sẽ gọi sử dụng $db->lastInsertId();

+0

Sau đó, tôi nhận được lỗi: Gọi tới cơ sở dữ liệu phương thức không xác định :: lastInsertId() – Marnix

+0

Tôi đã cập nhật câu hỏi này cho bạn. –

+0

Tuyệt vời của bạn, cảm ơn bạn rất nhiều. – Marnix

11

lastInsertId là phương thức PDO, không phải PDOStatement. Do đó:

$db->lastInsertId(); 
+0

Sau đó, tôi nhận được lỗi: Gọi tới cơ sở dữ liệu phương thức chưa xác định :: lastInsertId() – Marnix

+0

Có 'cơ sở dữ liệu' mở rộng' PDO' không? Bạn đang sử dụng phiên bản PHP nào? – deceze

+0

Phiên bản PHP của tôi là: 5.2.12. Tôi đã đặt lớp cơ sở dữ liệu PHP của tôi trong bài viết bắt đầu. – Marnix

0

lớp cơ sở dữ liệu của bạn cần phải được một lớp con của PDO bằng cách mở rộng PDO

class database extends PDO 

theo cách đó, tất cả các phương thức trong PDO đều có sẵn cho lớp con của bạn.

Các vấn đề liên quan